(RU) Observers - PixeyeHQ/actors.unity GitHub Wiki

Реактивные компоненты

В фреймворке можно подписаться на изменения переменной и произвести действие в момент изменения.

Когда это нужно

В основном это удобно для работы с интерфейсами которым часто требуется отслеживать параметры. Например здоровье героя.

Как подписаться

Вариант 1

Используя метод this.ValueChange() создать и вернуть абстрактную сущность с обозревателем.

	sealed class ProcessorTesting: Processor, ITick
	{

		public float hp;
		public ent observer;
		
		public ProcessorTesting()
		{
                        // где source = объект из которого берется переменная
			observer = this.ValueChange(source => hp, HandleChangeHP);
		}

                // метод который должен сработать с изменением. Возвращает изменившиеся значение.
		void HandleChangeHP(float val) 
                {
                         Debug.Log($"HP IS {val}"); 
                }
          }

Вариант 2

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

	sealed class ProcessorTesting: Processor, ITick
	{

		public float hp;
		public ent observer;
		
		public ProcessorTesting()
		{
                         // допустим это игрок
                        observer = Entity.Create();
                        // где source = объект из которого берется переменная
			this.ValueChange(source => hp, HandleChangeHP, observer);
		}

                // метод который должен сработать с изменением. Возвращает изменившиеся значение.
		void HandleChangeHP(float val) 
                {
                         Debug.Log($"HP IS {val}"); 
                }
          }

На заметку:
Можно вешать несколько обозревателей на одну сущность. Для этого достаточно продолжать передавать в метод -this.ValueChange() ту же сущность.

Как отписаться

Так как обозреватели живут на сущностях то они автоматически будут уничтожены вместе с сущностью. Метод this.ValueChange() возвращает новую сущность с обозревателем и закешировав ее можно потом вызвать Release

        public ent observer;
	public void Tick(float delta)
		{
			if (Input.GetKeyDown(KeyCode.A))
			{
				observer.Release();
			}
		}

Если нужно просто очистить стэк обозрения у сущности не уничтожая ее то можно воспользоваться observer.ReleaseObservers();

        public ent observer;
	public void Tick(float delta)
		{
			if (Input.GetKeyDown(KeyCode.A))
			{
				observer.ReleaseObservers();
			}
		}