Pull to refresh

Comments 4

Это не лучше и не хуже. Это просто немного другой подход, дающий возможность отказаться от использования стандартных .NET-событий, которые могут привести к серьёзным проблемам с утечкой памяти. А так же, это более консистентно вписывается в EventSystem поставляемую с Unity UI. К дополнительным преимуществам этого способа можно отнести возможность работы с обработчиками событий как с обычными компонентами Unity(например, всегда можно получить ссылку на обработчик через GetComponent<BroadcastInputModule>()).
1. Если я правильно понимаю lifecycle объектов в Unity, то вызов Unregister... в методе OnDestroy позволяет не беспокоиться об утечках памяти на подписках на события и не использовать WeakReference.

2. Хорошей практикой считается использование в игре пулла игровых объектов. Т.е. в игре с пуллом OnDestroy не будет вызываться для большинства объектов. Соответственно, нужен другой механизм регистрации и отписки. Например, вызывать Unregister... перед возвратом объекта в пулл.
1. Все верно.
2. UI System и, в частности, ExecuteEvents.Execute устроен так, что не обрабатывает неактивные объекты (которые отсутствуют в иерархии сцены, свойство enabled=false и те для которых был вызван OnDisable). Недостаток приведенной реализации в том что при вызове BroadcastExecuteEvents.Execute в цикле foreach ExecuteEvents.Execute будет вызван даже для неактивных объектов, но сам ExecuteEvents.Execute такие объекты проигнорирует.
Это можно решить изменив коллекцию с подписками. Регистрировать не GameObjects, а UIBehaviours, ибо в классе UIBehaviour определен метод IsActive() который можно использовать для избежания лишних вызовов.
Sign up to leave a comment.

Articles

Change theme settings