Notifications
Article
记录一个RPG人物移动和摄像头跟随的方法
Updated 9 months ago
273
0
RPG人物移动和摄像头跟随
  • 首先摄像机挂在一个空对象下,空对象位置与角色重合,摄像机调整到合适的观看角度,我将空对象称为摄像机架。
  • 这样我们在需要旋转视角的时候,旋转的就是摄像机架而不是摄像机本身,以保证角色永远在视野中。
public float _speed;//角色移动速度 public float _rotateSpeed;//角色转身速度 public float _cameraSpeed;//摄像机跟随速度 private float _y; private EasyJoystick _joystick; private Transform _cameraRack; private CharacterController _ctrl; void Awake(){ _cameraRack = Camera.main.GetComponentInParent<Transform>(); _ctrl = this.GetComponent<CharacterController>(); } void Start(){ float _g = -Physics.gravity.y; _y -= _g * Time.deltaTime;//模拟重力影响 } void Update(){ //手柄x轴位移 float _h = this._joystick.JoystickTouch.x; //手柄y轴位移 float _v = this._joystick.JoystickTouch.y; //移动速度 float _s = _speed * Time.deltaTime; //手柄位置相对弧度 float _r = Mathf.Atan2(_v, _h); //摄像机架旋转弧度 float _cameraR = _cameraRack.eulerAngles.y / Mathf.Rad2Deg; //计算单位时间x轴位移 float _sx = _s * Mathf.Cos(_r - cameraR); //计算单位时间z轴位移 float _sz = _s * Mathf.Sin(_r - cameraR); //获取方向 Vector3 _dir = new Vector3(_sx, 0, _sz); //将方向转换为四元数 Quaternion _quaDir = Quaternion.LookRotation(_dir, Vector3.up); //角色缓慢转动 this.transform.rotation = Quaternion.Lerp(this.transform.rotation, _quaDir, Time.deltaTime * _rotateSpeed); //角色移动 this._ctrl.Move(new Vector3(_sx, _y, _sz)); //摄像机架跟随 _cameraRack.position = Vector3.Lerp(_cameraRack.position,this.transform.position,_cameraSpeed * Time.deltaTime); }
本人还在学习中,第一次写文章,如果看到这篇的您觉得哪里有问题,请务必留言,谢谢~

迷彩大兵
软件开发工程师 - Programmer
2
Comments