Общая схема работы

Стандарт определяет базовые аспекты поведения игровой камеры (такие как позиционирование, ориентация, коллизии и т.д.), а также определяет управляемого игроком аватара. Основная идея заключается в том, что игрок отождествляется с камерой, поэтому все компоненты, через которые пользователь взаимодействует с игрой, находятся внутри объекта игровой камеры (что изображено на схеме ниже):

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/55489b5a-cf24-4fcf-9d6d-e511861c95aa/Untitled.png

Другими словами, игровая камера является точкой коммуникации пользователя с игровым миром. В свою очередь, игровой мир состоит из объектов, которые можно условно разделить на две категории: управляемые и неуправляемые. Управляемые объекты (они же аватары) могут быть взяты под контроль игровой камерой. Для этого игровая камера должна находиться внутри аватара по иерархии сцены. В зависимости от подконтрольного аватара, игровая камера подгружает соответствующий интерфейс (он же Avatar layout), а также применяет настройки активного режима обзора. Если игровая камера не контролирует аватаром, то подгружается её собственный интерфейс, и игрок переходит в режим свободного наблюдения (может произвольно перемещаться и вращаться).

Помимо игровой камеры, аватаром может управлять ИИ компонент (тогда аватар становится NPC), а также, в случае игры по сети, аватар может управляться удалённо другим игроком. Также возможна ситуация, когда игровая камера вложена внутрь нескольких аватаров (например, когда игрок управляет персонажем и садится за руль вездехода), в этом случае игровая камера берёт под контроль аватара самого верхнего уровня иерархии.

Теперь рассмотрим компоненты стандарта более детально.

Player Camera Controller

Компонент PlayerCameraController отвечает за определение подконтрольного аватара и инициализацию интерфейса аватара, коллизии аватара и активного режима камеры. Логика компонента отрабатывает в момент инициализации (Start()), а также в моменты перемещения по иерархии сцены (OnTransformParentChanged()). Как следует из названия, компонент прикреплён непосредственно к объекту игровой камеры, на аватары он не добавляется. В редакторе PlayerCameraController выглядит следующим образом:

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/ab42b42f-10ba-4a76-90fb-3402910598e4/Untitled.png

Поле Controllable Avatar является ссылкой на компонент AvatarOverallInput подконтрольного аватара, который определяется самим PlayerCameraController. В поле Avatar Layout Parent указывается ссылка на Rect transform, в котором будет размещаться интерфейс подконтрольного аватара. Поле Player Index используется Стандартом конфигурации ввода для подгрузки настроек управления для соответствующего игрока.

Camera View Controller

Компонент CameraViewController отвечает за расчёт обзора камеры (положение, ориентация, поле зрения и учёт коллизий с окружением) в зависимости от настроек режима обзора. Как и PlayerCameraController, CameraViewController прикреплён к объекту игровой камеры, и его редактор выглядит следующим образом:

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/993bde97-bcd3-43a8-9a05-3279909d1348/Untitled.png

В поле View Delta Direction записано имя поля ввода компонента AvatarOverallInput, отвечающее за управление обзором аватара.

Параметр Is In Selection Cycle используется компонентом CameraViewConfiguration и описан в соответствующем разделе.

Параметр Origin хранит ссылку на Transform, положение которого является центром обзора камеры. Параметры Origin Up Source и Origin Forward Source используются для настройки источников осей "вверх" и "вперед" для игровой камеры, которые используются в расчётах поворота камеры. Параметр Origin Up Source может принимать одно из следующих значений: