Я внедряю систему 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
и отфильтруйте по идентификатору сущности, чтобы увидеть, была ли построена нужная ратуша для совершения жертвы. В противном случае игнорируйте уведомление о появлении. Затем отпишитесь, как только жертва будет совершена. Это кажется слишком громоздким - ??