Skip to content

AgentSelection

Компонент AgentSelection управляет визуальным выбором агента Agent с помощью наличия у него префаба с компонентом StatusBar во время щелчка мыши. Чтобы словить щелчек мыши, расширяется компонент TopCamera.

Сам компонент AgentSelection является управляющим, т.е. как правило весит в корне сцены, например на геймобъекте с названием World. При этом для функционирования свойство TopCamera должно быть заполнено прямо путем перетягивания в сцене юнити или программно.

TODO. В текущей реализации, в один момент времени, только один агент может быть выбран. Хотя можно развить этот класс настройкой управления выбором сразу нескольких агентов одновременно.

Расширение компонента TopCamera

Для реализации своей функциональности компонент AgentSelection сам (код находится в этом же файле, что и сам класс) дополняет компоненты TopCamera и Agent описанными ниже членами, часть описания приведенно лишь для понимания общей логики работы компонента и помечено с модификатором доступа (например, internal - доступ только из той же сборки при использовании класса), т.к. всю эту функциональность конечному разработчику использовать не нужно. Единственно, что требуется от конечного разработчика - это задать значение свойства слоя агентов у камеры (TopCamera.AgentLayer).

TopCamera.AgentLayer

LayerMask AgentLayer

Слой агентов, рейкаст которого можно отличить агентов от других слоев.

InitAgent

bool InitAgent (internal)

Компонент AgentSelection сам используя свой метод Awake() инициализирует возможность выбора агента (InitAgent = true), и подписывается на событие OnAgentTap, которое сам же расширяет в TopCamera и сам же его будет вызывать, используя метод с тем же названием OnAgentTap().

TopCamera.OnAgentTap

event AgentInfo OnAgentTap (internal)

Перехватывая событие камеры OnUpdate, будет ловится нажатие левой кнопки мыши и вызыватсья метод GetAgent(), который может возвратит агента. В случае успеха будет вызвано событие OnAgentTap со "словленным" агентом, иначе событие OnAgentTap так же возникнет при назатии на левую кнопку мыши, но только со значением =null.

TopCamera.GetAgent()

GameObject GetAgent(Vector2 touch) (protected internal virtual)

Используя координаты нажатия левой кнопки мыши (touch) создаст луч от камеры и сделает рейкаст с попыткой обнаружить объект помеченный как уровень агента (AgentLayer). Метод используется для обработки события OnAgentTap, но может быть переопределен разработчиком в наследнике, для получения агента по соответствующим координатам. Например, если его нужно получить по какому то другому принципу, а не по нажатию левой кнопки мыши.

Расширение компонента Agent

Для реализации своей функциональности компонент AgentSelection сам расширяет компонент Agent единственным свойством GameObject SelectionUI, которое в зависимости от префаба агента, должно быть в нем задано ссылаясь на юнити-объект, который визуализирует выбранного агента (в префабе по умолчанию - зеленная окружность в виде цели).

SelectedAgent

Agent SelectedAgent (OnlyRead, set private protected)

Компонент AgentSelection самостоятельно обеспечивает наличие в этом свойстве выбранного агента. Если агент перестает быть выбраным посылает событие прошлому агенту OnAgentDeselect, и если выбирается новый агент посылает событие OnAgentSelect. Перед событием OnAgentSelect обеспечивает инициализацию у этого агента его статус бара и выполняет дефолтную обработку показывая или скрывая визуальный выбор агента окружностью (подробнее см. StatusBar).

OnAgentTap()

OnAgentTap(Agent argAgent)

Агента (argAgent) выбрали или в результате внутренего события TopCamera.OnAgentTap или может использоваться для внешней эмуляции программного выбора.

Разный доступ для разных ролей разработчика

Можно выделить три уровня доступа для трёх разных ролей разработчика:

  1. Разработчик игры (внешний): Работает с публичным API (Agent.SelectionUI, подписка на события AgentSelection). Не может лезть во внутренности.

  2. Расширяющий библиотеку (соавтор): Работает через TacLibraryExt. Может подписываться на internal события (OnAgentTap) и переопределять internal/protected internal виртуальные методы (GetAgent), не создавая новых типов. Это ваша partial-философия.

  3. Автор мода (продвинутый): Работает через наследование. Может создать MyCamera : TopCamera и переопределить GetAgent, взяв на себя больше ответственности.