当前位置:   article > 正文

第十四章 Unity 移动和旋转(下)_transform.rotatearound和transform.lookat设置一个实验

transform.rotatearound和transform.lookat设置一个实验

本章节我们介绍另外两种形式的旋转,也对应了两个方法。首先是RotateAround方法,他是围绕穿过世界坐标中的 point 点的 axis轴旋转 angle 度。这个方法虽然比较晦涩难懂,但是我们使用一个案例,大家就非常明白了。我们创建一个新的“SampleScene5”场景,然后创建一个“Cube”游戏对象和“CubeRotate.cs”脚本,并附加两者在一起。接下来,我们将“Cube”放置到世界坐标系的(-5,0,0)位置,然后我们创建一个“Sphere”球体并放置在世界坐标系原点(0,0,0)位置。

最后,为了能够观察“Cube”的旋转,我们还需要移动和旋转摄像机,让其在世界坐标系的原点正上方向下俯视整个场景,参数设置入下:

 

接下来,我们保持相机选中状态,我们点击菜单栏“GameObject”->“Align View to Selected”

接下来,我们添加“CubeTransformTest2”脚本中的代码

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class CubeRotate : MonoBehaviour
  5. {
  6. // Update is called once per frame
  7. void Update()
  8. {
  9. Vector3 point = new Vector3(0, 0, 0);
  10. Vector3 axis = new Vector3(0, 1, 0);
  11. transform.RotateAround(point, axis, 10 * Time.deltaTime);
  12. }
  13. }

稍微解释一下,point就是世界坐标系原点,也就是Sphere球体的位置。

axis就是Y轴正方向,而point和axis一起就代表了世界坐标系的Y轴。

而RotateAround就是让Cube围绕世界坐标系的Y轴进行旋转,通俗理解就是Cube(地球)围绕Sphere(太阳)进行“公转”,运行工程效果如下:

最后我们再介绍LookAt方法,它使当前游戏对象向前方向(transform.forward指向 target 的当前位置,类似于转头看向target 位置的操作。我们继续创建“SampleScene6”的新场景,然后创建“Cube”和“CubeLookAt.cs”脚本,并将其附加在一起,“Cube”的位置位于(0,0,0)点。接下来,我们继续创建一个“Sphere”和“SphereTest.cs”脚本,并将其附加在一起,它的位置在(-5,0,0)点。

然后我们需要调整摄像机的位置和旋转,让其能够在前上方俯视当前场景,摄像机参数如下:

 

接下来,我们保持相机选中状态,我们点击菜单栏“GameObject”->“Align View to Selected”

我们先完成“SphereTest.cs”脚本的内容,实现“Sphere”能够沿世界坐标系Z轴移动效果。

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class SphereTest : MonoBehaviour
  5. {
  6. // Update is called once per frame
  7. void Update()
  8. {
  9. // 向前移动
  10. if (Input.GetKeyDown(KeyCode.W))
  11. {
  12. transform.Translate(Vector3.forward, Space.World);
  13. }
  14. // 向后移动
  15. if (Input.GetKeyDown(KeyCode.S))
  16. {
  17. transform.Translate(Vector3.back, Space.World);
  18. }
  19. }
  20. }

接下来,就是“CubeLookAt.cs”脚本的内容。

因为我们需要让Cube看向Sphere,因此需要在当前脚本中获取到Sphere游戏对象。

让在Update方法中调用LookAt方法来让Cube看向Sphere,代码如下:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class CubeLookAt : MonoBehaviour
  5. {
  6. // 球体
  7. GameObject sphere;
  8. // Start is called before the first frame update
  9. void Start()
  10. {
  11. sphere = GameObject.Find("Sphere");
  12. }
  13. // Update is called once per frame
  14. void Update()
  15. {
  16. transform.LookAt(sphere.transform);
  17. }
  18. }

如果我们移动Sphere的话,Cube肯定会跟随旋转。

其实LookAt还有第二个参数worldUp,它会将Cube向上方向指向 worldUp;没有该参数的话,就是默认的世界坐标系Y轴。也就是说,Cube向上方向就是Vector3.up。Cube的向上方向本来就是世界坐标系Y轴,因此对我们的案例没有任何的影响。该参数其实是为了调整Cube旋转时候的姿态而已。默认就是Y轴向上的“站立”姿态。

注意:在使用LookAt方法的时候,他会让Cube在X/Y/Z三个轴上看向Sphere,对于X/Z轴的来讲,类似于我们所说的左右旋转,对于Y轴(垂直方向)来讲,这个旋转就不太人性化。因为在现实中,我们会左右旋转看向目标;但是如果目标在上方或者下方的时候,我们只是头部仰视或者俯视,并不会让整个身体进行旋转并看向目标。如何做这样的修改呢?

  1. void Update()
  2. {
  3. //transform.LookAt(sphere.transform);
  4. // 位置相减获取方向向量
  5. Vector3 direction = sphere.transform.position - transform.position;
  6. // 方向向量去掉Y轴(Y轴清零即可)
  7. direction = new Vector3(direction.x, 0, direction.z);
  8. // 使用四元数进行朝向的旋转
  9. transform.rotation = Quaternion.LookRotation(direction);
  10. }

每句都有相应的注释,这里我们使用了Quaternion.LookRotation方法来完成朝向旋转。接下来,我们在进行测试的时候,即使在Y轴方向移动Sphere,Cube也不会朝向它并旋转了。关于这个案例的效果图,我们就不给到大家了(前提是Y轴上移动Sphere哦)。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号