【Unity】依存性の注入(インスタンスを取得する)

2024年3月19日

Unityでインスタンスを取得する方法は、取得したいインスタンスの種類によって異なります。いくつかの一般的な方法を紹介します:

いろいろな方法

  1. GameObject.FindGameObject.FindWithTagを使用する:シーン内にオブジェクトが存在する場合、GameObject.Findをオブジェクトの名前と共に使用するか、GameObject.FindWithTagをタグと共に使用してインスタンスを取得できます。
  2. GetComponentを使用する:特定のコンポーネントのインスタンスを取得するには、対象のGameObjectにアタッチされているGetComponentメソッドを使用します。例えば、GameObjectにアタッチされているRigidbodyコンポーネントを取得したい場合、GetComponent<Rigidbody>()と記述します。
  3. シングルトンパターンを使用する:特定のクラスのインスタンスをアプリケーション全体で1つだけに限定したい場合、シングルトンパターンを使用してそのインスタンスにアクセスできます。シングルトンクラス内で静的なインスタンスを作成し、外部からアクセスできるように公開するメソッドを用意します。
  4. Instantiateメソッドを使用する:プレハブや他のGameObjectから新しいインスタンスを動的に生成したい場合、Instantiateメソッドを使用します。このメソッドは、新しいGameObjectのインスタンスを作成し、それをシーンに追加します。
  5. 依存性注入を使用する:大規模なプロジェクトや複雑な依存関係がある場合、依存性注入フレームワークを使用してインスタンスを取得することができます。これは、コンポーネント間の疎結合を促進し、テストや保守を容易にする設計パターンです。

インスタンスの取得方法は、その使用目的やシーンの構成によって異なりますので、目的に応じた適切な方法を選択してください。

5の依存性注入のサンプル

依存性注入(Dependency Injection、DI)は、コンポーネントやクラス間の依存関係を管理し、外部からその依存関係を注入するデザインパターンです。Unityゲーム開発において、DIを使用すると、コードの再利用性、テストのしやすさ、クラス間の疎結合が向上します

Vcontainerのインストール

パッケージマネージャからインストールする方法を使って見ましょう
そのほかの方法については別途を参考にしてください

Git URLを入力します

https://github.com/hadashiA/VContainer.git?path=VContainer/Assets/VContainer#1.15.1

サンプル

UnityプロジェクトでVContainerを使用する簡単なサンプルをご紹介します。このサンプルでは、スコア管理のサービス(IScoreService)とそれを使用するゲームコントローラー(GameController)を作成し、VContainerを使って依存性を注入します。

ステップ1: インターフェースとサービスの定義

まず、スコアサービスのインターフェースIScoreServiceと、その実装ScoreServiceを定義します。

public interface IScoreService
{
    int Score { get; set; }
    void AddScore(int score);
}
using UnityEngine;

public class ScoreService : IScoreService
{
    public int Score { get; set; }

    public void AddScore(int score)
    {
        Score += score;
        Debug.Log($"Current Score: {Score}");
    }
}

ステップ2: ゲームコントローラーの作成

次に、スコアサービスを使用するGameControllerコンポーネントを作成します。

using UnityEngine;
using VContainer;

public class GameController : MonoBehaviour
{
    private IScoreService _scoreService;

    [Inject]
    public void Construct(IScoreService scoreService)
    {
        _scoreService = scoreService;
    }

    void Start()
    {
        _scoreService.AddScore(10);
    }
}

ステップ3: VContainerでの依存性のバインディング設定

VContainerを使用して、依存性を解決し、注入します。これを行うには、LifetimeScopeを継承したクラスを作成し、依存性のバインディングを設定します。

using VContainer;
using VContainer.Unity;

public class GameInstaller : LifetimeScope
{
    protected override void Configure(IContainerBuilder builder)
    {
        builder.Register<IScoreService, ScoreService>(Lifetime.Singleton);
        builder.RegisterComponentInHierarchy<GameController>();
    }
}

ステップ4: LifetimeScopeの設定

Unityエディター内で、新しい空のGameObjectを作成し、それにGameInstallerスクリプトをアタッチします。これにより、GameInstallerがシーンのLifetimeScopeとして機能し、アプリケーションの起動時に依存性のバインディングが行われます。

実行

これでセットアップは完了です。Unityエディターでシーンを再生すると、GameControllerが自動的にIScoreServiceの実装であるScoreServiceのインスタンスを注入され、スタート時にスコアを加算します。このプロセスは、VContainerが自動的に依存関係を解決し、必要なサービスをコンポーネントに提供するため、コードの柔軟性と再利用性が向上します。

VContainerのドキュメント