Unityゲームの作り方メモ

【Unity2D】プレイヤーを追跡させたい

Unity

ユニティー2Dで敵や弾などにプレイヤーを追いかけさせる方法のメモです

プレイヤーを配置する

シューティングゲームのアセットを使用してプレイヤーと敵を配置しました。

二つのオブジェクトにRigidbodyを追加します。

プレイヤーを移動させる

ヒエラルキーウィンドウを右クリック「Create」→「C#Script」を選び、新しいスクリプトを作成し、名前を「Player」と名付けます。

各部分の説明

  1. 変数の宣言と初期化
  • moveSpeed はプレイヤーの移動速度を表す変数です。初期値は5です。
  • [SerializeField] は、Unityのインスペクターで rb(リジッドボディ)という名前の変数にアクセスできるようにするための属性です。
  • rb は物理エンジンを使ってキャラクターを動かすための Rigidbody2D 型の変数です。
  • movement はプレイヤーの移動方向を格納するための Vector2 型の変数です。
  1. Updateメソッド
  • Update メソッドは毎フレーム呼び出されます。
  • Input.GetAxisRaw("Horizontal") は左右の入力(AキーやDキー、左矢印キーや右矢印キー)を取得し、movement.x に代入します。
  • Input.GetAxisRaw("Vertical") は上下の入力(WキーやSキー、上矢印キーや下矢印キー)を取得し、movement.y に代入します。
  1. FixedUpdateメソッド
  • FixedUpdate メソッドは物理演算に基づいて一定の時間間隔で呼び出されます。
  • rb.MovePositionRigidbody2D の位置を変更するためのメソッドです。
  • rb.position は現在のリジッドボディの位置を取得します。
  • movement * moveSpeed * Time.fixedDeltaTime は移動量を計算します。moveSpeed は速度、Time.fixedDeltaTime は前回の FixedUpdate からの経過時間です。

全体の動き

  1. ゲームが開始すると、Update メソッドが毎フレーム呼び出され、プレイヤーの入力を取得します。
  2. 入力に基づいて、movement 変数が更新されます。
  3. 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);
    }
}

プレイヤーのスクリプトをアタッチ

  1. ヒエラルキー(Hierarchy)ウィンドウでプレイヤーのオブジェクトを選択します。
  2. インスペクター(Inspector)ウィンドウで「Add Component」ボタンをクリックします。
  3. Player スクリプトを検索して追加します。
  4. Rigidbody2D コンポーネントをアタッチし、Player スクリプトの rb フィールドにドラッグ&ドロップします。

プレイヤーを追跡させるスクリプト

ヒエラルキーウィンドウを右クリック「Create」→「C#Script」を選び、新しいスクリプトを作成し、名前を「Enemy」と名付けます。

各部分の説明

  1. using UnityEngine;
    • Unityの基本的な機能を使うための宣言です。
  2. [RequireComponent(typeof(Rigidbody2D))]
    • このスクリプトをアタッチするオブジェクトに必ず Rigidbody2D コンポーネントが必要であることを示します。
  3. public class Enemy : MonoBehaviour
    • Enemy という名前の新しいクラスを作成します。このクラスは MonoBehaviour を継承しています。
  4. [SerializeField] Transform target;
    • target という名前の Transform 型の変数を宣言します。SerializeField 属性を使って、Unityエディタ上でこの変数に値を設定できるようにします。これは敵が追いかけるターゲットです。
  5. Rigidbody2D rb;
    • 敵の物理挙動を制御するための Rigidbody2D 型の変数を宣言します。
  6. float speed = 5f;
    • 敵の移動速度を設定する変数です。デフォルト値は 5f です。
  7. float rotateSpeed = 200f;
    • 敵の回転速度を設定する変数です。デフォルト値は 200f です。
  8. void Start()
    • ゲーム開始時に一度だけ呼ばれるメソッドです。ここで Rigidbody2D コンポーネントを取得します。
  9. void Update()
    • 毎フレーム呼ばれるメソッドです。敵の移動と回転を制御します。
  10. Vector2 direction = (Vector2)target.position – rb.position;
    • 敵からターゲットへの方向を計算します。
  11. direction.Normalize();
    • 方向ベクトルを正規化して、長さを1にします。
  12. float rotateAmount = Vector3.Cross(direction, transform.up).z;
    • 敵がどれだけ回転する必要があるかを計算します。
  13. rb.angularVelocity = -rotateAmount * rotateSpeed;
    • 敵の回転速度を設定します。
  14. 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;
    }
}

敵キャラのスクリプトをアタッチ

  1. ヒエラルキー(Hierarchy)ウィンドウで敵キャラのオブジェクトを選択します。
  2. インスペクター(Inspector)ウィンドウで「Add Component」ボタンをクリックします。
  3. Enemy スクリプトを検索して追加します。
  4. Enemy スクリプトの target フィールドにプレイヤーオブジェクトをドラッグ&ドロップします。

動作確認

これで、敵キャラがプレイヤーを追いかけるようになります。プレイヤーを操作して、敵キャラが追いかけてくるかどうかを確認しましょう。

この記事を参考にして、あなたのゲームでも敵キャラを追加し、プレイヤーを追いかけさせることができるでしょう。楽しんでゲームを作ってください!

よくある質問

Q: 敵キャラがプレイヤーを追跡しません。どうすればいいですか?

A: まず、Enemy スクリプトの target フィールドに正しくプレイヤーオブジェクトが設定されているか確認してください。また、プレイヤーと敵キャラのオブジェクトに Rigidbody2D コンポーネントがアタッチされているか確認してください。

Q: プレイヤーが壁を通り抜けてしまいます。どうすればいいですか?

A: プレイヤーオブジェクトに Collider2D コンポーネントを追加し、適切なコリジョン設定を行ってください。敵キャラにも同様に Collider2D コンポーネントを追加してください。

Q: 敵キャラのスピードを調整したいです。どうすればいいですか?

A: Enemy スクリプトの speed 変数の値を変更することで、敵キャラのスピードを調整できます。

おすすめのアセット