はじめに
Unityでゲームを作る際に シーン間での値共有の方法がいくつかあると思います。
それらの方法を調査している中 (*1) で、VContainerの RootLifetimeScope
を使う方法があります。
RootLifetimeScope
を設定する際に少し手間取ったので、メモしておきます。
(*1) ほかの方法については以下の記事にいろいろ記載がありますので、こちらを参考にしました。
やりたいこと
Loading
シーンで Google SpreadSheetから取得したデータを 保存したい- 1で取得したデータをゲーム内で使用したい
- (*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にありますので、詳細は以下をご確認ください。