当前位置: 首页 > news >正文

Unity3D控制人物移动的多种方法

系列文章目录

unity知识点


文章目录

  • 系列文章目录
  • 前言
  • 一、人物移动之键盘移动
    • 1-1、代码如下
    • 1-2、效果
  • 二、人物移动之跟随鼠标点击移动
    • 2-1、代码如下
    • 2-2、效果
  • 三、人物移动之刚体移动
    • 3-1、代码如下
    • 3-2、效果
  • 四、人物移动之第一人称控制器移动
    • 4-1、代码如下
    • 4-2、效果
  • 五、Android触摸手势操作脚本(单指 双指 三指)
    • 5-1、代码如下
  • 总结


大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

前言

人物移动代码综合记录一下(因为有很多种).所以简单记录一下


在这里插入图片描述

一、人物移动之键盘移动

所谓键盘移动就是我们常玩游戏的操作 wasd来进行移动

1-1、代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerToKeyPad : MonoBehaviour
{public GameObject Player;public float m_speed = 5f;void Update(){//键盘控制移动 两种方法PlayerMove_KeyPad_1();PlayerMove_KeyPad_2();}//通过Transform组件 键盘控制移动public void PlayerMove_KeyPad_1(){if (Input.GetKey(KeyCode.W) | Input.GetKey(KeyCode.UpArrow)) //前{Player.transform.Translate(Vector3.forward * m_speed * Time.deltaTime);}if (Input.GetKey(KeyCode.S) | Input.GetKey(KeyCode.DownArrow)) //后{Player.transform.Translate(Vector3.forward * -m_speed * Time.deltaTime);}if (Input.GetKey(KeyCode.A) | Input.GetKey(KeyCode.LeftArrow)) //左{Player.transform.Translate(Vector3.right * -m_speed * Time.deltaTime);}if (Input.GetKey(KeyCode.D) | Input.GetKey(KeyCode.RightArrow)) //右{Player.transform.Translate(Vector3.right * m_speed * Time.deltaTime);}}public void PlayerMove_KeyPad_2(){float horizontal = Input.GetAxis("Horizontal"); //A D 左右float vertical = Input.GetAxis("Vertical"); //W S 上 下Player.transform.Translate(Vector3.forward * vertical * m_speed * Time.deltaTime);//W S 上 下Player.transform.Translate(Vector3.right * horizontal * m_speed * Time.deltaTime);//A D 左右}
}

1-2、效果

人物移动之键盘控制效果

二、人物移动之跟随鼠标点击移动

2-1、代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerToMouse : MonoBehaviour
{public GameObject Player;Vector3 tempPoint = new Vector3(0, 0, 0);void Update(){PlayerMove_FollowMouse();}//角色移动到鼠标点击的位置public void PlayerMove_FollowMouse(){//右键点击if (Input.GetMouseButtonDown(1)){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hitInfo;if (Physics.Raycast(ray, out hitInfo)){tempPoint = new Vector3 ( hitInfo.point.x, hitInfo.point.y+0.5f, hitInfo.point.z);}}float step = 10 * Time.deltaTime;Player.transform.localPosition = Vector3.MoveTowards(Player.transform.localPosition, tempPoint, step);Player.transform.LookAt(tempPoint);}
}

2-2、效果

人物移动之跟随鼠标点击移动

三、人物移动之刚体移动

里面包含两个方法一个是:Velocity移动 一个是:AddForce移动

3-1、代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerToRigidbody : MonoBehaviour
{public GameObject Player;public float m_speed = 5f;void Update(){//PlayerMove_KeyRighidbody1();PlayerMove_KeyRighidbody2();}//通过Rigidbody组件 键盘控制移动 Velocity移动 角色身上需要挂载Rigidbody组件public void PlayerMove_KeyRighidbody1(){float horizontal = Input.GetAxis("Horizontal"); //A D 左右float vertical = Input.GetAxis("Vertical"); //W S 上 下//这个必须分开判断 因为一个物体的速度只有一个if (Input.GetKey(KeyCode.W) | Input.GetKey(KeyCode.S)){Player.GetComponent<Rigidbody>().velocity = Vector3.forward * vertical * m_speed;}if (Input.GetKey(KeyCode.A) | Input.GetKey(KeyCode.D)){Player.GetComponent<Rigidbody>().velocity = Vector3.right * horizontal * m_speed;}}//通过Rigidbody组件 键盘控制移动 AddForce移动 角色身上需要挂载Rigidbody组件public void PlayerMove_KeyRighidbody2(){float horizontal = Input.GetAxis("Horizontal"); //A D 左右float vertical = Input.GetAxis("Vertical"); //W S 上 下Player.GetComponent<Rigidbody>().AddForce(Vector3.forward * vertical * m_speed);Player.GetComponent<Rigidbody>().AddForce(Vector3.right * horizontal * m_speed);}}

3-2、效果

人物移动之刚体移动

人物移动之刚体添加力移动

四、人物移动之第一人称控制器移动

里面包含两个方法一个是:SimpleMove控制移动 一个是:Move控制移动

4-1、代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerToCharacterController : MonoBehaviour
{public GameObject Player;public float m_speed = 5f;void Update(){//PlayerMove_KeyCharacterController1();PlayerMove_KeyCharacterController2();}//通过CharacterController组件 键盘移动物体 SimpleMove控制移动public void PlayerMove_KeyCharacterController1(){float horizontal = Input.GetAxis("Horizontal"); //A D 左右float vertical = Input.GetAxis("Vertical"); //W S 上 下if (horizontal !=0&&vertical ==0){Player.GetComponent<CharacterController>().SimpleMove(transform.right * horizontal * m_speed);}else if (horizontal == 0 && vertical != 0){Player.GetComponent<CharacterController>().SimpleMove(transform.forward * vertical * m_speed);}else{//斜着走 例如w a一起按Player.GetComponent<CharacterController>().SimpleMove(transform.forward * vertical * m_speed);Player.GetComponent<CharacterController>().SimpleMove(transform.right * horizontal * m_speed);}}//通过CharacterController组件 键盘移动物体 Move控制移动public void PlayerMove_KeyCharacterController2(){float horizontal = Input.GetAxis("Horizontal"); //A D 左右float vertical = Input.GetAxis("Vertical"); //W S 上 下float moveY = 0;float m_gravity = 10f;moveY -= m_gravity * Time.deltaTime;//重力Player.GetComponent<CharacterController>().Move(new Vector3(horizontal, moveY, vertical) * m_speed * Time.deltaTime);}}

4-2、效果

人物移动之第一人称控制器移动

五、Android触摸手势操作脚本(单指 双指 三指)

相机设置如下
在这里插入图片描述
单指移动,双指缩放 , 三指旋转
移动和旋转动的是Pivot 缩放动的是Main Camera的Z轴距离

5-1、代码如下

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class TouchMove : MonoBehaviour
{public Camera cameraMainTrans;public Transform rotTransform;private float zoomSpeed = 0.1f;private float rotateSpeed = 0.5f;private float moveSpeed = 0.1f;private Vector2 prevPos1, prevPos2,prevPos3;private float prevDistance;void Update(){// 处理单指触摸平移if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved){Vector2 touchDeltaPosition = Input.GetTouch(0).deltaPosition;float tranY = touchDeltaPosition.y * (float)Math.Sin(Math.Round(this.transform.localRotation.eulerAngles.x, 2) * Math.PI / 180.0);float tranZ = touchDeltaPosition.y * (float)Math.Cos(Math.Round(this.transform.localRotation.eulerAngles.x, 2) * Math.PI / 180.0);rotTransform.Translate(new Vector3(touchDeltaPosition.x, tranY, tranZ) * moveSpeed, Space.Self);Debug.Log(touchDeltaPosition.x + "单指横向+纵向+" + touchDeltaPosition.y);}// 处理双指触摸缩放if (Input.touchCount == 2){Touch touch1 = Input.GetTouch(0);Touch touch2 = Input.GetTouch(1);// 获取距离和位置的差异Vector2 curPos1 = touch1.position;Vector2 curPos2 = touch2.position;float curDistance = Vector2.Distance(curPos1, curPos2);if (touch2.phase == TouchPhase.Began){prevPos1 = curPos1;prevPos2 = curPos2;prevDistance = curDistance;}// 缩放摄像机float deltaDistance = curDistance - prevDistance;cameraMainTrans.transform.Translate(Vector3.back * -deltaDistance * 0.1f);// 更新变量prevPos1 = curPos1;prevPos2 = curPos2;prevDistance = curDistance;}// 处理三指触摸旋转if (Input.touchCount == 3){Touch touch1 = Input.GetTouch(0);Touch touch2 = Input.GetTouch(1);Touch touch3 = Input.GetTouch(2);// 获取触摸位置的差异Vector2 curPos1 = touch1.position;Vector2 curPos2 = touch2.position;Vector2 curPos3 = touch3.position;Vector2 deltaPos1 = curPos1 - prevPos1;Vector2 deltaPos2 = curPos2 - prevPos2;Vector2 deltaPos3 = curPos3 - prevPos3;if (touch2.phase == TouchPhase.Moved){// 计算横向旋转float horizontalRotation = deltaPos1.x * rotateSpeed;rotTransform.Rotate(Vector3.up, horizontalRotation);// 计算纵向旋转float verticalRotation = -deltaPos1.y * rotateSpeed;Vector3 verticalRotationAxis = rotTransform.TransformVector(Vector3.left);rotTransform.RotateAround(rotTransform.position, verticalRotationAxis, verticalRotation);}// 更新变量prevPos1 = curPos1;prevPos2 = curPos2;prevPos3 = curPos3;}else if (Input.touchCount == 0){// 清除前一帧的触摸位置prevPos1 = Vector2.zero;prevPos2 = Vector2.zero;prevPos3 = Vector2.zero;}}private static float ClampAngle(float angle, float min, float max){if (angle < -360)angle += 360;if (angle > 360)angle -= 360;return Mathf.Clamp(angle, min, max);}
}

总结

不定时更新Unity开发技巧,觉得有用记得一键三连哦。
防止后面忘记,所以记录一下

相关文章:

Unity3D控制人物移动的多种方法

系列文章目录 unity知识点 文章目录 系列文章目录前言一、人物移动之键盘移动1-1、代码如下1-2、效果 二、人物移动之跟随鼠标点击移动2-1、代码如下2-2、效果 三、人物移动之刚体移动3-1、代码如下3-2、效果 四、人物移动之第一人称控制器移动4-1、代码如下4-2、效果 五、And…...

无人机打击激光器

激光器的应用非常广泛&#xff0c;涵盖了多个领域。以下是一些主要的激光器应用&#xff1a; 医疗领域&#xff1a;激光器在医疗行业中有着重要应用&#xff0c;比如用于激光手术&#xff08;如眼科手术&#xff09;、皮肤治疗、牙科治疗、肿瘤治疗等。 工业制造&#xff1a;在…...

Lingo数学建模基础

1.基本运算符 1.1算数运算符 1.2逻辑运算 #not# 否定操作数的逻辑值&#xff0c;一元运算符 #eq# 若两运算数相等&#xff0c;则为true,否则为false #ne# 若两运算数不相等&#xff0c;则为true,否则为false #gt# 若左边运算数严格大于右边&#xff0c;则为true,否则为…...

finalshell连接linux的kali系统

kali的ssh服务似乎是默认关闭的&#xff0c;笔者在玩CentOS系统时可以直接用finalshell完成连接&#xff0c;但kali不行&#xff0c;需要先手动开启ssh服务。 开启kali的ssh服务 输入【ssh start】命令开启ssh服务&#xff0c;可以用【ssh status】命令查看ssh状态&#xff0c…...

2、Line Charts折线图

可视化时间趋势 现在你已经熟悉了编码环境,是时候学习如何制作自己的图表了! 在本教程中,您将学习足够的Python来创建专业外观的折线图。然后,在接下来的练习中,您将使用您的最新技能处理真实世界的数据集。 本课程数据集夸克网盘下载链接:https://pan.quark.cn/s/a235ac…...

shell脚本获得所有数据库备份(整库备份,表级备份)

数据库备份到天翼云对象存储OBS https://blog.csdn.net/qq_34631220/article/details/135755894 1、获得所有数据库 #!/bin/sh HOSTNAME"ip" #数据库信息 PORT"3306" USERNAME"root" PASSWORD"" DBNAME"yusuan" #数据库…...

REVIT二次开发万能刷

将这两个参数赋予其他参数 步骤2 将来做个可以调控的版本 using System; using System.Collections.Generic; using System.Lin...

JSON简单了解

文章目录 1、JSON介绍2、ES6模版字符串3、JS对象转化为JSON字符串3.1、手动JS对象转化为JSON字符串3.2、自动JS对象转化为JSON字符串 4、JS对象和java互相转换 1、JSON介绍 JSON 概念&#xff1a;JavaScript Object Notation。JavaScript 对象表示法&#xff0c;简单理解JSON是…...

HarmonyOS鸿蒙应用开发( 四、重磅组件List列表组件使用详解)

List列表组件&#xff0c;是一个非常常用的组件。可以说在一个应用中&#xff0c;它的身影无处不在。它包含一系列相同宽度的列表项&#xff0c;适合连续、多行呈现同类数据&#xff0c;如商品列表、图片列表和和文本列表等。ArkUI 框架采用 List 容器组件创建列表&#xff08;…...

redis优化系列(六)

本期分享redis内存过期策略&#xff1a;过期key的处理 Redis之所以性能强&#xff0c;最主要的原因就是基于内存存储。然而单节点的Redis其内存大小不宜过大&#xff0c;会影响持久化或主从同步性能。 可以通过修改配置文件来设置Redis的最大内存&#xff1a; maxmemory 1gb …...

【 Qt 快速上手】-②- Qt 环境搭建

文章目录 1. Qt 开发工具概述1.1 Qt Creator 介绍1.2 Visual Studio 介绍1.3 Eclipse 介绍 2. Qt SDK 的下载与安装2.1 Qt SDK 的下载2.2 Qt SDK 的安装2.3 验证 Qt SDK 安装是否成功2.4 Qt 环境变量配置 1. Qt 开发工具概述 Qt 开发环境需要安装三个部分&#xff1a; C编译器…...

Java入门高频考查基础知识4(字节跳动面试题18题2.5万字参考答案)

Java 是一种广泛使用的面向对象编程语言&#xff0c;在软件开发领域有着重要的地位。Java 提供了丰富的库和强大的特性&#xff0c;适用于多种应用场景&#xff0c;包括企业应用、移动应用、嵌入式系统等。 以下是几个面试技巧&#xff1a; 1. 复习核心概念&#xff1a;回顾 Ja…...

视觉空间效应

一、视觉空间效应 概况 视觉空间效应&#xff0c;是人类视觉系统&#xff08;Human Visual System&#xff0c;HVS&#xff09;的一个特点&#xff0c;也称为"视觉距离效应"。即距离观察者更近的目标像素对颜色感知产生更强烈的影响&#xff0c;而距离较远的目标像素…...

C#,入门教程(07)——软件项目的源文件与目录结构

上一篇&#xff1a; C#&#xff0c;入门教程(06)——解决方案资源管理器&#xff0c;代码文件与文件夹的管理工具https://blog.csdn.net/beijinghorn/article/details/124895033 创建新的 C# 项目后&#xff0c; Visual Studio 会自动创建一系列的目录与文件。 程序员后面的工…...

三国游戏(第十四届蓝桥杯)

题目 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵 X,Y,Z&#xff08;一开始可以认为都为 0&#xff09;。 游戏有 n个可能会发生的事件&#xff0c;每个事件之间相互独立且最多只会发生一次&#xff0c;当第 i个事件发生时会分别让 X,Y,Z 增加 A i , B…...

k8s---包管理器helm

内容预知 目录 内容预知 helm相关知识 Helm的简介与了解 helm的三个重要概念 helm的安装和使用 将软件包拖入master01上 使用 helm 安装 Chart 对chart的基本使用 查看chart信息 安装chart 对chart的基本管理 helm自定义模板 在镜像仓库中拉取chart&#xff0c;查…...

对于超低延迟SSD,IO调度器已经过时了吗?-part2

为了进行这项研究&#xff0c;他们设计了一套严谨的实验方法论&#xff0c;包括在配备了高速Intel Optane P4801X Series NVMe SSD的服务器上执行一系列微观和宏观基准测试&#xff0c;同时监测系统能耗情况。这些测试涵盖了多种工作负载场景&#xff0c;从单一进程提交大量请求…...

【C++】list的使用

目录 1 构造1.1 无参构造1.2 构造的list中包含n个值为val的元素1.3 用[first, last)区间中的元素构造list1.4 拷贝构造 2 迭代器的使用2.1 begin end2.2 rbegin rend 3 容量操作3.1 empty size 4 获取元素4.1 front back 5 插入、删除、修改5.1 头插-push_front和尾插-push…...

mybatis的缓存机制

视频教程_免费高速下载|百度网盘-分享无限制 (baidu.com) MyBatis 有一套灵活而强大的缓存机制&#xff0c;主要分为两级缓存&#xff1a;一级缓存&#xff08;本地缓存&#xff09;和二级缓存&#xff08;全局缓存&#xff09;。 一级缓存&#xff08;本地缓存&#xff09;&a…...

ChatGLM3报错:No chat template is defined for this tokenizer

使用官方提供的脚本创建ChatGLM3的DEMO&#xff1a; cd basic_demo python web_demo_gradio.py 出现效果异常问题&#xff1a; conversation [{role: user, content: 你好}, {role: assistant, content: 你好&#xff0c;有什么我可以帮助你的吗&#xff1f;\n\n<|im_end|…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用

前言&#xff1a;我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM&#xff08;Java Virtual Machine&#xff09;让"一次编写&#xff0c;到处运行"成为可能。这个软件层面的虚拟化让我着迷&#xff0c;但直到后来接触VMware和Doc…...