VContainerチュートリアル - CASru-GAME/TeamGameDevBootcamp GitHub Wiki
VContainerのチュートリアルです。
VContainerの役割
VContainerは概ね2つの役割を持っています。
- オブジェクト同士の参照関係/所有関係を自由に構築
- 純粋なC# クラスのエントリポイントをつくる
それぞれ説明しましょう。
1. 参照関係の構築
1.1 Unityでの参照は意外と大変
まず、上位ドキュメントのDIコンテナについて読んでください。
Unityにおいて、オブジェクト/クラスを参照する方法は大体以下の2つが使われます。
SerializeField
を使って直接インスペクタ上でアタッチするstatic
を用いる
両方それなりの長所と短所があります。
SerializedField
を使う場合、参照するものが多くなるほど、アタッチする量も増えます。これには手間もかかり、量によっては非常にわかりづらくなります。static
を使う場合、手間は減りますが、どのオブジェクトもアクセスできてしまいます。これによって予期しないエラーが発生する可能性があります。
ここで、2つの方法の長所だけ持ってきたものがVContainerです。
1.2 VContainerで行われる動作
VContainerで使われるDIコンテナは次のような流れで動作します。
LifetimeScope
を継承したクラスを作成してDIコンテナを作る- DIコンテナをゲームオブジェクトにアタッチする。
- VContainerで内蔵されている関数
Configure
から DIコンテナに登録する。登録すれば自動的に参照関係が構築される - 作られたDIコンテナは他のクラスのコンストラクタを捜査し、自動的にオブジェクト/クラスを参照渡ししてくれる
例で説明しましょう。次のような参照したいクラス HelloService.cs
があったとします。
public class HelloService
{
public void Hello()
{
UnityEngine.Debug.Log("Hello, World!");
}
}
1. LifetimeScope
を継承したクラスを作成してDIコンテナを作る
文章通りです。次のようなクラス ServiceLifetimeScope.cs
を作ります。
public class ServiceLifetimeScope : LifetimeScope
{
}
2. DIコンテナをゲームオブジェクトにアタッチする。
文章通りです。
3. VContainerで内蔵されている関数 Configure
から DIコンテナに登録する。登録すれば自動的に参照関係が構築される
public class ServiceLifetimeScope : LifetimeScope
{
protected override void Configure(IContainerBuilder builder)
{
builder.Register<HelloService>(Lifetime.Singleton);
}
}
<HelloService>
は最初に作ったクラスの名前です。このようにRegister
メソッドを使うことで登録できます。
4. 作られたDIコンテナは他のクラスのコンストラクタを捜査し、自動的にオブジェクト/クラスを参照渡ししてくれる
他のクラス Presenter
でHello
クラスを参照したいとしましょう。その時は、コンストラクタを使うことでVContainerのDIコンテナが自動的に渡してくれます。これを 依存性注入(Dependency Injection, DI) と呼びます。
public class Presenter
{
readonly HelloService _helloService;
[Inject]
public Presenter(HelloService helloService)
{
_helloService = helloService;
}
}
これで Presenter
クラスで HelloService
クラスが使えるようになります。