Unityで依存性注入を使ったプレイヤーと敵の連携システム

この資料では、Unityと「VContainer」という依存性注入フレームワークを使って、プレイヤー(Player)を追尾する敵(Enemy)のシステムを作成する方法を解説します。


依存性注入とは?

依存性注入(Dependency Injection)とは、必要なデータや機能(依存関係)を直接クラス内で作成するのではなく、外部から渡して利用する設計手法です。

メリット

  • 疎結合な設計:クラス同士の結合が弱くなるので、他のクラスに影響を与えずに変更や拡張が可能。
  • テストが簡単:モック(テスト用の仮オブジェクト)を注入することで、個々のクラスを独立してテストできる。

今回作成するシステム

  • プレイヤー:自分の位置情報を他のオブジェクトに提供するクラス。
  • :プレイヤーの位置を追尾するクラス。

VContainerを使用して、敵にプレイヤーの位置情報を注入する仕組みを作ります。


準備

  1. Unityプロジェクトを作成する。
  2. Unity Package Managerから VContainer をインストールする。

コード解説

1. GameInstaller

依存関係を登録するセットアップクラス

using VContainer;
using VContainer.Unity;

public class GameInstaller : LifetimeScope
{
    protected override void Configure(IContainerBuilder builder)
    {
        // シーン内のPlayerとEnemyを登録
        builder.RegisterComponentInHierarchy<Player>();
        builder.RegisterComponentInHierarchy<Enemy>();
    }
}

ポイント

  • LifetimeScope クラス
    VContainerの依存関係を管理する基本クラスです。
  • RegisterComponentInHierarchy<T>()
    シーンに配置された MonoBehaviour を継承したスクリプトを登録します。

2. Playerクラス

プレイヤーキャラクターの情報を管理するクラス

using UnityEngine;

public class Player : MonoBehaviour
{
    public Transform PlayerTransform => transform;
}

ポイント

  • PlayerTransform プロパティ
    プレイヤーの位置や回転情報を外部に提供します。

3. Enemyクラス

プレイヤーを追尾する敵のクラス

using UnityEngine;
using VContainer;

public class Enemy : MonoBehaviour
{
    private Transform playerTransform;

    // 依存性注入でPlayerの情報を受け取る
    [Inject]
    public void Construct(Player player)
    {
        playerTransform = player.PlayerTransform;
    }

    void Update()
    {
        if (playerTransform != null)
        {
            // プレイヤーの位置に向かって移動
            transform.position = Vector3.MoveTowards(transform.position, playerTransform.position, 2f * Time.deltaTime);
        }
    }
}

ポイント

[Inject] 属性

  • VContainerがこのメソッドを呼び出して依存関係を注入します。
  • Player クラスのインスタンスを受け取り、playerTransform に格納します。

追尾ロジック

  • Vector3.MoveTowards を使用して、一定速度でプレイヤーに近づく動きを実現します。

Unityでの設定

シーンにオブジェクトを配置

  • PlayerEnemy のオブジェクトを作成し、それぞれに対応するスクリプトをアタッチします。
  • GameInstaller をアタッチした空のオブジェクトを作成します(名前は GameInstaller などわかりやすいものに)。

動作確認

  • プレイモードで、敵がプレイヤーを追尾する動作を確認します。

仕組みの全体図

以下は、クラス間の関係を示した図です。

  • GameInstallerPlayerEnemy を登録。
  • EnemyPlayer の情報を注入。

重要な注意点

  • RegisterComponentInHierarchy<T>() の動作
    • 対象は、MonoBehaviour を継承したスクリプト。
    • シーン内に配置されているオブジェクトにアタッチされたコンポーネントのみ登録されます。
    • new で生成するオブジェクトやスクリプトは対象外。
  • シーンに配置していない場合のエラー
    • コンテナに依存関係を登録できず、実行時にエラーが発生する可能性があります。

まとめ

  • VContainerを使用すると、Unityのコードを疎結合に設計できます。
  • この例では、敵がプレイヤーの位置を追尾する動きを簡単に実現しました。
  • 依存性注入を学ぶことで、ゲームの機能を柔軟に構築できるようになります。

応用例

  • 他のキャラクター(味方やボスキャラ)にも依存性注入を適用。
  • プレイヤーや敵の動作を差し替えて、新しいゲーム要素を追加。