本章节我们介绍另外两种形式的旋转,也对应了两个方法。首先是RotateAround方法,他是围绕穿过世界坐标中的 point 点的 axis轴旋转 angle 度。这个方法虽然比较晦涩难懂,但是我们使用一个案例,大家就非常明白了。我们创建一个新的“SampleScene5”场景,然后创建一个“Cube”游戏对象和“CubeRotate.cs”脚本,并附加两者在一起。接下来,我们将“Cube”放置到世界坐标系的(-5,0,0)位置,然后我们创建一个“Sphere”球体并放置在世界坐标系原点(0,0,0)位置。
最后,为了能够观察“Cube”的旋转,我们还需要移动和旋转摄像机,让其在世界坐标系的原点正上方向下俯视整个场景,参数设置入下:
接下来,我们保持相机选中状态,我们点击菜单栏“GameObject”->“Align View to Selected”
接下来,我们添加“CubeTransformTest2”脚本中的代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CubeRotate : MonoBehaviour
{
// Update is called once per frame
void Update()
{
Vector3 point = new Vector3(0, 0, 0);
Vector3 axis = new Vector3(0, 1, 0);
transform.RotateAround(point, axis, 10 * Time.deltaTime);
}
}
稍微解释一下,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轴移动效果。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SphereTest : MonoBehaviour
{
// Update is called once per frame
void Update()
{
// 向前移动
if (Input.GetKeyDown(KeyCode.W))
{
transform.Translate(Vector3.forward, Space.World);
}
// 向后移动
if (Input.GetKeyDown(KeyCode.S))
{
transform.Translate(Vector3.back, Space.World);
}
}
}
接下来,就是“CubeLookAt.cs”脚本的内容。
因为我们需要让Cube看向Sphere,因此需要在当前脚本中获取到Sphere游戏对象。
让在Update方法中调用LookAt方法来让Cube看向Sphere,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CubeLookAt : MonoBehaviour
{
// 球体
GameObject sphere;
// Start is called before the first frame update
void Start()
{
sphere = GameObject.Find("Sphere");
}
// Update is called once per frame
void Update()
{
transform.LookAt(sphere.transform);
}
}
如果我们移动Sphere的话,Cube肯定会跟随旋转。
其实LookAt还有第二个参数worldUp,它会将Cube向上方向指向 worldUp;没有该参数的话,就是默认的世界坐标系Y轴。也就是说,Cube向上方向就是Vector3.up。Cube的向上方向本来就是世界坐标系Y轴,因此对我们的案例没有任何的影响。该参数其实是为了调整Cube旋转时候的姿态而已。默认就是Y轴向上的“站立”姿态。
注意:在使用LookAt方法的时候,他会让Cube在X/Y/Z三个轴上看向Sphere,对于X/Z轴的来讲,类似于我们所说的左右旋转,对于Y轴(垂直方向)来讲,这个旋转就不太人性化。因为在现实中,我们会左右旋转看向目标;但是如果目标在上方或者下方的时候,我们只是头部仰视或者俯视,并不会让整个身体进行旋转并看向目标。如何做这样的修改呢?
void Update()
{
//transform.LookAt(sphere.transform);
// 位置相减获取方向向量
Vector3 direction = sphere.transform.position - transform.position;
// 方向向量去掉Y轴(Y轴清零即可)
direction = new Vector3(direction.x, 0, direction.z);
// 使用四元数进行朝向的旋转
transform.rotation = Quaternion.LookRotation(direction);
}
每句都有相应的注释,这里我们使用了Quaternion.LookRotation方法来完成朝向旋转。接下来,我们在进行测试的时候,即使在Y轴方向移动Sphere,Cube也不会朝向它并旋转了。关于这个案例的效果图,我们就不给到大家了(前提是Y轴上移动Sphere哦)。