vコンテナの導入と基本的な使い方 Ver 0.9.0備忘録 )


自分用の備忘録記事
最近新しくリリースされたシンプルなディコンテナライブラリのvコンテナの導入方法をメモ

環境


Unity 2018.4.14 .F 1
Vコンテナバージョン0.9.0

導入方法


ギタブから直接UnitTackageをDLしてプロジェクトにインストールする方法とUnititackagemanagerでインストールする方法がある、今回はUnitTackageを直接インストールする方法をとる
GitHubのリリースページから0.9.0のUnitTackageをDLし、プロジェクトにインポート
この時、マニフェスト.JSONにnuget.mono-cecil": "0.1.6-previewの指定を追加
これで特にエラーが無ければまずは導入成功

簡単なサンプル


次にvコンテナを利用した簡単なサンプルを作成します.
vコンテナには疑似的に単振舞いのスタートや更新イベントと似た様な処理を行うことが出来る仕組みがあるので単振舞いを利用しないクラスで単振舞いの更新同様に毎フレーム何かの処理をする等を行えるように )そのサンプルと単振舞いを継承した通常のGameObjectのコンポーネントから利用する方法の二通りを作成します.

ヘリカルワールドサービスの作成


先ずはゲームを通じて利用するヘリカルワールドサービスクラスを作成します、呼び出し元確認用に文字列で引数をとりいつ呼ばれたかをコンソールに表示します、 このクラスは単振舞いを継承しないクラスとします.
using UnityEngine;

public class HelloWorldService
{

    public void HelloWorld(
        string text)
    {
        Debug.Log($"{text} : HelloWorld");
    }

}

GameLifeTimecopeの作成


ゼイドで言うところの風景文字を作成します
プロジェクトウィンドウで右クリック スクリプトを作成するでファイル名に *ライフタイムと記述すると自動でテンプレートスクリプトを作成します.
using VContainer;
using VContainer.Unity;

public class GameLifetimeScope : LifetimeScope
{
    protected override void Configure(IContainerBuilder builder)
    {
    }
}

この段階ではまだテンプレートのままです、いったん先に進みます.

ゲーマーの作成


単振舞いを継承していないクラスで単振舞いのスタートや更新のイベント同様な処理を行えるクラスを作成します.
LifeCycleのイメージ図
using VContainer.Unity;

public class GamePresenter :
    IInitializable,
    IPostInitializable,
    IFixedTickable,
    IPostFixedTickable,
    ITickable,
    IPostTickable,
    ILateTickable,
    IPostLateTickable
{
    private readonly HelloWorldService hellowWorldService;


    public GamePresenter(
        HelloWorldService _helloWOrldService)
    {
        hellowWorldService = _helloWOrldService;
    }


    // Start()直前に呼ばれる.
    public void Initialize()
    {
        hellowWorldService.HelloWorld("Initialize");
    }


    // Start()直後に呼ばれる.
    public void PostInitialize()
    {
        hellowWorldService.HelloWorld("Postinitialize");
    }


    // FixedUpdate()直前に呼ばれる.
    public void FixedTick()
    {
        hellowWorldService.HelloWorld("FixedTick");
    }


    // FixedUpdate()直後に呼ばれる.
    public void PostFixedTick()
    {
        hellowWorldService.HelloWorld("PostFixedTick");
    }


    // Update()直前に呼ばれる.
    public void Tick()
    {
        hellowWorldService.HelloWorld("Tick");
    }


    // Update()直後に呼ばれる.
    public void PostTick()
    {
        hellowWorldService.HelloWorld("PostTick");
    }


    // LateUpdate()直前に呼ばれる.
    public void LateTick()
    {
        hellowWorldService.HelloWorld("LateTick");
    }


    // LateUpdate()直後に呼ばれる.
    public void PostLateTick()
    {
        hellowWorldService.HelloWorld("PostLateTick");
    }

}


実装しているインターフェースは其々コメントに書かれある通りのタイミングに呼ばれます.

テストオブジェクトの作成


最後に単振舞いを継承したテストオブジェクトクラスを作成します
using UnityEngine;
using VContainer;

public class TestObject : MonoBehaviour
{
    private HelloWorldService helloWorldService;


    // コンテナから取得.
    [Inject]
    public void Construct(HelloWorldService _helloWorldService)
    {
        Debug.Log("Inject");
        helloWorldService = _helloWorldService;
    }


    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            helloWorldService.HelloWorld("TestObject");
        }
    }
}

更新時にスペースキーを押下したらヘルワールドのhelloworld ()を呼び出すようにします.

シーンの作成


次にシーンを作成します
先ずコンテナを実装するためにGameLifeTimecopeオブジェクトを作成します、階層上で右クリック 空を作るで GameObjectを生成、gamelifetimescopecsをアタッチします.

このまま実行しても何も起きないので GameLifeTimecopeに手を加えます
using VContainer;
using VContainer.Unity;

public class GameLifetimeScope : LifetimeScope
{

    protected override void Configure(IContainerBuilder builder)
    {
        builder.Register<HelloWorldService>(Lifetime.Scoped);
        builder.RegisterEntryPoint<GamePresenter>(Lifetime.Singleton);
    }

}


利用される側のヘリカルワールドサービスクラスをビルダーに登録、その次に利用する側のゲーマーをビルダーに登録します.
そして実行
コンソールが以下の様になれば正常に動作しています、階層上にはは、Directionallightを打ちますオブジェクトの3つだけでありこのログを読んだオブジェクトがシーン上に配置されていないことがわかります.

次にGameObjectから利用する場合です.
GameLifeTimecopeに以下のように手を加えます.
using UnityEngine;
using VContainer;
using VContainer.Unity;

public class GameLifetimeScope : LifetimeScope
{

    [SerializeField] TestObject testObject;


    protected override void Configure(IContainerBuilder builder)
    {
        builder.Register<HelloWorldService>(Lifetime.Scoped);
        builder.RegisterEntryPoint<GamePresenter>(Lifetime.Singleton);

        // TODO : GameObjectとの紐付け( これ以外の方法があるかはまだわからない ).
        builder.RegisterComponent(testObject);
    }

}
次にシーン上にテストオブジェクトを配置します.
この時GameLifeTimecopeの検査官からテストオブジェクトをセットします.

これで実行
以下のようにコンソールが表示されれば成功です、スペースキーを押下したときにTestObject : HelloWorldが表示されてるのが確認できるはずです.

以上でとりあえずvコンテナを導入及び簡単なサンプルの作成までの手順です
ここに一応サンプルプロジェクトを配置しています見る必要はないと思いますが
より詳細の情報やゼイドのAPIとの対応表を確認したい人は 開発者のGitHubページにて確認できます