Позвольте следующее:
A
: имеет несколько B
детей;
B
: является ребенком A
.
Все родительское => дочернее дерево должно быть уничтожено всякий раз, когда любая часть дерева уничтожается. Т.е. удалить B
, и он также должен удалить своего родителя A
и его B братьев и сестер. Удалите родительский элемент A
, и он также должен удалить своих B
потомков;
Проблема заключается в следующем: как предотвратить рекурсию здесь?
Например, если B
удаляется, после уничтожения он пытается уничтожить своего родителя A
(или его B
братьев и сестер), который, в свою очередь, также попытается уничтожить B
, который уже БЫЛ уничтожен.
Unity имеет странную перегрузку == operator
, которая позволяет проверить, уничтожен ли объект, но не позволяет узнать, уничтожен ли он.
Таким образом, я подумал о создании какой-то «расширенный» MonoBehaviour
класс, который я бы использовал в качестве основы для всех своих объектов вместо MonoBehaviour
.
. Этот вызов позволил бы мне получить дополнительные вещи, которые мне бы понравились иметь в стандарте MonoBehaviour
, например:
при уничтожении события;
при уничтожении события;
Уничтожается. Это решило бы мою проблему рекурсии:
Уничтожено;
Другие функции, которые были бы достаточно универсальными, чтобы присутствовать в любом компоненте, например, описанные выше.
Проблема с этим решением заключается в странном способе, которым Unity вызывает свои "методы события" (Awake()
, et c). Кажется, что Unity заботится только о методах событий, определенных в листовых классах. Таким образом, это решение потребовало бы от всех моих подклассов явного определения некоторых методов событий (Awake()
, OnDestroy()
) с единственной целью вызова тех же методов из базового класса (т. Е. "Extended" MonoBehaviour
).
Это кажется грязным, потому что очевидно, что Unity не хочет, чтобы люди использовали их движок, а также потому, что есть большие шансы, что в некоторых компонентах, где мне не понадобятся эти методы событий, я забуду по-прежнему объявлять их чтобы позвонить из базового класса.
Что бы вы сделали? Спасибо!