UnityUnityメモ

Unityで簡単AI!プレイヤーを追いかける敵キャラを作る方法

Unity

はじめに

こんにちは!Unityでのゲーム開発を始めたばかりの方にぴったりのチュートリアルをお届けします。今回は、敵キャラがプレイヤーを見つけて追いかけてくる仕組みを作ります。これは、ゲームAIの基礎的な部分であり、さまざまなジャンルのゲームに応用できる重要なスキルです。

具体的には、Cube(プレイヤー)とSphere(敵キャラ)を使い、敵がプレイヤーを検出して追跡する動きをシンプルなスクリプトで実現します。この仕組みを学ぶことで、ゲーム開発の楽しさを感じられるはずです。


Unity初心者の方でも安心して進められるように、丁寧に解説していきますので、ぜひ一緒に作ってみましょう!

Unityを触ったことがないという方はコチラの記事から見てみてください!




1. 必要な準備

このセクションでは、必要な準備について説明します。Unityプロジェクトのセットアップやオブジェクトの配置方法を詳しく解説します。


1.Unityプロジェクトのセットアップ

  1. 新しいプロジェクトを作成
    Unity Hubを起動し、「新しいプロジェクト」ボタンをクリックします。テンプレートは「3D」を選択し、プロジェクト名を「PlayerChaseTutorial」に設定します。
  2. シーンの保存
    作成したプロジェクトが開いたら、シーンを保存します。
    手順: 上部メニューの「File」→「Save As」を選び、「MainScene」と名前を付けて保存します。

2.3Dオブジェクトの配置

  1. プレイヤー(Cube)を配置する
    1. ヒエラルキー(Hierarchy)ウィンドウで右クリックします。
    2. 「3D Object」→「Cube」を選択してシーンに配置します。
    3. Cubeを「プレイヤー」と分かりやすい名前に変更します。
    4. インスペクター(Inspector)ウィンドウで設定を確認し、位置を(0, 0.5, 0)に調整します。
  2. 敵キャラ(Sphere)を配置する
    1. 同じように、ヒエラルキーウィンドウで右クリック。
    2. 「3D Object」→「Sphere」を選択して配置します。
    3. Sphereを「敵キャラ」と名前を変更します。
    4. 位置を(3, 0.5, 0)に調整します。
  3. 検出範囲(CautionArea)を配置する
    1. Sphereの子オブジェクトとしてCautionAreaを設定します。
      • ヒエラルキーウィンドウでSphereを右クリックし、「3D Object」→「Sphere」を選択します。
      • 名前を「CautionArea」に変更します。
    2. インスペクターでサイズを調整:
      • Scaleを(5, 5, 5)に変更。

3.必要なコンポーネントの追加

  1. Rigidbodyを追加
    CubeとSphereの両方にRigidbodyコンポーネントを追加します。
    • ヒエラルキーでオブジェクトを選択。
    • インスペクターで「Add Component」ボタンを押し、「Rigidbody」を選択します。
    • 「Use Gravity」をオフにします。
  2. Colliderを確認
    Cube、Sphere、CautionAreaにはデフォルトでColliderが付いていますが、CautionAreaには「Is Trigger」をオンに設定します。

これで、スクリプトを作成する準備が整いました!次のステップでは、プレイヤーと敵キャラの動作を制御するスクリプトを作成していきます。



2.プレイヤーの動作を作成

プレイヤーの動作を実現するためには、プレイヤー役のCubeが移動できるようにスクリプトを設定します。また、敵キャラが反応する範囲に入ったかどうかを判定するための処理も含めます。以下の手順で進めてみましょう!


1. CubeMoveスクリプトの作成

まずは、プレイヤーがキーボードで動くようにスクリプトを作成します。

  1. スクリプトを作成する方法
    • プロジェクトウィンドウを右クリックし、「Create」→「C# Script」を選択。
    • スクリプト名をCubeMoveと入力します。
  2. スクリプトのコードを記述する
    作成したCubeMoveスクリプトをダブルクリックして開き、以下のコードを入力します。

コード全体の説明

このスクリプトは、キューブオブジェクトにアタッチされ、矢印キーでキューブを上下左右に動かします。また、キューブが特定のエリア(”CautionArea” という名前のオブジェクト)にいるかどうかをチェックします。

各部分の説明

  1. クラス宣言と変数定義
    • CubeMove クラスは MonoBehaviour を継承しています。これはUnityの基本的なスクリプトクラスです。
    • public bool invaded は、キューブが「注意エリア」に侵入しているかどうかを示すフラグです。
    • private float speed = 3.0f は、キューブの移動速度を示します。値は 3.0f です。
  2. Updateメソッド
    • Update メソッドは毎フレーム呼ばれます。
    • 矢印キーが押された時に、キューブの位置を変えるコードが書かれています。
      • UpArrow でキューブが上に移動します。
      • DownArrow でキューブが下に移動します。
      • RightArrow でキューブが右に移動します。
      • LeftArrow でキューブが左に移動します。
    • transform.position はキューブの位置を示し、transform.uptransform.right はそれぞれキューブの上方向と右方向を示します。
    • speed * Time.deltaTime で、移動速度を一定に保ちます(フレームごとの時間差を考慮します)。
  3. OnTriggerStayメソッド
    • OnTriggerStay メソッドは、キューブがコライダーと接触し続けている間に呼ばれます。
    • other.gameObject.name"CautionArea" の場合、invadedtrue に設定します。これは、キューブが「注意エリア」に侵入していることを示します。
  4. OnTriggerExitメソッド
    • OnTriggerExit メソッドは、キューブがコライダーから離れたときに呼ばれます。
    • other.gameObject.name"CautionArea" の場合、invadedfalse に設定します。これは、キューブが「注意エリア」から出たことを示します。

全体の動き

このスクリプトは、キューブを上下左右に動かしながら、特定のエリアに侵入しているかどうかをチェックします。矢印キーを使ってキューブを動かし、キューブが「注意エリア」に入ると invadedtrue になり、出ると false になります。

using UnityEngine;

public class CubeMove : MonoBehaviour
{
    public bool invaded; // 敵キャラの検出範囲に入ったかどうかを記録
    private float speed = 3.0f; // プレイヤーの移動速度

    void Update()
    {
        // キーボードの入力に応じてプレイヤーを移動
        if (Input.GetKey(KeyCode.UpArrow))
        {
            transform.position += transform.up * speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.DownArrow))
        {
            transform.position -= transform.up * speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.position += transform.right * speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.position -= transform.right * speed * Time.deltaTime;
        }
    }

    void OnTriggerStay(Collider other)
    {
        // 敵キャラの検出範囲に入った場合
        if (other.gameObject.name == "CautionArea")
        {
            invaded = true; // 範囲内にいることを記録
        }
    }

    void OnTriggerExit(Collider other)
    {
        // 敵キャラの検出範囲から出た場合
        if (other.gameObject.name == "CautionArea")
        {
            invaded = false; // 範囲外になったことを記録
        }
    }
}
  • スクリプトの説明
    • プレイヤーの移動:矢印キーでCubeが上下左右に動くようにしています。transform.positionを使い、速度speedに基づいて移動量を計算します。
    • 検出範囲の判定OnTriggerStayOnTriggerExitを利用し、CautionAreaという名前のオブジェクトに触れているかを判定します。

2.CubeMoveスクリプトのアタッチ

次に、作成したスクリプトをプレイヤー役のCubeに設定します。

  1. Cubeを選択
    ヒエラルキー(Hierarchy)ウィンドウでCubeをクリックして選択します。
  2. スクリプトをドラッグ&ドロップ
    プロジェクトウィンドウでCubeMoveスクリプトを探し、Cubeにドラッグ&ドロップしてアタッチします。
  3. 確認
    インスペクターウィンドウにCubeMove (Script)が表示されていれば完了です。

3.実行してみよう

  1. プレイモードを開始
    Unityエディター上部の「Play」ボタンをクリックして実行します。
  2. 矢印キーで動かしてみる
    キーボードの矢印キーを押して、Cubeが上下左右に動くことを確認しましょう。

これでプレイヤーの基本的な移動機能が完成です!次は、敵キャラがプレイヤーを追いかける動きを追加していきます。



3. 敵キャラの動作を作成

敵キャラとなるSphereがプレイヤーであるCubeを追いかける動作を作成します。このセクションでは、SphereがCubeの検出範囲内に入ると色を変え、追いかけるスクリプトを作成していきます。


1.SphereChaseスクリプトを作成

  1. スクリプトファイルを作成
    • プロジェクトウィンドウを右クリックし、「Create」→「C# Script」を選択します。
    • 新しいスクリプトに「SphereChase」と名前を付けます。
  2. コードを記述
    • 作成した「SphereChase」スクリプトをダブルクリックして開き、以下のコードを入力します。

コード全体の説明

このスクリプトは、キューブが「注意エリア」に侵入したときに球が赤くなり、キューブを追いかける動きをします。キューブがエリアから出ると、球は白に戻り、追いかけをやめます。

各部分の説明

  1. クラス宣言と変数定義
    • SphereChase クラスは MonoBehaviour を継承しています。これはUnityの基本的なスクリプトクラスです。
    • private GameObject target は、追いかける対象のキューブを示します。
    • private float sphereSpeed = 3.0f は、球の移動速度を示します。値は3.0fです。
  2. Startメソッド
    • Start メソッドは、ゲームの開始時に一度だけ呼ばれます。
    • target = GameObject.Find("Cube") で、シーン内にある「Cube」という名前のゲームオブジェクトを見つけて target に代入します。
  3. Updateメソッド
    • Update メソッドは毎フレーム呼ばれます。
    • target.GetComponent<CubeMove>().invaded == true で、キューブが「注意エリア」に侵入しているかどうかをチェックします。
      • 侵入している場合 (true):
        • GetComponent<Renderer>().material.color = Color.red で、球の色を赤に変えます。
        • transform.LookAt(target.transform) で、球がキューブの方向を向くようにします。
        • transform.position += transform.forward * sphereSpeed * Time.deltaTime で、球をキューブの方向に移動させます。
      • 侵入していない場合 (false):
        • GetComponent<Renderer>().material.color = Color.white で、球の色を白に戻します。

全体の動き

このスクリプトは、ゲームの開始時に「Cube」という名前のゲームオブジェクトを探します。毎フレーム、キューブが「注意エリア」に侵入しているかどうかをチェックします。侵入している場合、球の色が赤に変わり、キューブを追いかけ始めます。侵入していない場合、球の色は白のままで、追いかけません。

using UnityEngine;

public class SphereChase : MonoBehaviour
{
    private GameObject target; // プレイヤーの参照
    private float sphereSpeed = 3.0f; // 敵キャラの移動速度

    void Start()
    {
        // プレイヤーとなるCubeオブジェクトを取得
        target = GameObject.Find("Cube");
    }

    void Update()
    {
        // Cubeが検出範囲に侵入している場合
        if (target.GetComponent<CubeMove>().invaded)
        {
            // 色を赤に変更
            GetComponent<Renderer>().material.color = Color.red;
            
            // Cubeの方向を向く
            transform.LookAt(target.transform);
            
            // Cubeに向かって移動
            transform.position += transform.forward * sphereSpeed * Time.deltaTime;
        }
        else
        {
            // Cubeが範囲外の場合、色を白に戻す
            GetComponent<Renderer>().material.color = Color.white;
        }
    }
}

2.スクリプトの内容を解説

  • ターゲット設定
    • GameObject.Find("Cube")で、プレイヤーとなるCubeオブジェクトを取得します。
    • これにより、SphereがCubeを追いかけるようになります。
  • 条件判定
    • target.GetComponent<CubeMove>().invadedで、プレイヤーが敵キャラの検出範囲内にいるかどうかを判定します。
  • 動作内容
    • 範囲内の場合:
      • Sphereの色を赤に変更し、transform.LookAt(target.transform)でCubeの方向を向きます。
      • transform.positionを更新して、SphereがCubeに向かって移動します。
    • 範囲外の場合:
      • Sphereの色を白に戻し、追跡を停止します。

3.スクリプトをSphereにアタッチ

  1. ヒエラルキーウィンドウで「Sphere」を選択します。
  2. 作成した「SphereChase」スクリプトをドラッグ&ドロップしてSphereにアタッチします。



4. 実行してみよう

1.プレイモードを開始する

  1. Unityエディタの上部にある「再生ボタン(三角形)」をクリックしてプレイモードを開始します。
  2. シーンが動き出すと、Cube(プレイヤー)やSphere(敵キャラ)の動きを確認できる状態になります。

2.プレイヤーを操作してみる

  1. キーボードの矢印キー(↑, ↓, →, ←)を使ってCubeを動かしましょう。
  2. Cubeが検出範囲(CautionArea)に入ると、敵キャラ(Sphere)が反応を始めます。

3.敵キャラの動作を確認する

  1. Cubeが検出範囲に入った場合:
    • Sphereの色が白から赤に変わります。
    • SphereがCubeの方向を向き、追いかけ始めます。
  2. Cubeが検出範囲を離れる場合:
    • Sphereの色が赤から白に戻ります。
    • Sphereは追いかけるのを停止します。

3.プレイモードを停止する

  • 動作確認が終わったら、再度再生ボタンをクリックしてプレイモードを停止します。
  • 必要に応じてスクリプトやオブジェクトの設定を調整してください。

プレイヤーと敵キャラの動作を試すことで、AIがどのように反応するか直感的に理解できます。ぜひ動作確認を楽しんでください!



よくある質問

Q
なぜSphereが動かないのですか?
A

スクリプトが正しくアタッチされているか確認してください。CubeとSphereの名前が一致していない場合も原因になります。

Q
Cubeが移動しないのはなぜですか?
A

Rigidbodyの設定を確認してください。不要な物理演算が影響を与えている可能性があります。

Q
色が変わらない場合はどうすればいいですか?
A

Sphereにマテリアルが設定されていることを確認し、スクリプトのコードに誤りがないかチェックしてください。

おすすめのアセット

このアセットは、エキサイティングなカーチェイスゲームを簡単に作成できるテンプレートです。プレイヤーは終わりのない道路で車を運転し、警察から逃げ続けるスリル満点のゲーム体験が楽しめます。

特徴

  • シンプルな操作と直感的なゲームプレイ
  • ランダムに生成される障害物と敵車両
  • カスタマイズ可能な車と背景
  • モバイルデバイスに最適化
  • 完全なソースコードとドキュメントが含まれています