プレイヤーを追いかける
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を動かすと、壁の中にも簡単に入り込んでしまい、物理エンジンが後から押し出すしかなくなります。
チャレンジ
中級プレイヤーの後を追って岩が転がるようにします。
FixedUpdate()で、Vector3 toPlayer = player.position - rb.position;とtoPlayer.y = 0f;を設定し、押す力が地面に沿うようにします。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プレイグラウンド