Можно ли внедрить компонент, с которым не связан prefab / GameObject? - PullRequest
0 голосов
/ 24 января 2019

У меня есть игровой объект (скажем, куб), который существует на сцене, и я хочу, чтобы в нем был инъекционный компонент.Например, я хочу сказать: у моего куба есть член IShotFirer, который может быть преобразован в компонент BoomShotFirer или BangShotFirer MonoBehavior, оба из которых реализуют IShotFirer.Когда происходит связывание, я хочу, чтобы этот компонент был добавлен к объекту куба.

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

Возможно ли это сделать без 1) необходимости в существующем сборном, содержащем один из этих компонентов Bang / Boom, или 2) нужен существующий объект сцены, к которому прикреплен один из этих компонентов?

Другими словами, я хочу иметь возможность динамически добавлять компонент к моему игровому объекту в зависимости от привязок и не полагаться ни на что, кромефайлы сценариев, которые определяют либо BoomShotFirer, либо BangShotFirer.Но документы, по-видимому, подразумевают, что мне нужно найти существующий игровой объект или префаб (например, используя .FromComponentsInChildren () и т. Д.)

1 Ответ

0 голосов
/ 11 августа 2019

Возможно ли это сделать без 1) необходимости в существующем сборном, содержащем один из этих компонентов Bang / Boom, или 2) без необходимости использования существующего объекта сцены, к которому прикреплен один из этих компонентов?

Да, это так.

Zenject предоставляет множество помощников, которые создают новые компоненты и связывают их - цитируя документы:

  • FromNewComponentOnRoot - создание экземпляра данного компонента в корне текущего контекста.Чаще всего это используется с GameObjectContext.

    Container.BindInterfacesTo<BoomShotFirer>().FromNewComponentOnRoot();
    
  • FromNewComponentOn - создание нового компонента данного типа для данного игрового объекта

    Container.BindInterfacesTo<BoomShotFirer>().FromNewComponentOn(someGameObject);
    
  • FromNewComponentOnNewGameObject - Создать новый игровой объект в корне сцены и добавить к нему Foo MonoBehaviour

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

    Для привязоккак этот, который создает новые игровые объекты, есть также дополнительные методы привязки , которые вы можете связать:

    • WithGameObjectName = Имя, чтобы дать новый игровой объектсвязанный с этой привязкой.
    • UnderTransformGroup (string) = Имя группы трансформации, в которую будет помещен новый игровой объект.
    • UnderTransform (Transform) = Фактическое преобразование для размещения нового игрового объекта.
    • UnderTransform (метод) = Метод для предоставления используемого преобразования.

Этот список даже не является исчерпывающим, обязательно проверьтеон readme и шпаргалка (из обоих я извлек информацию выше).


Также поймите, что, как обычно, вы можете добавить .AsSingle(), .AsTransient() и .AsCached() для достижения желаемого результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...