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コンテナは次のような流れで動作します。

  1. LifetimeScopeを継承したクラスを作成してDIコンテナを作る
  2. DIコンテナをゲームオブジェクトにアタッチする。
  3. VContainerで内蔵されている関数 Configure から DIコンテナに登録する。登録すれば自動的に参照関係が構築される
  4. 作られた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コンテナは他のクラスのコンストラクタを捜査し、自動的にオブジェクト/クラスを参照渡ししてくれる

他のクラス PresenterHelloクラスを参照したいとしましょう。その時は、コンストラクタを使うことでVContainerのDIコンテナが自動的に渡してくれます。これを 依存性注入(Dependency Injection, DI) と呼びます。

public class Presenter
{
    readonly HelloService _helloService;

    [Inject]
    public Presenter(HelloService helloService)
    {
        _helloService = helloService;
    }
}

これで Presenter クラスで HelloService クラスが使えるようになります。