Menu
CoddyTech

环绕摄像机

本课属于 Coddy Unity 学习旅程的“物理与游戏玩法”单元。第 48 课,共 71 课。

要绕一个点旋转,先保存一个角度,再用它旋转固定偏移量,并将结果加到该点上。旋转与向量相乘就能完成转向:Quaternion.Euler(0, angle, 0) * offset会让偏移量绕 y 轴旋转,同时保持其长度和高度不变。这台摄像机会以每秒 20 度的速度绕雕像旋转,始终保持高出 3 个单位、远离雕像 6 个单位:

public Transform statue;
public float speed = 20f;
float angle;

void LateUpdate()
{
    angle += speed * Time.deltaTime;
    Vector3 offset = new Vector3(0, 3, -6);
    transform.position = statue.position + Quaternion.Euler(0, angle, 0) * offset;
    transform.LookAt(statue);
}

角度为 0 时,偏移量是 (0, 3, -6),所以摄像机在雕像后方。角度为 90 时,偏移量是 (-6, 3, 0),摄像机位于雕像的 -x 一侧;角度为 180 时,偏移量是 (0, 3, 6),摄像机位于雕像前方。移动摄像机不会让它转向,因此 LookAt 会让摄像机从每个新位置重新对准雕像。

再加上第二个角度,就能抬高摄像机:Quaternion.Euler(pitch, yaw, 0) * new Vector3(0, 0, -distance)会让朝后的方向向上转动 pitch(绕 x 轴正向旋转会让 (0, 0, -1) 向上倾斜),然后再绕着转动 yaw,因此无论角度是多少,摄像机与目标的距离都保持为 distance。

和欧拉角一样,角度保存在你自己的字段中:它可以增长到超过 360,也可以降到 0 以下,而不会突然跳变;你还可以限制它的范围,或通过键盘改变它。在 LateUpdate() 中执行这些操作,可以让摄像机在这一帧雕像或玩家移动后再定位。

challenge icon

挑战

中等

让玩家操控摄像机绕着塔飞行。

  1. 在 Update() 中,按右箭头和左箭头可按 turnSpeed 的速度改变 yaw,按上箭头和下箭头可按 tiltSpeed 的速度改变 pitch,并乘以 Time.deltaTime。
  2. 然后保留 pitch = Mathf.Clamp(pitch, 10f, 60f);。
  3. 在 LateUpdate() 中,设置 transform.position = target.position + Quaternion.Euler(pitch, yaw, 0) * new Vector3(0, 0, -distance);,然后设置 transform.LookAt(target);。

按“开始”,绕着塔飞行。然后按“检查”。

亲手试试

using UnityEngine;

public class OrbitCamera : MonoBehaviour
{
    public Transform target;
    public float distance = 8f;
    public float turnSpeed = 90f;
    public float tiltSpeed = 45f;
    public float yaw = 0f;
    public float pitch = 30f;

    void Update()
    {
        // 方向键改变 yaw 和 pitch。
    }

    void LateUpdate()
    {
        // 将相机放在 target 周围,并使其朝向 target。
    }
}

物理与游戏玩法中的所有课

自己练习: Unity 在线编辑器