Unity角色移动

2015年10月20日 11:30 0 点赞 0 评论 更新于 2025-11-21 13:33

闲谈

本帖子旨在解决一些教学视频中角色移动方法过于单一(仅支持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(); Vector3 force = new Vector3(Input.GetAxis("Horizontal") speed, 0, Input.GetAxis("Vertical") speed); float x = _CameraTransform.rotation.eulerAngles.x; float y = _CameraTransform.rotation.eulerAngles.y; float z = _CameraTransform.rotation.eulerAngles.z; // 根据相机的旋转角度来调整力的方向 force = Quaternion.Euler(x, y, z) * force; arrRigidbody.AddForce(force); } }

`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)

作者信息

洞悉

洞悉

共发布了 3994 篇文章