【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が自動的に依存関係を解決し、必要なサービスをコンポーネントに提供するため、コードの柔軟性と再利用性が向上します。
ディスカッション
コメント一覧
まだ、コメントがありません