【Unity】依存性の注入(インスタンスを取得する)
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が自動的に依存関係を解決し、必要なサービスをコンポーネントに提供するため、コードの柔軟性と再利用性が向上します。












ディスカッション
コメント一覧
まだ、コメントがありません