Menu
CoddyTech

朝移动方向转向

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

challenge icon

挑战

中等

让蜜蜂面朝飞行方向,同时保持直立。

  1. 在 LateUpdate() 中,设置 Vector3 direction = transform.position - lastPosition; 和 direction.y = 0;。
  2. 仅当 direction != Vector3.zero 时,设置 transform.rotation = Quaternion.LookRotation(direction);,这样蜜蜂停下来时会保持朝向。
  3. 最后,将 transform.position 存入 lastPosition。

按“开始”:蜜蜂会转向它飞去的每朵花。然后点击“检查”。

亲手试试

using UnityEngine;

public class FaceMotion : MonoBehaviour
{
    Vector3 lastPosition;

    void Start()
    {
        lastPosition = transform.position;
    }

    void LateUpdate()
    {
        // 让蜜蜂朝向它从上一帧到现在的移动方向。
    }
}

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

自己练习: Unity 在线编辑器