Menu
CoddyTech

プレイヤーを追いかける

CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 52/71。

プレイヤーを追いかける敵にはRigidbodyが必要です。壁で止まり、押したり押されたりできるようになります。追跡自体はプレイヤーに向けた速度で、物理ステップごとに1回設定します。このゾンビは、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を動かすのは避けてください。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プレイグラウンド