1. transform.LookAt()基础:让物体"看"向目标
刚接触Unity时,我发现很多教程都在用transform.LookAt()实现简单的物体朝向控制。这个方法确实像它的名字一样直观——让一个物体"看"向另一个目标。但真正在项目中用起来,才发现它远比表面看起来复杂。
先来看最基本的用法。假设我们有个第三人称游戏的摄像机,需要始终盯着主角:
csharp复制public class SimpleCameraLook : MonoBehaviour {
public Transform player;
void Update() {
transform.LookAt(player);
}
}
这几行代码就能让摄像机镜头始终对准玩家角色。原理是:Unity会自动计算从摄像机位置到玩家位置的向量,然后调整摄像机的旋转,使其正前方向(Z轴)对齐这个向量。默认情况下,物体的上方向(Y轴)会尽量与世界坐标系的上方向(Vector3.up)对齐。
但实际使用时你会发现三个典型问题:
- 镜头旋转会突然"跳变",完全没有过渡
- 当玩家移动到摄像机正上方或正下方时,镜头会出现剧烈抖动
- 镜头会穿墙或穿模,直接看到不该看到的画面
我在早期项目中就遇到过这些坑。有次演示时,玩家角色跳起来碰到天花板,摄像机直接来了个180度翻转,整个画面天旋地转,把测试玩家都转吐了。这就是没处理好WorldUp参数的结果。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动态镜头控制:从僵硬到流畅的进阶之路
2.1 平滑过渡:插值让镜头运动更自然
直接使用LookAt()的最大问题就是旋转太生硬。解决方法是用Quaternion.Lerp或Quaternion.Slerp进行插值:
csharp复制[SerializeField] float smoothSpeed = 5f;
void Update() {
Vector3 direction = player.position - transform.position;
Quaternion targetRotation = Quaternion.LookRotation(direction);
transform.rotation = Q
