V 용기の導入と基本的な使い方 버전 0.9.0(備忘録 )

14781 단어 csharpvcontainerunity
自分用の備忘録記事
最近新しくリリースされたシンプルなDI 회사コンテナライブラリのV 용기の導入方法をメモ

環境


Unity 2018.4.14.f1
VContainer 버전 0.9.0

導入方法


githubから直接단위 포장をDLしてプロジェクトにインストールする方法とUnityPackageManagerでインストールする方法がある、今回は단위 포장を直接インストールする方法をとる
GitHub のリリースページから0.9.0の단위 포장をDLし、プロジェクトにインポート
この時、표시jsonにnuget.mono-cecil": "0.1.6-previewの指定を追加
これで特にエラーが無ければまずは導入成功

簡単なサンプル


次にV 용기を利用した簡単なサンプルを作成します.
V 용기には疑似的に단일 행위の시작하다や현대화하다イベントと似た様な処理を行うことが出来る仕組みがあるので(단일 비헤이비어を利用しないクラスで단일 행위の현대화하다同様に毎フレーム何かの処理をする等を行えるように )そのサンプルと단일 행위を継承した通常の게임 대상のコンポーネントから利用する方法の二通りを作成します.

HelloWorldServiceの作成


先ずはゲームを通じて利用するHelloWorldServiceクラスを作成します、呼び出し元確認用に한 줄で引数をとりいつ呼ばれたかをコンソールに表示します、 このクラスは단일 행위を継承しないクラスとします.
using UnityEngine;

public class HelloWorldService
{

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

}

게임 수명 범위の作成


Zenject 회사で言うところの장면 텍스트を作成します
항목 창で右クリック 만들기 > C# 스크립트でファイル名に *수명 범위と記述すると自動でテンプレートスクリプトを作成します.
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");
        }
    }
}

현대화하다時にスペースキーを押下したらHello World Serice 회사のHelloWorld()を呼び出すようにします.

장면の作成


次にシーンを作成します
先ずコンテナを実装するために게임 수명 범위オブジェクトを作成します、등급 제도上で右クリック 빈 만들기で 게임 대상を生成、게임 수명 범위.반테러 정예をアタッチします.

このまま実行しても何も起きないので 게임 수명 범위に手を加えます
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);
    }

}


利用される側のHelloWorldServiceクラスを건설자に登録、その次に利用する側の게임 발표자を건설자に登録します.
そして実行
コンソールが以下の様になれば正常に動作しています、등급 제도上には메인 카메라, 방향등, 게임 수명경オブジェクトの삼.つだけでありこのログを読んだオブジェクトがシーン上に配置されていないことがわかります.

次に게임 대상から利用する場合です.
게임 수명 범위に以下のように手を加えます.
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);
    }

}
次にシーン上に테스트 대상を配置します.
この時게임 수명 범위の검사원から테스트 대상をセットします.

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

以上でとりあえずV 용기を導入及び簡単なサンプルの作成までの手順です
ここ に一応サンプルプロジェクトを配置しています見る必要はないと思いますが
より詳細の情報やZenject 회사の미국 석유 학회との対応表を確認したい人は 開発者のGitHubページ にて確認できます

좋은 웹페이지 즐겨찾기