VContainer-registering/register-monobehaviour | 注册——注册 MonoBehaviour
通过 LifetimeScope 的 [SerializeField] 注册
[SerializeField]
YourBehaviour yourBehaviour;
// ...
builder.RegisterComponent(yourBehaviour);
:::note
RegisterComponent 和 RegisterInstance 类似,唯一区别是:通过 RegisterComponent 注册的 MonoBehaviour 即使未被显式解析,也会自动注入依赖。
:::
从场景中注册(带 LifetimeScope)
builder.RegisterComponentInHierarchy<YourBehaviour>();
:::note
RegisterComponentInHierarchy 的生命周期固定为 Scoped,因为它的生命周期与场景一致。
:::
注册 prefab 预制体组件(解析时动态生成)
[SerializeField]
YourBehaviour prefab;
// ...
builder.RegisterComponentInNewPrefab(prefab, Lifetime.Scoped);
注册到新 GameObject 的组件(解析时创建)
builder.RegisterComponentOnNewGameObject<YourBehaviour>(Lifetime.Scoped, "NewGameObjectName");
以接口形式注册组件
builder.RegisterComponentInHierarchy<YourBehaviour>()
.AsImplementedInterfaces();
注册到指定父级 Transform
// 在指定父级下创建新 GameObject
builder.RegisterComponentOnNewGameObject<YourBehaviour>(Lifetime.Scoped)
.UnderTransform(parent);
// 在指定父级下实例化预制体
builder.RegisterComponentInNewPrefab(prefab, Lifetime.Scoped)
.UnderTransform(parent);
// 在指定父级下查找现有组件
builder.RegisterComponentInHierarchy<YourBehaviour>()
.UnderTransform(parent);
或运行时动态获取父级:
builder.RegisterComponentOnNewGameObject<YourBehaviour>(Lifetime.Scoped)
.UnderTransform(() => {
// ...
return parent;
});
注册为 DontDestroyOnLoad
RegsiterComponent* 方法链可以设置为 DontDestroyOnLoad:
// 新创建的 GameObject 不随场景销毁
builder.RegisterComponentOnNewGameObject<YourBehaviour>(Lifetime.Scoped)
.DontDestroyOnLoad();
// 实例化的预制体对象不随场景销毁
builder.RegisterComponentInNewPrefab(prefab, Lifetime.Scoped)
.DontDestroyOnLoad();
批量注册 MonoBehaviour
builder.UseComponents(components =>
{
components.AddInstance(yourBehaviour);
components.AddInHierarchy<YourBehaviour>();
components.AddInNewPrefab(prefab, Lifetime.Scoped);
components.AddOnNewGameObject<YourBehaviour>(Lifetime.Scoped, "name");
});
等价于逐条注册:
builder.RegisterComponent(yourBehaviour);
builder.RegisterComponentInHierarchy<YourBehaviour>();
builder.RegisterComponentInNewPrefab(prefab, Lifetime.Scoped);
builder.RegisterComponentOnNewGameObject<YourBehaviour>(Lifetime.Scoped, "name");
指定父级批量注册:
builder.UseComponents(parentTransform, components =>
{
// 在 `parentTransform` 下查找 GetComponentInChildren
components.AddInHierarchy<YourBehaviour>();
// 在 `parentTransform` 下实例化
components.AddInNewPrefab(prefab, Lifetime.Scoped);
components.AddOnNewGameObject<YourBehaviour>(Lifetime.Scoped, "name");
})
等价于:
builder.RegisterComponentInHierarchy<YourBehaviour>()
.UnderTransform(parentTransform);
builder.RegisterComponentInNewPrefab(prefab, Lifetime.Scoped)
.UnderTransform(parentTransform);
builder.RegisterComponentOnNewGameObject<YourBehaviour>(Lifetime.Scoped, "name")
.UnderTransform(parentTransform);

浙公网安备 33010602011771号