ねのぷろ! ~げーむ・ぷろぐらみんぐ・ぶろぐ〜

プログラミングやゲームについてだらだら書きます。https://twitter.com/nenowawon

Unity Zenjectを用いたマルチシーン設計について

こんにちは。ネノワヲンです。

今回は、Zenjectを用いたマルチシーン設計についての話をしたいと思います。

Unityバージョン : 2018.4.2f1

目次

マルチシーン設計とは

Unityでは複数シーンを同時に読み込み、使用することができます。

今回は、シーンを1つの機能として使おう、というお話です。

何が嬉しいか

色々な場面で使いまわし、かつ他の機能と組み合わせて使うものと相性がいいです。

例えば、ゲーム中のUI。シーンを見ながらレイアウトを変更することができるうえ、そのUIを変更する場合はシーンを1つ変更すればよくなり、変更漏れなどが少なくなります。

Zenjectとは

github.com

簡単に言うと、あるクラスが持つ変数にインスタンスを入れてくれるライブラリです。

本来であればインスタンスを登録するのは自分でやる必要がありますが、Zenjectを使用することで自動化ができたりします。

やってみた

まず、1つのシーンのみで作ってみます。

f:id:nenowawon:20190616163119g:plain

今回は、プレイヤーの座標を画面に表示するシンプルなシーンを作りました。

f:id:nenowawon:20190616164425p:plain このように、必要なクラスをインスペクターから設定しています。

このシーンをマルチシーンに分割していきます。

マルチシーンにする

シーンを複数作成します。 今回はメインシーン以外のカメラやライトは必要ないので消します。

f:id:nenowawon:20190616164158p:plain
UIシーンを追加

UI用のオブジェクトをUIシーンに移します。

f:id:nenowawon:20190616170626p:plain
シーンが違うと参照できない!!
unityでは、実行時にしか他のシーンのオブジェクトを参照できません。

Zenjectを使用することで、この問題を解決できるようになります。

Zenjectをインストール

assetstore.unity.com Zenjectをアセットストアからダウンロードします。

SceneContextを作る

Zenjectでは、インジェクトをしてくれるコンテナとして、いくつかのContextが用意されています。 今回は、シーン単位でインジェクトを行うSceneContextを作成します。 f:id:nenowawon:20190616172324p:plain

ZenjectBinding

シーン内のコンポーネントを登録しておくことで、自動的にインジェクトを行ってくれるZenjectBindingという機能を使います。

f:id:nenowawon:20190616172838p:plain 登録したコンポーネントをインジェクトしてもらうために、変数に[Inject]属性を付けます。

/// <summary>
    /// プレイヤークラス
    /// </summary>
    [Inject]
    private PlayerProvider playerProvider;

f:id:nenowawon:20190616173449p:plain
Serializeフィールドなしでシーン上のオブジェクトを取得

[Inject]が付いたすべてのオブジェクトにインスタンスをインジェクトしてくれます。

また、コンポーネントは複数登録できます。 f:id:nenowawon:20190616173818p:plain

シーンを超えたBinding

SceneContextは親子関係を持つことができます。

子シーンは、親シーンのオブジェクトもインジェクトできます。

親シーンのcontextのContractNamesを設定します。

f:id:nenowawon:20190616174801p:plain
名前を設定

子シーンのcontextのParentContractNamesに親シーンのコンテキスト名を入れます。

f:id:nenowawon:20190616175120p:plain
シーン名ではないので注意
後の手順は同じです。
f:id:nenowawon:20190616175444p:plain
Mainシーンのオブジェクトを参照できている

活用例

追記: 続き書きました。

nenowawon.hatenablog.com