Menu
CoddyTech

欧拉角

本课属于 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 度。

challenge icon

挑战

中等

修复摄像机的扫动:它转到 45 时会转向,但转到 -45 时不会,因为 eulerAngles.y 会将 -45 读作 315。

  1. 添加字段 float angle;,并将 Update() 的前两行替换为 angle += direction * speed * Time.deltaTime;。
  2. 保留两行 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 在线编辑器