Menu
CoddyTech

プレイヤーを追いかける

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

プレイヤーを追いかける敵には 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 を使って力を加えることができます。すると速度が増し、慣性を保つため、プレイヤーが横に避けたときに行き過ぎます。追跡する敵の Transform を動かすのは避けましょう。移動先がどこであれ、壁の中に入り込んでしまう可能性があり、物理エンジンが後から押し出すしかなくなるためです。

challenge icon

チャレンジ

中級

岩がプレイヤーを追いかけて転がります。Rigidbodyを持つボールであるBoulderに、Boulderスクリプトを書きましょう。インスペクターでplayer(Player)とforce(6)を設定します。Playerスクリプトは準備できています。矢印キーでプレイヤーを動かせます。

  • 物理演算の各ステップで、プレイヤーが近くにいても遠くにいても、AddForceを使ってforceの力で岩をプレイヤーの方へ押します。
  • プレイヤーが段差の上に立っているときも、上や下への成分を加えず、地面に沿ってのみ押します。
  • Transformを動かしたり、回転を固定したりしないでください。摩擦によって岩が転がります。

Playを押し、岩の周りを走り回ってから、Checkを押します。

自分で試してみよう

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()
    {
        // 地面に沿って岩をプレイヤーの方向へ押す
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

物理演算とゲームプレイのすべてのレッスン