UE4 Делегаты: как подписаться на конкретное c успешное событие (прямая связь) в системе, которая передает все события всем слушателям - PullRequest
0 голосов
/ 06 января 2020

Я внедряю систему Spawn, основанную на делегатах в UE4, чтобы сделать spawnning как Event-Driven, насколько это возможно.

TLDR:

В системе, реализованной таким образом, что подписчик прослушивает все и каждый порожденные юниты, как мне подписаться на конкретную c сущность, которая успешно появляется (или не работает!)? * *

Проблемы:

  • Производительность, поскольку эти события могут происходить довольно часто. Если возможно, я бы хотел чтобы избежать подписки и фильтрации по идентификатору на рецепторе (так как это подразумевает, что все слушают событие, которое их не волнует). В типичной игре будет более 1000 сущностей.
  • Сохраняйте связь до минимума.

Длинное Объяснение:

По сути, у меня есть GlobalEventManager, в котором есть делегаты, которых можно вызывать / подписывать на глобальном уровне (неожиданно ...). Когда я хочу создать сущность, я звоню SpawnEntityRequest. Это позволяет каждой игровой системе, которая заботится о том, чтобы сущность порождалась, реагировать соответствующим образом (полностью отделенная). У меня даже есть SpawnEntityRequest, SpawnEntitySuccess, SpawnEntityFailure, чтобы разрешить больше специфических c реакций.

Теперь проблема: будучи асин c, цепочка выполнения останавливается после выполнения запроса Spawn. Затем, как мне объявить функциональность, которая зависит от успеха или неудачи при создании объекта, указанного c? По сути, я думаю об этом, как будто мне нужен обратный вызов там (на самом деле 2, onSuccess onFailure), но, возможно, я думаю об этом с неправильным мышлением. Причина, по которой я не хочу иметь обратные вызовы, состоит в том, что они позволяют мне обходить менеджер событий, который побеждает мою систему (которую я хочу применить для других).

Любые рекомендации о том, как подойти к этому ?


Реальный сценарий, который поднял проблему:

Когда я создаю ратушу, я хочу пожертвовать рабочим, который построил ее, если строительство будет успешным. Как я могу размножить работника, который должен быть принесен в жертву при рождении?

  • Добавить параметр WorkerToSacrifice в SpawnEntityRequest . Конечно, я этого не делаю.
  • Я могу добавить OnSuccess параметр обратного вызова к SpawnEntityRequest и вызвать эту функцию там. Проблема, обратный вызов должен был бы знать, какую сущность удалить, и я не уверен, как этого добиться, не добавляя рабочую сущность в качестве параметра. Это было бы так же плохо, как и первое решение.
  • Подпишитесь на SpawnEntitySuccess и отфильтруйте по идентификатору сущности, чтобы увидеть, была ли построена нужная ратуша для совершения жертвы. В противном случае игнорируйте уведомление о появлении. Затем отпишитесь, как только жертва будет совершена. Это кажется слишком громоздким
  • ??

Screenshot with an example of something I'd like to achieve

...