今回は Zenject で、シーンをまたいで Inject する方法です。

Manager シーンと StageX シーンに分けてあるのを見かける

Unity でのゲーム制作で、Manager シーンと StageX シーンに分けて作る方法をたまに見かけます。

Manager
シーンには各ステージ共通で利用される GameManager、UIなどを置き、StageX シーンでは各ステージ固有の地形や敵の配置を作り込む感じです。

スクリーンショット (954).png

「Manager シーンと Stage1 シーン」「Managerシーン と Stage2 シーン」という組み合わせで各ステージが動作する仕組み。

これがどれくらい一般的なのか、パフォーマンスはどうなのか等、詳しいことはよく分かりませんが、共通のオブジェクトを各シーンにコピペするよりも、たしかにスマートな感じはします。(あとでちゃんと勉強します)

しかし、他のシーンのオブジェクトやコンポーネントを参照しようとすると、1シーン内で完結しているときよりもちょっと複雑になります。


簡単にできるよ。そう、Zenject ならね

Zenject ならシーンをまたいで、StageX シーンのクラスで Manager シーンのコンポーネントを Inject するようなことが簡単にできます。

方法は、こちらの記事の「マルチシーンでシーンをまたいでインジェクトする」に書かれているとおりです。

やってみた

実際にやってみました。

Manager シーンの設定

Manager シーンの SceneContext Contract Names の Size を 1 にして、Element 0 に Manager と入力します。
スクリーンショット (935).png

StageX シーンの設定

StageX シーンにも SceneContext を置きます。こちらは Parent Contract Names の Size を 1 にして、Element 0 に Manager と入力します。
スクリーンショット (936).png

あとはこちらの記事で紹介したものから変更なし。

これで問題なくシーンをまたいで、StageX 側(子シーン)にあるクラスから、Manager シーン(親シーン)側でバインドされているコンポーネントを Inject できます。


今回の方法では、親シーンから子シーンのバインドを見に行くことはできない

ただし今回の方法(SceneContext の親子関係設定)では、逆方向、Manager シーン(親シーン)側のクラスで、StageX シーン(子シーン)側にバインドされているコンポーネントを Inject することはできません。

※ SceneDecoratorContext を使うと実現できるらしいのですが、なぜかうまくいかず。。。



まだまだ奥が深そうな Zenject ですが、検証はいったんここまでに留めて、この先は必要に迫られたときに掘っていきたいと思います。

今回は以上です。