この記事について
前回に引き続きRegister関連のメソッドを紹介していきます。
今回はUnityのMonoBehaviourを登録するRegisterを紹介します。
目次ページ: VContainer入門
RegisterComponent
基本的な使い方
MonoBehaviourを登録するには基本的にRegisterComponentを使います。1
すでに存在するインスタンスを登録する点ではRegisterInstanceと同じです。
RegisterInstanceとの違いは、登録したインスタンスに対してInjectされることです。
InjectされるタイミングはIObjectResolverが生成された直後です。
var testMonoBehaviour = GetComponent<TestMonoBehaviour>();
builder.RegisterComponent(testMonoBehaviour);
[Inject]
public Constructor(TestMonoBehaviour testMonoBehaviour) { }
RegisterComponentInHierarchy
基本的な使い方
RegisterComponentでは登録するMonoBehaviourのインスタンスを指定していました。
それに対してRegisterComponentInHierarchyでは登録する型だけを指定します。
その型のMonoBehaviourを、LifetimeScopeが配置されたシーン全体から自動的に探索します。
登録するインスタンスに対してInjectされるのはRegisterComponentと同じです。
// シーン中のどこかに存在するTestMonoBehaviourが登録される
builder.RegisterComponentInHierarchy<TestMonoBehaviour>();
[Inject]
public Constructor(TestMonoBehaviour testMonoBehaviour) { }
探索先を指定する
登録するMonoBehaviourをシーン全体ではなく指定した範囲から探すように指定できます。
UnderTransformでtransformを渡すとそのTransformの中から探索されます。
探される範囲は指定したTransformとその子孫です。
builder.RegisterComponentInHierarchy<TestMonoBehaviour>().UnderTransform(transform);
また、transformを直接指定する代わりにtransformを返すデリゲートを渡すこともできます。
builder.RegisterComponentInHierarchy<TestMonoBehaviour>().UnderTransform(() => transform);
RegisterComponentOnNewGameObject
基本的な使い方
RegisterComponentOnNewGameObjectではRegisterComponentInHierarchyと同じくMonoBehaviourの型を登録します。
RegisterComponentInHierarchyではすでに存在するMonoBehaviourを探して登録していました。
対してRegisterComponentOnNewGameObjectではresolveする時に新しく生成します。
具体的には新しいGameObjectを生成してそこに指定されたMonoBehaviourをアタッチします。
builder.RegisterComponentOnNewGameObject<TestMonoBehaviour>(Lifetime.Singleton);
// 新しいGameObjectにアタッチされたTestMonoBehaviourが渡される
[Inject]
public Constructor(TestMonoBehaviour testMonoBehaviour) { }
生成先を指定する
新しいGameObjectを生成するときの親となるtransformをUnderTransformで指定できます。
builder.RegisterComponentOnNewGameObject<TestMonoBehaviour>(Lifetime.Singleton).UnderTransform(transform);
GameObjectの名前を指定する
生成されるGameObjectの名前を指定できます。
指定しない場合は登録した型の名前になります。
builder.RegisterComponentOnNewGameObject<TestMonoBehaviour>(Lifetime.Singleton, "newGameObject");
RegisterComponentInNewPrefab
RegisterComponentOnNewGameObjectでは新しいGameObjectを生成してそこにアタッチしていました。
RegisterComponentInNewPrefabを使うとどのようなGameObjectを生成するかプレハブで指定できます。
TestMonoBehaviour prefab;
builder.RegisterComponentInNewPrefab<TestMonoBehaviour>(prefab, Lifetime.Singleton);
// 生成されたプレハブの中のTestMonoBehaviourが渡される
[Inject]
public Constructor(TestMonoBehaviour testMonoBehaviour) { }
生成先を指定する
プレハブを生成するときの親となるtransformをUnderTransformで指定できます。
builder.RegisterComponentInNewPrefab<TestMonoBehaviour>(prefab, Lifetime.Singleton).UnderTransform(transform);
UseComponents
UseComponentsを使うとUnderTransformの設定をまとめてできます。
builder.UseComponents(transform, componentsBuilder =>
{
// builder.RegisterComponentInHierarchy<TestMonoBehaviour>().UnderTransform(transform); と同じ
componentsBuilder.AddInHierarchy<TestMonoBehaviour>();
// builder.RegisterComponentOnNewGameObject<TestMonoBehaviour2>(Lifetime.Singleton).UnderTransform(transform); と同じ
componentsBuilder.AddOnNewGameObject<TestMonoBehaviour2>(Lifetime.Singleton);
// builder.RegisterComponentInNewPrefab(prefab, Lifetime.Singleton).UnderTransform(transform); と同じ
componentsBuilder.AddInNewPrefab(prefab, Lifetime.Singleton);
});
-
v1.8.0からMonoBehaviour以外のScriptableObjectなどでも使えるようです。 ↩