欧拉角
本课属于 Coddy Unity 学习旅程的“物理与游戏玩法”单元。第 42 课,共 71 课。
transform.eulerAngles 表示对象绕 x、y 和 z 轴旋转的角度,单位是度,共有三个角度。Unity 会将旋转存储为四元数(下一课会介绍),每次读取时再计算出这三个角度,数值始终在 0 到 360 之间。将木板绕 z 轴倾斜 -10 度,再读取它的角度:
transform.rotation = Quaternion.Euler(0, 0, -10);
Debug.Log(transform.eulerAngles.z); // 350你设置的是 -10,但代码读取到的是 350,所以 if (transform.eulerAngles.z < -5) 永远不会为真。读取时,三个数值都可能改变:设置为 (100, 0, 0),读取到的却是 (80, 180, 180),只是用另一种方式表示相同的方向。Quaternion.Euler(x, y, z) 的作用方向相反,可以接受任意角度:-10、350 和 710 得到的旋转相同。因此,请用自己的 float 变量保存角度,在这个变量中修改和限制角度,再根据它设置完整的旋转。这个跷跷板会随方向键倾斜,并在任一方向达到 20 度时停止:
public float speed = 40f;
float tilt;
void Update()
{
tilt += Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime;
tilt = Mathf.Clamp(tilt, -20f, 20f);
transform.rotation = Quaternion.Euler(0, 0, tilt);
}不要修改读取到的角度中的某一个部分。transform.eulerAngles.x = 110; 无法编译(CS1612,与 position.x 的情况相同);复制 eulerAngles,修改 x,再将副本赋值回去,起点仍然是 Unity 转换后的角度。设置为 (100, 0, 0) 后,副本是 (80, 180, 180);将 x 加 10 后得到 (90, 180, 180),这会让对象转回 90 度,而不是继续转到 110 度。
挑战
中等修复摄像机的扫动:它转到 45 时会转向,但转到 -45 时不会,因为 eulerAngles.y 会将 -45 读作 315。
- 添加字段
float angle;,并将Update()的前两行替换为angle += direction * speed * Time.deltaTime;。 - 保留两行
if语句,然后设置完整的旋转:transform.rotation = Quaternion.Euler(tilt, angle, 0);。
按下“开始”:摄像机会向下倾斜,从 45 扫动到 -45,再扫回来。然后按“检查”。
亲手试试
using UnityEngine;
public class Sweep : MonoBehaviour
{
public float speed = 30f;
public float limit = 45f;
public float tilt = 20f; // 向下倾斜的角度,绕 x 轴旋转
float direction = 1f;
void Update()
{
transform.Rotate(0, direction * speed * Time.deltaTime, 0, Space.World);
float angle = transform.eulerAngles.y;
if (angle > limit) direction = -1f;
if (angle < -limit) direction = 1f;
}
}
物理与游戏玩法中的所有课
自己练习: Unity 在线编辑器