ユニティー2Dで敵や弾などにプレイヤーを追いかけさせる方法のメモです
プレイヤーを配置する
シューティングゲームのアセットを使用してプレイヤーと敵を配置しました。
二つのオブジェクトにRigidbodyを追加します。

プレイヤーを移動させる
ヒエラルキーウィンドウを右クリック「Create」→「C#Script」を選び、新しいスクリプトを作成し、名前を「Player」と名付けます。
各部分の説明
- 変数の宣言と初期化
moveSpeed
はプレイヤーの移動速度を表す変数です。初期値は5です。[SerializeField]
は、Unityのインスペクターでrb
(リジッドボディ)という名前の変数にアクセスできるようにするための属性です。rb
は物理エンジンを使ってキャラクターを動かすためのRigidbody2D
型の変数です。movement
はプレイヤーの移動方向を格納するためのVector2
型の変数です。
- Updateメソッド
Update
メソッドは毎フレーム呼び出されます。Input.GetAxisRaw("Horizontal")
は左右の入力(AキーやDキー、左矢印キーや右矢印キー)を取得し、movement.x
に代入します。Input.GetAxisRaw("Vertical")
は上下の入力(WキーやSキー、上矢印キーや下矢印キー)を取得し、movement.y
に代入します。
- FixedUpdateメソッド
FixedUpdate
メソッドは物理演算に基づいて一定の時間間隔で呼び出されます。rb.MovePosition
はRigidbody2D
の位置を変更するためのメソッドです。rb.position
は現在のリジッドボディの位置を取得します。movement * moveSpeed * Time.fixedDeltaTime
は移動量を計算します。moveSpeed
は速度、Time.fixedDeltaTime
は前回のFixedUpdate
からの経過時間です。
全体の動き
- ゲームが開始すると、
Update
メソッドが毎フレーム呼び出され、プレイヤーの入力を取得します。 - 入力に基づいて、
movement
変数が更新されます。 FixedUpdate
メソッドが一定の時間間隔で呼び出され、Rigidbody2D
の位置が更新されます。これにより、プレイヤーキャラクターが動きます。
using UnityEngine;
public class Player : MonoBehaviour
{
float moveSpeed = 5;
[SerializeField] Rigidbody2D rb;
Vector2 movement;
void Update()
{
movement.x = Input.GetAxisRaw("Horizontal");
movement.y = Input.GetAxisRaw("Vertical");
}
private void FixedUpdate()
{
rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime);
}
}
プレイヤーのスクリプトをアタッチ
- ヒエラルキー(Hierarchy)ウィンドウでプレイヤーのオブジェクトを選択します。
- インスペクター(Inspector)ウィンドウで「Add Component」ボタンをクリックします。
Player
スクリプトを検索して追加します。- Rigidbody2D コンポーネントをアタッチし、
Player
スクリプトのrb
フィールドにドラッグ&ドロップします。

プレイヤーを追跡させるスクリプト
ヒエラルキーウィンドウを右クリック「Create」→「C#Script」を選び、新しいスクリプトを作成し、名前を「Enemy」と名付けます。
各部分の説明
- using UnityEngine;
- Unityの基本的な機能を使うための宣言です。
- [RequireComponent(typeof(Rigidbody2D))]
- このスクリプトをアタッチするオブジェクトに必ず
Rigidbody2D
コンポーネントが必要であることを示します。
- このスクリプトをアタッチするオブジェクトに必ず
- public class Enemy : MonoBehaviour
Enemy
という名前の新しいクラスを作成します。このクラスはMonoBehaviour
を継承しています。
- [SerializeField] Transform target;
target
という名前のTransform
型の変数を宣言します。SerializeField
属性を使って、Unityエディタ上でこの変数に値を設定できるようにします。これは敵が追いかけるターゲットです。
- Rigidbody2D rb;
- 敵の物理挙動を制御するための
Rigidbody2D
型の変数を宣言します。
- 敵の物理挙動を制御するための
- float speed = 5f;
- 敵の移動速度を設定する変数です。デフォルト値は
5f
です。
- 敵の移動速度を設定する変数です。デフォルト値は
- float rotateSpeed = 200f;
- 敵の回転速度を設定する変数です。デフォルト値は
200f
です。
- 敵の回転速度を設定する変数です。デフォルト値は
- void Start()
- ゲーム開始時に一度だけ呼ばれるメソッドです。ここで
Rigidbody2D
コンポーネントを取得します。
- ゲーム開始時に一度だけ呼ばれるメソッドです。ここで
- void Update()
- 毎フレーム呼ばれるメソッドです。敵の移動と回転を制御します。
- Vector2 direction = (Vector2)target.position – rb.position;
- 敵からターゲットへの方向を計算します。
- direction.Normalize();
- 方向ベクトルを正規化して、長さを1にします。
- float rotateAmount = Vector3.Cross(direction, transform.up).z;
- 敵がどれだけ回転する必要があるかを計算します。
- rb.angularVelocity = -rotateAmount * rotateSpeed;
- 敵の回転速度を設定します。
- rb.velocity = transform.up * speed;
- 敵の移動速度を設定します。
全体の動き
このスクリプトは、敵がターゲットの方向を向き、一定の速度で移動するようにします。ターゲットの位置を毎フレームチェックし、その方向に向かって敵が回転しながら進む仕組みです。
using UnityEngine;
[RequireComponent(typeof(Rigidbody2D))]
public class Enemy : MonoBehaviour
{
[SerializeField] Transform target;
Rigidbody2D rb;
float speed = 5f;
float rotateSpeed = 200f;
void Start()
{
rb= GetComponent<Rigidbody2D>();
}
void Update()
{
Vector2 direction = (Vector2)target.position - rb.position;
direction.Normalize();
float rotateAmount = Vector3.Cross(direction,transform.up).z;
rb.angularVelocity = -rotateAmount * rotateSpeed;
rb.velocity = transform.up * speed;
}
}
敵キャラのスクリプトをアタッチ
- ヒエラルキー(Hierarchy)ウィンドウで敵キャラのオブジェクトを選択します。
- インスペクター(Inspector)ウィンドウで「Add Component」ボタンをクリックします。
Enemy
スクリプトを検索して追加します。Enemy
スクリプトのtarget
フィールドにプレイヤーオブジェクトをドラッグ&ドロップします。

動作確認
これで、敵キャラがプレイヤーを追いかけるようになります。プレイヤーを操作して、敵キャラが追いかけてくるかどうかを確認しましょう。
この記事を参考にして、あなたのゲームでも敵キャラを追加し、プレイヤーを追いかけさせることができるでしょう。楽しんでゲームを作ってください!
よくある質問
Q: 敵キャラがプレイヤーを追跡しません。どうすればいいですか?
A: まず、Enemy
スクリプトの target
フィールドに正しくプレイヤーオブジェクトが設定されているか確認してください。また、プレイヤーと敵キャラのオブジェクトに Rigidbody2D
コンポーネントがアタッチされているか確認してください。
Q: プレイヤーが壁を通り抜けてしまいます。どうすればいいですか?
A: プレイヤーオブジェクトに Collider2D
コンポーネントを追加し、適切なコリジョン設定を行ってください。敵キャラにも同様に Collider2D
コンポーネントを追加してください。
Q: 敵キャラのスピードを調整したいです。どうすればいいですか?
A: Enemy
スクリプトの speed
変数の値を変更することで、敵キャラのスピードを調整できます。