15
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

VContainer入門(4) - MonoBehaviourのRegister

Last updated at Posted at 2021-05-09

この記事について

前回に引き続き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);
});
  1. v1.8.0からMonoBehaviour以外のScriptableObjectなどでも使えるようです。

15
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?