- A+
今天复习三种移动,第一种直接的就是Translate了,新建一个场景,并把场景和主角构建成这样子
一、Translate的方式
Plane是地面,Capsule就是主角了,头上的小帽子就是前进的方向,对Capsule添加脚本TranslateMove.cs,代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using UnityEngine; public class TransLateMove : MonoBehaviour { private float _speed = 3.0f; void Update() { float h = Input.GetAxis("Horizontal"); float v = Input.GetAxis("Vertical"); if (Mathf.Abs(h) > 0 || Mathf.Abs(v) > 0) { //这样会有一个转弯的效果 Vector3 tween = Vector3.Lerp(transform.position + transform.forward, transform.position + new Vector3(h, 0, v), Time.deltaTime * 20); transform.LookAt(tween); transform.Translate(Vector3.forward * _speed * Time.deltaTime); } } } |
运行,我们主角可以移动了,float h = Input.GetAxis("Horizontal");,float v = Input.GetAxis("Vertical");。这两个是获取方向键的输入,h,v会以-1,0,1代表是否按下和方向
二、CharacterController
接下来,移除脚本TranslateMove.cs,添加ChaControllerMove.cs,自动添加CharacterController组件,来看看第二种CharacterController的移动方法,代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using UnityEngine; [RequireComponent(typeof(CharacterController))] public class CCMove : MonoBehaviour { private CharacterController _characterController; private float _speed = 3.0f; void Start () { _characterController = this.GetComponent<CharacterController>(); } void Update () { float h = Input.GetAxis("Horizontal"); float v = Input.GetAxis("Vertical"); if (Mathf.Abs(h) > 0 || Mathf.Abs(v) > 0) { Vector3 tween = Vector3.Lerp(transform.position + transform.forward, transform.position + new Vector3(h, 0, v), Time.deltaTime * 20); transform.LookAt(tween); _characterController.SimpleMove(transform.forward * _speed); } } } |
代码都差不多,这里用了角色控制器,在Start方法中先取得CharacterController组件,然后获取输入,调用SimpleMove方法。
有一点奇怪的是这里用的是transform.forward,就是指角色自身向前的方向,而Translate方法中用的是Vector3.forward,也就是(0,0,1),为什么两个不同。我尝试过调换它们,控制起来就会不正常。我仔细的y研究了下,发现Translate方法针对的是局部坐标,所以只需要提供一个自身的朝向vector3.forward。而SimpleMove方法针对的是世界坐标,所以要提供一个自身在世界朝向transform.forward。
三、Rigidbody
接着,到第三种移动,就是通过刚体组件进行移动,移除第二种添加的脚本跟组件,添加刚体组件Rigidbody,脚本RigidbodyMove.cs,代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using UnityEngine; [RequireComponent(typeof(Rigidbody))] public class RigidbodyMove : MonoBehaviour { private Rigidbody _rigidbody; private float _speed = 30f; void Start () { _rigidbody = this.GetComponent<Rigidbody>(); } void Update () { float h = Input.GetAxis("Horizontal"); float v = Input.GetAxis("Vertical"); if (Mathf.Abs(h) > 0 || Mathf.Abs(v) > 0) { Vector3 tween = Vector3.Lerp(transform.position + transform.forward, transform.position + new Vector3(h, 0, v), Time.deltaTime * 20f); transform.LookAt(tween); _rigidbody.velocity = transform.forward * _speed; } else { _rigidbody.Sleep(); } } } |
代码都大同小异,不同的就是,_rigidbody.velocity = transform.forward*_speed; 给刚体附一个带方向的速度。