1

我有一个存在于场景中的游戏对象(比如说一个立方体),我希望它有一个可注入的组件。例如,我想说:我的多维数据集有一个 IShotFirer 成员,它可以解析为 BoomShotFirer 或 BangShotFirer MonoBehavior 组件,两者都实现了 IShotFirer。发生绑定时,我希望将此组件添加到多维数据集对象中。

public class CubeBehavior : MonoBehaviour
{
    [Inject]
    private IShotFirer shotFirer;
}

是否可以在没有 1) 需要包含这些 Bang/Boom 组件之一的现有预制件或 2) 需要附加了这些组件之一的现有场景对象的情况下做到这一点?

换句话说,我希望能够根据绑定动态地将组件添加到我的游戏对象中,并且不依赖于定义 BoomShotFirer 或 BangShotFirer 的脚本文件以外的任何内容。但是文档似乎暗示我需要找到一个现有的游戏对象或预制件(例如使用.FromComponentsInChildren()等)

4

1 回答 1

2

是否可以在没有 1) 需要包含这些 Bang/Boom 组件之一的现有预制件或 2) 需要附加了这些组件之一的现有场景对象的情况下做到这一点?

是的。

Zenject 提供了许多帮助程序来创建新组件并绑定它们——引用文档:

  • FromNewComponentOnRoot - 在当前上下文的根上实例化给定组件。这最常与GameObjectContext.

    Container.BindInterfacesTo<BoomShotFirer>().FromNewComponentOnRoot();
    
  • FromNewComponentOn - 在给定的游戏对象上实例化给定类型的新组件

    Container.BindInterfacesTo<BoomShotFirer>().FromNewComponentOn(someGameObject);
    
  • FromNewComponentOnNewGameObject - 在场景的根目录创建一个新的游戏对象并添加FooMonoBehaviour

    Container.BindInterfacesTo<BoomShotFirer>().FromNewComponentOnNewGameObject();
    

    对于像这样创建新游戏对象的绑定,还可以链接额外的绑定方法

    • WithGameObjectName = 赋予与此绑定关联的新游戏对象的名称。
    • UnderTransformGroup(string) = 放置新游戏对象的变换组的名称。
    • UnderTransform(Transform) = 放置新游戏对象的实际变换。
    • UnderTransform(Method) = 提供要使用的转换的方法。

该列表甚至不是详尽无遗的,请务必检查自述文件和备忘单(我从这两个文件中提取了上面的信息)。


还要了解,像往常一样,您可以附加.AsSingle(),.AsTransient().AsCached()达到预期的结果。

于 2019-08-11T12:12:38.520 回答