VContainer-registering/register-monobehaviour | 注册——注册 MonoBehaviour

通过 LifetimeScope 的 [SerializeField] 注册

[SerializeField]
YourBehaviour yourBehaviour;

// ...

builder.RegisterComponent(yourBehaviour);

:::note
RegisterComponentRegisterInstance 类似,唯一区别是:通过 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);
posted @   凌雪寒  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示