Unity Zenjectを用いたマルチシーン設計について
こんにちは。ネノワヲンです。
今回は、Zenjectを用いたマルチシーン設計についての話をしたいと思います。
Unityバージョン : 2018.4.2f1
目次
マルチシーン設計とは
Unityでは複数シーンを同時に読み込み、使用することができます。
今回は、シーンを1つの機能として使おう、というお話です。
何が嬉しいか
色々な場面で使いまわし、かつ他の機能と組み合わせて使うものと相性がいいです。
例えば、ゲーム中のUI。シーンを見ながらレイアウトを変更することができるうえ、そのUIを変更する場合はシーンを1つ変更すればよくなり、変更漏れなどが少なくなります。
Zenjectとは
簡単に言うと、あるクラスが持つ変数にインスタンスを入れてくれるライブラリです。
本来であればインスタンスを登録するのは自分でやる必要がありますが、Zenjectを使用することで自動化ができたりします。
やってみた
まず、1つのシーンのみで作ってみます。
今回は、プレイヤーの座標を画面に表示するシンプルなシーンを作りました。
このように、必要なクラスをインスペクターから設定しています。
このシーンをマルチシーンに分割していきます。
マルチシーンにする
シーンを複数作成します。 今回はメインシーン以外のカメラやライトは必要ないので消します。
UI用のオブジェクトをUIシーンに移します。 unityでは、実行時にしか他のシーンのオブジェクトを参照できません。
Zenjectを使用することで、この問題を解決できるようになります。
Zenjectをインストール
assetstore.unity.com Zenjectをアセットストアからダウンロードします。
SceneContextを作る
Zenjectでは、インジェクトをしてくれるコンテナとして、いくつかのContextが用意されています。 今回は、シーン単位でインジェクトを行うSceneContextを作成します。
ZenjectBinding
シーン内のコンポーネントを登録しておくことで、自動的にインジェクトを行ってくれるZenjectBindingという機能を使います。
登録したコンポーネントをインジェクトしてもらうために、変数に[Inject]属性を付けます。
/// <summary> /// プレイヤークラス /// </summary> [Inject] private PlayerProvider playerProvider;
[Inject]が付いたすべてのオブジェクトにインスタンスをインジェクトしてくれます。
また、コンポーネントは複数登録できます。
シーンを超えたBinding
SceneContextは親子関係を持つことができます。
子シーンは、親シーンのオブジェクトもインジェクトできます。
親シーンのcontextのContractNamesを設定します。
子シーンのcontextのParentContractNamesに親シーンのコンテキスト名を入れます。 後の手順は同じです。
活用例
マルチシーン。 pic.twitter.com/XfE7gGilbi
— ネノワヲン@ねのぷろ! (@nenowawon) 2019年6月16日
デバッグシーンを追加。 pic.twitter.com/fsxd8qC6sG
— ネノワヲン@ねのぷろ! (@nenowawon) 2019年6月16日
追記: 続き書きました。