当前位置:   article > 正文

[Unity基础]让物体朝摄像机观察方向移动(一)_unity物体朝向摄像机方向

unity物体朝向摄像机方向

情景一:假设有一个人,他面对北方,他背后有一台摄像机,正巧也是面对北方。现在,他向左转90度,面对西方。此时如果让他向前走,那么有两种情况。


情况一:以自身坐标系向前走。他将会向眼睛直视的方向走,实际上他是向西方走,摄像机看到他是向"右"滴。

情况二:以世界坐标系向前走。他将会向北方走,摄像机看到他是向"前"滴。

由此可见,如果物体旋转了的话,那么以自身坐标系进行移动往往会发生错误,所以在游戏中角色的移动一般都是以世界坐标系进行移动滴。以世界坐标系进行移动的话,是不考虑物体自身的旋转的。

所以在角色移动的代码中经常会发现:

Transform.TransformDirection
从自身坐标到世界坐标变换方向。
Transform.forward
在世界空间坐标变换的蓝色轴。也就是z轴。

其中transform.TransformDirection(new Vector3(0, 0, 1));的简写方式是transform.forward;


情景二:假设有一个人,他面对北方,他左手边有一台摄像机。

此时如果他以世界坐标系向前走。他将会向北方走,摄像机看到他是向"左"的。这样是错误的,想让角色向前走的话,角色就要向东方进行移动。可见,此时的"前"是从摄像机的角度上来讲的,所以就要考虑到摄像机的旋转角度。

我们的目标是,让角色"沿摄像机角度方向,前进",从代码角度上来说,就是:Quaternion*Vector3,好了,直接给出我们的代码!


  1. using UnityEngine;
  2. using System.Collections;
  3. public class PlayerControl : MonoBehaviour {
  4. public float moveSpeed = 2f;
  5. public float rotateSpeed = 2f;
  6. void Update ()
  7. {
  8. float h = Input.GetAxis("Horizontal");
  9. float v = Input.GetAxis("Vertical");
  10. if (h != 0 || v != 0)
  11. {
  12. Vector3 targetDirection = new Vector3(h, 0, v);
  13. float y = Camera.main.transform.rotation.eulerAngles.y;
  14. targetDirection = Quaternion.Euler(0, y, 0) * targetDirection;
  15. transform.Translate(targetDirection * Time.deltaTime * moveSpeed,Space.World);
  16. }
  17. if (Input.GetKey(KeyCode.J))
  18. {
  19. transform.Rotate(-Vector3.up * Time.deltaTime * rotateSpeed);
  20. }
  21. }
  22. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/108815
推荐阅读
相关标签
  

闽ICP备14008679号