当前位置:   article > 正文

Unity3D 的LookAt() 与 LookRotation()方法的比较_unity lookat

unity lookat

LookAt(),定义: 其定义在UnityEngine.Transform类中,

public void LookAt(Vector3 worldPosition);

public void LookAt(Transform target);

用法: 一:transform.LookAt(new Vector3(1,1,1));

使游戏对象看向该坐标点(游戏对象的z轴指向(1,1,1));

二:transform.LookAt(gameobject.transform)

使游戏对象看向gameobject的transform的position;

在场景中创建cube与Sphere两个游戏对象,将脚本挂载到Cube上;

  1. using UnityEngine;
  2. public class Test : MonoBehaviour {
  3. private Transform other;//Sphere游戏对象
  4. void Awake()
  5. {
  6. //找到Sphere游戏对象
  7. other = transform.Find("/Sphere").GetComponent<Transform>();
  8. }
  9. void Start()
  10. {
  11. //Cube的z轴指向(1,1,1)点
  12. // transform.LookAt(new Vector3(1, 1, 1));
  13. }
  14. void Update()
  15. {
  16. //画线调试,由Cube的postion指向Sphere的postion
  17. Debug.DrawLine(transform.position,other.position,Color.cyan);
  18. //Cube的z轴指向Sphere,(指向了Sphere游戏对象的Transform组件的position值,也是一个Vector3类型的值)
  19. transform.LookAt(other);
  20. }
  21. }

运行结果:

Cube(蓝色箭头为Cube的z轴)指向了Sphere的中心;

#运行过程中的有趣发现#

为Cube添加了Rigidbody组件后,运行时Cube在不停摆动,且z轴一直指向Sphere的中心。其原因应为将LookAt()方法放于Update()方法中,使其每一帧都指向Sphere,并且Cube并没有贴合地面,在重力作用下往下掉的同时由于LookAt每一帧都在修复其指向,从而出现这种情况;


LookRotation() 定义: 其为定义在UnityEngine.Quaternion中的静态方法,

public static Quaternion LookRotation(Vector3 forward);

用法: Quaternion.LookRotation(new Vector3(1,1,1));

获取一个向量所表示的方向(将一个向量转为该向量所对应的方向);

使游戏对象面向(1,1,1)这个向量

在场景中创建一个cube_1与Sphere,将脚本挂在cube_1上

  1. using UnityEngine;
  2. public class LookRotation : MonoBehaviour {
  3. private Transform other;//Sphere游戏对象
  4. void Awake()
  5. {
  6. //找到Sphere游戏对象
  7. other = transform.Find("/Sphere").GetComponent<Transform>();
  8. }
  9. void Start()
  10. {
  11. //将Cube_1的z轴指向坐标原点(Vector.zero)到 Vector3(2,2,2)所对应的向量方向
  12. transform.rotation = Quaternion.LookRotation(new Vector3(2, 2, 2));
  13. //将Cube_1的z轴指向原点到other.position对应向量的方向
  14. transform.rotation = Quaternion.LookRotation(other.position);
  15. }
  16. void Update()
  17. {
  18. //画线调试,画出从Cube_1到Sphere的线段
  19. Debug.DrawLine(transform.position, other.position,Color.blue);
  20. //画线调试,画出坐标原点到Sphere的射线在cube_1上的表现,即画出向量方向
  21. Debug.DrawRay(transform.position, other.position,Color.red);
  22. Move();
  23. }
  24. void Move()
  25. {
  26. float horizontal = Input.GetAxis("Horizontal");//获取水平偏移量(x轴)
  27. float vertical = Input.GetAxis("Vertical"); //获取垂直偏移量(z轴)
  28. //将水平偏移量与垂直偏移量组合为一个方向向量
  29. Vector3 direction = new Vector3(horizontal, 0, vertical);
  30. //判断是否有水平偏移量与垂直偏移量产生
  31. if (direction != Vector3.zero)
  32. {
  33. //将游戏对象的z轴转向对应的方向向量
  34. // transform.rotation = Quaternion.LookRotation(direction);
  35. //对上一行代码进行插值运算则可以将转向表现得较平滑
  36. transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(direction), 0.3f);
  37. //将游戏对象进行移动变换方法则可以实现简单的物体移动
  38. transform.Translate(Vector3.forward * 5 * Time.deltaTime);
  39. }
  40. }
  41. }
运行结果:


cube_1的z轴与红色这条射线重合,而并非指向sphere(并未与蓝色射线重合);

用LookRotation()可以实现游戏对象转向;参考上面的Move()方法;

小结:

LookAt()与LookRotation()的参数都相似,但前者是将游戏对象的z轴指向参数所表示的那个点,而后者是将游戏对象的z轴指向参数所表示的向量的方向;

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

闽ICP备14008679号