LoginSignup
2
0

【Unity】VContainerとUnity Screen Navigatorを同時に使う方法。

Last updated at Posted at 2023-11-21

VContainerとは

DI(Dependency Inject)のためのUnity Packageです。

Unity Screen Navigatorとは

Cyber Agent所属の矢野さんが開発したUI周りの超便利Unity Packageです。

今回やること

今回はUnityのアウトゲームをオニオンアーキテクチャで実装しようとしたときにUnity Screen Navigatorを使うと、当たり前ですが依存性注入できなくなったので、備忘録的に残します。

やり方

1.IPageContainerCallbackReceiverを実装したクラスを作成する。

このインターフェースは、Unity Screen Navigatorで提供される、Pageを切り替えたとき(Push及びPop)のコールバックを実装するためのものです。

2.作成したクラスにIObjectResolverの変数を渡せるようにする。

渡す形は、DIを使っても今回の例のように単純に渡してもどちらでもよいと思います。

また、BeforePush及びBeforePopの中この変数を使ってInjectGameObjectメソッドでPageのオブジェクトを登録すると、Injectすることができます。

3.ページを変えるクラスでコールバックを登録する。

Unity Screen NavigatorのPageContainerコンポーネントで提供されている、AddCallbackResolverメソッドに先ほど作成したクラスのインスタンスを渡します。
そうすると、完成です!

ソースコード

IPageContainerCallbackRecelverを実装したクラス(1, 2)
using UnityEngine;
using UnityScreenNavigator.Runtime.Core.Page;
using VContainer;
using VContainer.Unity;

public class VContainerPageCallbackRegister : IPageContainerCallbackReceiver
{
    private IObjectResolver _resolver;
    public VContainerPageCallbackRegister(IObjectResolver resolver)
    {
        _resolver = resolver;
    }
    public void BeforePush(Page enterPage, Page exitPage)
    {
        _resolver.InjectGameObject(enterPage.gameObject);
    }
    // 続く...
}
ページを変えることを司るクラス(3)
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityScreenNavigator.Runtime.Core.Page;
using VContainer;
using VContainer.Unity;

public class MainScreenPageManager : IInitializable
{
    private PageContainer _miniPageContainer;
    private IObjectResolver _resolver;

    [Inject]
    public MainScreenPageManager(PageContainer miniPageContainer, IObjectResolver resolver)
    {
        _miniPageContainer = miniPageContainer;
        _resolver = resolver;
    }

    public void Initialize()
    {
        _miniPageContainer.AddCallbackReceiver(new VContainerPageCallbackRegister(_resolver));
    }
    public async void ChangePage(string pageName)
    {
        _miniPageContainer.Push(pageName, true).ToUniTask(); 
    }
}

おわり

オニオンアーキテクチャ、意外に分かりやすくて実装していて楽しいです。
また、今回紹介した2つのパッケージ神なのでぜひ使ってください。
では、また。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0