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

2024年11月27日

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

いろいろな方法

これらの方法は、Unityでオブジェクトやコンポーネントのインスタンスを取得する際の重要な手法です。それぞれの特徴を考慮して、プロジェクトの規模や要件に合った方法を選ぶことが大切です。以下に各方法の短所と長所を少し補足します。

GameObject.Find / GameObject.FindWithTag:

  • 長所: シーン内の特定のオブジェクトを簡単に取得できる。
  • 短所: シーン内での検索コストが高く、大量に使うとパフォーマンスに影響が出る可能性がある。

GetComponent:

  • 長所: 特定のGameObjectに付属しているコンポーネントを直接取得できる。
  • 短所: 毎回GetComponentを呼ぶと処理が重くなる可能性があるため、キャッシュすることを推奨。

シングルトンパターン:

  • 長所: アプリ全体で共有されるオブジェクト(例えば、ゲーム管理など)を簡単に管理できる。
  • 短所: シングルトンはグローバルアクセスを提供するため、依存関係が増えてコードのテストが難しくなる可能性がある。

Instantiateメソッド:

  • 長所: プレハブから新しいオブジェクトを動的に生成できるため、オブジェクトの再利用が可能。
  • 短所: 動的にオブジェクトを生成することで、インスタンス管理が煩雑になる可能性がある。

依存性注入:

  • 長所: コンポーネント間の疎結合が促進され、テストしやすく保守性も高い。
  • 短所: 初期設定が少し複雑になることがあり、特に小規模プロジェクトではオーバーヘッドが大きい。

最後の依存性注入のサンプル

依存性注入(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のドキュメント