环绕摄像机
本课属于 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() 中执行这些操作,可以让摄像机在这一帧雕像或玩家移动后再定位。
挑战
中等让玩家操控摄像机绕着塔飞行。
- 在
Update()中,按右箭头和左箭头可按turnSpeed的速度改变yaw,按上箭头和下箭头可按tiltSpeed的速度改变pitch,并乘以Time.deltaTime。 - 然后保留
pitch = Mathf.Clamp(pitch, 10f, 60f);。 - 在
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 在线编辑器