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);
} 
C#

OnUseStart вызывается при нажатии триггера контроллера или левой кнопки мыши. Принимает параметр типа UsingContext - ссылка на используемый контроллер, через нее можно получить ссылку на gameObject контроллера

IUseEndInteractionAware

Достаточно реализовать любой из пары интерфейсов (IUseStartInteractionAware, IUseEndInteractionAware), чтобы объект можно было использовать

public interface IUseEndInteractionAware : IVarwinInputAware
{
    void OnUseEnd(UseInteractionContext context);
}
C#

OnUseEnd вызывается при отпускании триггера контроллера или левой кнопки мыши

IGrabStartInteractionAware

Достаточно реализовать любой из пары интерфейсов (IGrabStartInteractionAware, IGrabEndInteractionAware), чтобы объект можно было хватать и переносить

Реализация данного интерфейса подразумевает, что объект можно перетаскивать

public interface IGrabStartInteractionAware : IVarwinInputAware
{
    void OnGrabStart(GrabInteractionContext context);
}
C#

OnGrabStart вызывается при нажатии захвата (grip) контроллера или правой кнопки мыши. Принимает параметр типа GrabbingContext - ссылка на используемый контроллер, через нее можно получить ссылку на gameObject контроллера

IGrabEndInteractionAware

Достаточно реализовать любой из пары интерфейсов (IGrabStartAware, IGrabEndAware), чтобы объект можно было хватать и переносить

public interface IGrabEndInteractionAware : IVarwinInputAware
{
    void OnGrabEnd(GrabInteractionContext context);
}
C#

OnGrabEnd вызывается при отпускании захвата (grip) контроллера или нажатии правой кнопки мыши (при условии, что объект уже в руке)

ITouchStartInteractionAware

Достаточно реализовать любой из пары интерфейсов (ITouchStartAware, ITouchEndAware), чтобы объект реагировал на касания

public interface ITouchStartInteractionAware : IVarwinInputAware
{
    void OnTouchStart(TouchInteractionContext context);
}
C#

OnTouchStart вызывается при вхождении контроллера в область объекта

ITouchEndInteractionAware

Достаточно реализовать любой из пары интерфейсов (ITouchStartAware, ITouchEndAware), чтобы объект реагировал на касания

public interface ITouchEndInteractionAware : IVarwinInputAware
{
    void OnTouchEnd(TouchInteractionContext context);
}
C#

OnTouchEnd вызывается при выхождении контроллера из области объекта

Дополнительные интерфейсы для взаимодействия с контроллерами

IGrabPointAware

Предоставляет методы, позволяющие получить transform точки объекта, к которой присоединяется контроллер (для левого и правого контроллера соответственно). Вызывается в момент присоединения объекта к контроллеру (on grab)

public interface IGrabPointAware
{
    Transform GetLeftGrabPoint();
    Transform GetRightGrabPoint();
}
C#

IPointerClickInteractionAware

public interface IPointerClickInteractionAware : IVarwinInputAware
{
    void OnPointerClick(PointerInteractionContext context);
}
C#

OnPointerClick вызывается при клике объекта лучом указки

IPointerInInteractionAware

public interface IPointerInInteractionAware : IVarwinInputAware
{
    void OnPointerIn(PointerInteractionContext context);
}
C#

OnPointerIn вызывается при входе луча указки в область объекта

IPointerOutInteractionAware

public interface IPointerOutInteractionAware: IVarwinInputAware
{
    void OnPointerOut(PointerInteractionContext context);
}
C#

OnPointerOut вызывается при выходе луча указки из области объекта

IPointerDownInteractionAware

public interface IPointerDownInteractionAware : IVarwinInputAware
{
    void OnPointerDown(PointerInteractionContext context);
}
C#

OnPointerDown вызывается при нажатии на контроллере или мышке по объекту.

IPointerUpInteractionAware

public interface IPointerDownInteractionAware : IVarwinInputAware
{
    void OnPointerUp(PointerInteractionContext context);
}
C#

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. Он позволяет задать точки к которым будет прикрепляться контроллер (для правой и левой рук соответственно) в момент захвата объекта