プレイヤーを追いかける
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 を動かすのは避けましょう。移動先がどこであれ、壁の中に入り込んでしまう可能性があり、物理エンジンが後から押し出すしかなくなるためです。
チャレンジ
中級岩がプレイヤーを追いかけて転がります。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()
{
// 地面に沿って岩をプレイヤーの方向へ押す
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。