朝移动方向转向
本课属于 Coddy Unity 学习旅程的“物理与游戏玩法”单元。第 44 课,共 71 课。
transform.LookAt需要一个观察目标点。你通常拿到的却是一个方向:速度、风向,或某个物体移动的方向。Quaternion.LookRotation(direction)会返回一个旋转,使物体的前方(蓝色的 z 轴箭头)沿着该方向,同时让物体的上方保持朝向世界坐标系的上方。射向空中的箭一开始指向上方,落下时会逐渐倾斜,因为它的速度也会这样变化:
Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (rb.linearVelocity != Vector3.zero)
{
transform.rotation = Quaternion.LookRotation(rb.linearVelocity);
}
}起作用的只有方向,而不是长度:(1, 0, 2) 和 (3, 0, 6) 会得到相同的旋转。零向量没有方向,因此 LookRotation(Vector3.zero)会记录 Look rotation viewing vector is zero,并返回 Quaternion.identity,这会让物体瞬间转向 +z 方向。这就是箭会先检查的原因:箭停下来后,会保持原来的朝向。LookAt(target.position)和 LookRotation(target.position - transform.position)会得到相同的旋转。
方向中向上或向下的部分会让前方也随之向上或向下倾斜。对于必须保持直立的物体,例如上坡行走的角色,先将方向的 y 设为 0,这样物体就只会绕 y 轴转动。第二个参数 LookRotation(direction, Vector3.up)用于指定上方的方向;不传这个参数时,默认值就是 Vector3.up。
挑战
中等让蜜蜂面朝飞行方向,同时保持直立。
- 在
LateUpdate()中,设置Vector3 direction = transform.position - lastPosition;和direction.y = 0;。 - 仅当
direction != Vector3.zero时,设置transform.rotation = Quaternion.LookRotation(direction);,这样蜜蜂停下来时会保持朝向。 - 最后,将
transform.position存入lastPosition。
按“开始”:蜜蜂会转向它飞去的每朵花。然后点击“检查”。
亲手试试
using UnityEngine;
public class FaceMotion : MonoBehaviour
{
Vector3 lastPosition;
void Start()
{
lastPosition = transform.position;
}
void LateUpdate()
{
// 让蜜蜂朝向它从上一帧到现在的移动方向。
}
}
物理与游戏玩法中的所有课
自己练习: Unity 在线编辑器