Unity角色移动
闲谈
本帖子旨在解决一些教学视频中角色移动方法过于单一(仅支持WASD和上下左右键)的问题。欢迎新手参与交流,若有疑问可随时提问,谢绝无端炫耀的“大神”。
一、刚体(Rigidbody)移动
AddForce函数
1. 基本使用
- 获取组件:在代码中获取刚体组件,示例代码如下:
// 声明公共的刚体组件变量 public Rigidbody Rb; void Start() { // 获取当前对象的刚体组件 Rb = GetComponent<Rigidbody>(); } - 添加力:使用
AddForce方法给刚体施加一个力,实现角色移动,代码如下:// 假设speed是移动速度,可在Inspector面板中设置 public float speed = 5f; void Update() { // 根据水平和垂直输入计算力的向量 Vector3 force = new Vector3(Input.GetAxis("Horizontal") * speed, 0f, Input.GetAxis("Vertical") * speed); // 给刚体添加力 Rb.AddForce(force); } - 相机跟随及旋转:创建
FollowPlayer脚本,实现相机跟随玩家并可旋转视角。using UnityEngine;
public class FollowPlayer : MonoBehaviour { public GameObject player; void Update() { // 使相机位置与玩家位置保持一致 this.transform.position = player.transform.position; // 通过旋转相机来改变视角 this.transform.Rotate(0, Input.GetAxis("Rotate"), 0); } }
将上述脚本挂载到相机对象上。
#### 2. 相机与玩家保持相对距离
上述`FollowPlayer`脚本已经实现了相机与玩家保持相对位置,同时可以通过旋转相机来改变视角。这里的`Rotate`是自定义输入,类似于`Horizontal`输入轴,具体设置可在Unity的输入管理器中进行配置。
#### 3. 旋转之后的前后左右移动
创建一个移动方法`Move`,并在`Update`方法中调用,实现旋转后角色的前后左右移动,脚本挂载在Player对象上。
using UnityEngine;
public class PlayerMovement : MonoBehaviour { public float speed = 5f; public GameObject _Camera; private Transform _CameraTransform;
void Start()
{
_CameraTransform = _Camera.GetComponent
void Update() { Move(); }
public void Move()
{
Rigidbody arrRigidbody = GetComponent
`Transform.forward`是一个简易版的移动函数,只能准确地向前后移动,它有助于理解旋转后移动的原理。
## 二、角色控制器(CharacterController)移动
### SimpleMove函数
#### 1. 基本使用
- **获取组件**:在代码中获取角色控制器组件,示例代码如下:
// 声明公共的角色控制器组件变量
public CharacterController CC;
void Start()
{
// 获取当前对象的角色控制器组件
CC = GetComponent
- **移动角色**:使用`SimpleMove`方法实现角色移动,代码如下:
// 假设speed是移动速度,可在Inspector面板中设置 public float speed = 5f; void Update() { // 根据水平和垂直输入计算移动向量 Vector3 moveDirection = new Vector3(Input.GetAxis("Horizontal") speed, 0f, Input.GetAxis("Vertical") speed); // 使用角色控制器进行移动 CC.SimpleMove(moveDirection); }
#### 2. 旋转
将相机和角色模型作为子对象放置在Player对象下,这样旋转Player对象时,相机和角色模型会一起旋转。
#### 3. 旋转语句
在脚本中添加旋转代码,实现角色的旋转,代码如下:
void Update() { // 绕Y轴旋转角色 transform.Rotate(new Vector3(0, Input.GetAxis("Rotate") 60 Time.deltaTime, 0)); }
这里的`Rotate`是自定义输入,类似于`Horizontal`输入轴,具体设置可在Unity的输入管理器中进行配置。
#### 4. 旋转之后的前后左右移动
创建一个移动方法`Move`,并在`Update`方法中调用,实现旋转后角色的前后左右移动。
using UnityEngine;
public class CharacterMove : MonoBehaviour { public float speed = 5f; public GameObject arrplayer; public CharacterController controlle;
void Start()
{
controlle = GetComponent
void Update() { Move(); }
public void Move() { Vector3 force = new Vector3(Input.GetAxis("Horizontal") speed, 0f, Input.GetAxis("Vertical") speed); float x = arrplayer.transform.localRotation.eulerAngles.x; float y = arrplayer.transform.localRotation.eulerAngles.y; float z = arrplayer.transform.localRotation.eulerAngles.z; // 根据角色的旋转角度来调整移动方向 force = Quaternion.Euler(x, y, z) * force; // 使用角色控制器进行移动 controlle.SimpleMove(force); } }
#### 5. 关于Quaternion和localRotation.eulerAngles
`Quaternion`是Unity中用于表示旋转的类,`localRotation.eulerAngles`是获取局部旋转的欧拉角。如果对这些概念不太理解,建议查阅Unity的官方API文档,通过输出这些值进行调试和理解。
由于一些截图没有留存备份,这里做了一个总览图,可对照查看(结构都一样)。
**作者**:缈狐灵
**原文链接**:[http://www.taidous.com/bbs/thread-34114-1-1.html](http://www.taidous.com/bbs/thread-34114-1-1.html)