Взаимодействие с контроллерами
Varwin SDK предоставляет компонент, позволяющий легко настраивать взаимодействие контроллеров с Varwin объектом
Для этого необходимо добавить на Varwin объект компонент Interactable Object Behaviour
В инспекторе устанавливаются желаемые настройки взаимодействия, а также могут быть добавлены обработчики событий
- Is Grabbable - объект можно брать в руки и перетаскивать
- Is Usable - объект можно использовать
- Is Touchable - контур объекта подсвечивается при нахождении контроллера в области объекта
InteractableObjectBehaviour реализует публичные интерфейсы, необходимые для обработки событий ввода с контроллера
- IUseStartInteractionAware
- IUseEndInteractionAware
- IGrabStartInteractionAware
- IGrabEndInteractionAware
- ITouchStartInteractionAware
- ITouchEndInteractionAware
Эти интерфейсы могут быть реализованы разработчиком самостоятельно при написании скриптов для Varwin объектов
Основные интерфейсы для взаимодействия с контроллерами
IUseStartInteractionAware
Достаточно реализовать любой из пары интерфейсов (IUseStartInteractionAware
, IUseEndInteractionAware
), чтобы объект можно было использовать
public interface IUseStartInteractionAware : IVarwinInputAware
{
void OnUseStart(UseInteractionContext context);
}
OnUseStart
вызывается при нажатии триггера контроллера или левой кнопки мыши. Принимает параметр типа UsingContext
- ссылка на используемый контроллер, через нее можно получить ссылку на gameObject контроллера
IUseEndInteractionAware
Достаточно реализовать любой из пары интерфейсов (IUseStartInteractionAware
, IUseEndInteractionAware
), чтобы объект можно было использовать
public interface IUseEndInteractionAware : IVarwinInputAware
{
void OnUseEnd(UseInteractionContext context);
}
OnUseEnd
вызывается при отпускании триггера контроллера или левой кнопки мыши
IGrabStartInteractionAware
Достаточно реализовать любой из пары интерфейсов (IGrabStartInteractionAware
, IGrabEndInteractionAware
), чтобы объект можно было хватать и переносить
Реализация данного интерфейса подразумевает, что объект можно перетаскивать
public interface IGrabStartInteractionAware : IVarwinInputAware
{
void OnGrabStart(GrabInteractionContext context);
}
OnGrabStart
вызывается при нажатии захвата (grip) контроллера или правой кнопки мыши. Принимает параметр типа GrabbingContext
- ссылка на используемый контроллер, через нее можно получить ссылку на gameObject контроллера
IGrabEndInteractionAware
Достаточно реализовать любой из пары интерфейсов (IGrabStartAware
, IGrabEndAware
), чтобы объект можно было хватать и переносить
public interface IGrabEndInteractionAware : IVarwinInputAware
{
void OnGrabEnd(GrabInteractionContext context);
}
OnGrabEnd
вызывается при отпускании захвата (grip) контроллера или нажатии правой кнопки мыши (при условии, что объект уже в руке)
ITouchStartInteractionAware
Достаточно реализовать любой из пары интерфейсов (ITouchStartAware
, ITouchEndAware
), чтобы объект реагировал на касания
public interface ITouchStartInteractionAware : IVarwinInputAware
{
void OnTouchStart(TouchInteractionContext context);
}
OnTouchStart
вызывается при вхождении контроллера в область объекта
ITouchEndInteractionAware
Достаточно реализовать любой из пары интерфейсов (ITouchStartAware
, ITouchEndAware
), чтобы объект реагировал на касания
public interface ITouchEndInteractionAware : IVarwinInputAware
{
void OnTouchEnd(TouchInteractionContext context);
}
OnTouchEnd
вызывается при выхождении контроллера из области объекта
Дополнительные интерфейсы для взаимодействия с контроллерами
IGrabPointAware
Предоставляет методы, позволяющие получить transform точки объекта, к которой присоединяется контроллер (для левого и правого контроллера соответственно). Вызывается в момент присоединения объекта к контроллеру (on grab)
public interface IGrabPointAware
{
Transform GetLeftGrabPoint();
Transform GetRightGrabPoint();
}
IPointerClickInteractionAware
public interface IPointerClickInteractionAware : IVarwinInputAware
{
void OnPointerClick(PointerInteractionContext context);
}
OnPointerClick
вызывается при клике объекта лучом указки
IPointerInInteractionAware
public interface IPointerInInteractionAware : IVarwinInputAware
{
void OnPointerIn(PointerInteractionContext context);
}
OnPointerIn
вызывается при входе луча указки в область объекта
IPointerOutInteractionAware
public interface IPointerOutInteractionAware: IVarwinInputAware
{
void OnPointerOut(PointerInteractionContext context);
}
OnPointerOut
вызывается при выходе луча указки из области объекта
IPointerDownInteractionAware
public interface IPointerDownInteractionAware : IVarwinInputAware
{
void OnPointerDown(PointerInteractionContext context);
}
OnPointerDown вызывается при нажатии на контроллере или мышке по объекту.
IPointerUpInteractionAware
public interface IPointerDownInteractionAware : IVarwinInputAware
{
void OnPointerUp(PointerInteractionContext context);
}
OnPointerDown вызывается при прекращении нажатия на контроллере или мышке по объекту.
Дополнительная информация
В качестве аргумента в методах описанных выше интерфейсов используется тот или иной контекст.
Внутри каждого контекста содержатся данные о взаимодействии:
- InteractHand - GameObject руки, которая производит взаимодействие;
- Hand - тип взаимодействующей руки. Может принимать значения Left (для левой руки) и Right (для правой руки). Для платформ, на которых нет контроллеров (Desktop, NettleDesk, AR), в данной переменной всегда будет передоваться значение Right;
- ControllerSelf - внутренний класс Varwin, который определяет методы управления контроллером.
Если объект реализует оба типа взаимодействия (IPoiner[Action]InteractionAware
и I[Action]InteractionAware
), то приоритет будет отдаваться IPointer[Action]InteractionAware
. Например, если объект реализует IPointerDownInteractionAware
и IUseStartInteractionAware
, то при нажатии на объект будет вызван метод OnPointerDown(UIInteractionContext context)
из интерфейса IPointerDownInteractionAware
, а метод OnUseStart(UseInteractionContext context)
будет проигнорирован.
Grab Settings Component
Если необходимо, чтобы объект ложился в руку определенным образом, можно воспользоваться компонентом Grab Settings. Он позволяет задать точки к которым будет прикрепляться контроллер (для правой и левой рук соответственно) в момент захвата объекта