Menu
CoddyTech

追逐玩家

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

追逐玩家的敌人需要一个 Rigidbody,这样墙壁才能挡住它,它也能推开或被推开。追逐本身是一个朝向玩家的速度,每个物理步设置一次。这个僵尸会朝着 player 槽中的对象移动:

[SerializeField] private Transform player;
[SerializeField] private float speed = 2.5f;
private Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void FixedUpdate()
{
    Vector3 toPlayer = player.position - rb.position;
    toPlayer.y = 0f;
    Vector3 dir = toPlayer.normalized;
    rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
}

player.position - rb.position表示从僵尸指向玩家的方向。y 被设为 0,这样无论玩家站得高一些还是低一些,僵尸都会在水平面上行走;normalized 会让向量的长度变为 1,因此无论玩家距离它 2 个单位还是 20 个单位,僵尸都会以 speed 的速度行走。新的速度会保留原来的 y 方向速度,因此僵尸从台阶上掉下来时,重力仍会将它向下拉。它的 Rigidbody 启用了 Freeze Rotation,因此行走时不会翻倒。

设置速度会让行走的敌人立即开始移动并转向。对于滚动的木桶这类较重的敌人,则在同一个 FixedUpdate 中使用 AddForce 推动它:它会逐渐加速,保持动量,并在玩家闪到一旁时冲过头。

Vector3 toPlayer = player.position - rb.position;
toPlayer.y = 0f;
rb.AddForce(toPlayer.normalized * push);

避免移动追逐者的 Transform:这样会让它像放在其他任何地方一样,直接进入墙壁中,而物理引擎只能在之后将它推出墙外。

challenge icon

挑战

中等

让巨石跟着玩家滚动。

  1. 在 FixedUpdate() 中,设置 Vector3 toPlayer = player.position - rb.position; 和 toPlayer.y = 0f;,这样推力就会沿地面作用。
  2. 调用 rb.AddForce(toPlayer.normalized * force);,无论距离远近,推力都相同。让它自由旋转,这样摩擦力就会让它滚动。

按下 开始,绕着巨石跑几圈。然后点击 检查。

亲手试试

using UnityEngine;

public class Boulder : MonoBehaviour
{
    [SerializeField] private Transform player;
    [SerializeField] private float force = 6f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        // 让巨石沿着地面向玩家移动
    }
}

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

自己练习: Unity 在线编辑器