VContainerでRootLifetimeScopeを使うときの設定【Unity,VContainer,DI】

はじめに

Unityでゲームを作る際に シーン間での値共有の方法がいくつかあると思います。
それらの方法を調査している中 (*1) で、VContainerの RootLifetimeScope を使う方法があります。
RootLifetimeScope を設定する際に少し手間取ったので、メモしておきます。

(*1) ほかの方法については以下の記事にいろいろ記載がありますので、こちらを参考にしました。

qiita.com

やりたいこと

  1. Loading シーンで Google SpreadSheetから取得したデータを 保存したい
  2. 1で取得したデータをゲーム内で使用したい
  3. (*1) 中にもあるようになるべく綺麗な実装にしたい

成果物

Loadingシーンでデバッグ表示されている リスト内データ数と 、Mainシーンでデバッグ表示されているリスト内データ数が同じことが以下の動画からわかります。
(わかりにくい場合は、cloneしてお試しください)

RootLifetimeScopeの作り方及び使い方

こちらは公式サイトほかのサイトがあるので、そちらを読めばわかる方もいるかと思います。
(私はわからずつよつよエンジニアに聞きました)

RootLifetimeScopeを作成

まずは ゲーム全体の Scopeで使える RootLifetimeScope を作ります。

今回は以下のような RootLifetimeScope クラスを作成しました。

using _Project;
using VContainer;
using VContainer.Unity;

public class RootLifetimeScope : LifetimeScope
{
    protected override void Configure(IContainerBuilder builder)
    {
        builder.Register<CharacterDataModel>(Lifetime.Singleton);
        builder.Register<InputSystemTest>(Lifetime.Singleton);
    }
}

次に 上記のクラスを GameObjectにアタッチをして、 Prefab化します。

最後に ProjectSettings > Player > Optimization > Preloaded Assetsに VContainerSettings がセットされていることを確認してください。
特にないもしなければ、生成時に入るかと思います。

これで RootLifetimeScope の作成は終了です。

各クラスから RootLifetimeScopeに注入されているクラスを使う

(Unity内では Loadingシーンと Mainシーンのどちらでも Rootにあるものを使っているのですが、説明上 Mainのみとさせて頂きます。
詳細はRepositoryからcloneしてご確認ください。 )

まずは シーン用の LifetimeScope を作成します。

using VContainer;
using VContainer.Unity;

namespace _Project.Main
{
    public class MainLifetimeScope : LifetimeScope
    {
        protected override void Configure(IContainerBuilder builder)
        {
            builder.RegisterEntryPoint<MainManager>();
        }
    }
}

これを 適当なオブジェクトにアタッチします。
このとき Parentは None のままで大丈夫です

以上で RootLifetimeScope が使えるようになっているかと思います。

Unityでゲーム起動時に スプレッドシートから データを取得する方法

こちらの機能のみを試したコードは以下のRepositoryにありますので、詳細は以下をご確認ください。

github.com