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つのパッケージ神なのでぜひ使ってください。
では、また。