greatPretender писал(а):Это то, что надо. А Как подписаться на это событие?
Конечно есть нюансы, но допустим вот это класс Юнита:
Используется csharp
using System;
using UnityEngine;
public class Unit : MonoBehaviour
{
public enum Status { GoToRoute, FindRoute, FindSiege }
// это событие, которое сработает при смене статуса.
// В данный момент делегат Action, с одним параметром.
public event Action<Unit> statusChanged;
private Status _status;
public Status status
{
get { return _status;}
set
{
_status = value;
// при смене статуса, юнит запустит событие, если на него кто-то подписался
if (statusChanged != null) statusChanged(this);
}
}
}
А это класс какого-то другого объекта, который нашел Юнита и подписался на событие изменения его статуса:
Используется csharp
using UnityEngine;
public class SomeOtherClass : MonoBehaviour
{
void Start()
{
Unit unitInScene = GameObject.Find("nameUnit").GetComponent<Unit>();
unitInScene.statusChanged += Unit_statusChanged;
}
private void Unit_statusChanged(Unit obj)
{
// когда у unitInScene изменится статус (вне зависимости кто его изменил), то сработает вот этот метод.
// этот метод имеет ссылку на юнита, который вызвал событие.
}
}
Событие - это просто массив методов одинаковой сигнатуры по-сути. Сигнатура метода - это наличие и типы его параметров и тип возвращаемого значения. Изначально событие - пустое, в нём ничего нет. Но любой объект может "подписаться" на это событие, точнее просто добавить какой-то свой метод (который одинаковый по сигнатуре с событием) в список этого события. Подписка происходит с помощью +=, а отписка -= это важно. Любой объект, который подписывался на событие кого угодно, должен обязательно отписаться от всех событий перед своим уничтожением, иначе ссылки на методы (удалённого объекта) останутся висеть в списке события.
На событие может быть сколько угодно подписок.