Отслеживание состояния компонентов через систему событий в Unity
Не могу до конца понять возможности системы событий в Unity и когда именно ее следует применять. Большинство туториалов по системе событий, с которыми удалось ознакомиться, показывают как устроены эвенты с точки зрения синтаксиса, но не дают представления о том, какие конкретно дают возможности события с точки зрения контроля происходящего в коде, особенно интересуют ситуации, когда можно использовать события, как альтернативу Upadate.
К примеру, такая ситуация. Есть Canvas, на нем есть компонент Canvas Group и в нем есть свойство Interactable. Это свойство динамически меняется через другие скрипты, соответственно, нет точного понимания, когда именно произойдет изменение свойства Interactable. Можно ли в данном случае использовать только систему событий и отследить момент, когда именно произойдет изменение свойства Interactable? То есть, можно ли заменить этот код:
_canvasGroup = Canvas.GetComponent<CanvasGroup>();
void Update()
{
if (_canvasGroup.interactable == true)
//action
}
на примерно что-то такое:
Event OnCanvasChanged;
void Start()
{
OnCanvasChanged.AddListener(Cnanging);
}
void Changing()
{
if(_canvas.interactable == true)
{
//action
}
if (_canvas.interactable == false)
{
//action
}
}
Или без Update все равно не обойтись? Заранее спасибо за любую помощь и подсказки.
Ответы (1 шт):
При изменении _canvas.interactable вызывать ивент, на этот ивент подписать нужные методы.
public class SomeCanvas : MonoBehaviour
{
public event Action<bool> ActiveStateChanged;
[SerializeField] private CanvasGroup _canvasGroup;
public void Activate()
{
SetActiveState(true);
}
public void Deactivate()
{
SetActiveState(false);
}
private void SetActiveState(bool state)
{
if (_canvasGroup.interactable == state) return;
_canvasGroup.interactable = state;
ActiveStateChanged?.Invoke(state);
}
}
public class NotSomeCanvas : MonoBehaviour
{
[SerializeField] private SomeCanvas _someCanvas;
private void OnEnable()
{
_someCanvas.ActiveStateChanged += LogActiveState;
}
private void OnDisable()
{
_someCanvas.ActiveStateChanged -= LogActiveState;
}
private void LogActiveState(bool state)
{
print($"Current state - {state}");
}
}
В SomeCanvas ивент вызывается, когда вызывают методы Activate/Deactivate.
В NotSomeCanvas подписываем в OnEnable метод LogActiveState на событие, соответственно в OnDisable отписываем.
Повнимательнее почитай о событиях, там, скорее всего, почти такой же пример и показывают.
нет точного понимания, когда именно произойдет изменение свойства Interactable А оно должно быть. Вызывая методы Activate/Deactivate хотя бы будет понятно откуда происходят изменения.