Обработка коллизий¶
Varwin SDK предоставляет интерфейс для обработки коллизий с объектами.
IColliderAware¶
IColliderAware
реализуется для так называемых зон, которые можно использовать для того, чтобы определять нахождение игрока или предметов в какой-либо области. Следовательно, при использовании интерфейса необходимо, чтобы коллайдер объекта был триггером.
public interface IColliderAware
{
void OnObjectEnter(Wrapper[] wrappers);
void OnObjectExit(Wrapper[] wrappers);
}
OnObjectEnter
вызывается, когда Varwin объект сталкивается с данным объектом. Аналог Unity метода OnTriggerEnter
для Varwin объектов.
OnObjectExit
вызывается, когда Varwin объекты перестают взаимодействовать. Аналог Unity метода OnTriggerExit
для Varwin объектов.
Как создать зону¶
В библиотеке объектов Varwin платформы существует объект Custom zone, который виден в режиме редактирования и невидим в режиме просмотра. Custom zone предоставляет события на вход объектов в зону и выход объектов из зоны.
Данный урок пошагово рассказывает о процессе создания объекта зоны, реагирующей на появление объектов. Для изменения видимости зоны в зависимости от режима работы GameMode
достаточно реализовать интерфейс IGameModeSubscriber.

Шаг 1. Создать куб, добавить его на слой Zones.
Подробнее: Varwin слои.

Добавить Kinematic Rigidbody

Установить на коллайдере Is Trigger

Создать прозрачный материал и назначить на куб

Шаг 2. Создать Varwin объект.
Подробнее: Создание объектов.
Теперь объект в сцене стал префабом, и на нем появились скрипты VarwinObjectDescriptor
и TutorialZone
.
TutorialZone
- основной скрипт объекта, наследник VarwinObject
.
Шаг 3. Реализация логики.
Открыть класс TutorialZone
, реализовать интерфейс IColliderAware
.
Создать делегат ZoneObjectHandler
- обработчик событий.
Создать события ObjectEnterEvent
и ObjectExitEvent
.
Пометить события атрибутами, позволяющими использовать их в blockly. Ссылка: подробнее про атрибуты.
Создать массив врапперов объектов, содержащихся в зоне в данный момент containedObjects.
Реализовать методы OnObjectEnter
и OnObjectExit
(см. код). Данные методы получают массив врапперов объектов, которые находятся в зоне в данный момент. Перед тем, как обновлять локальный массив врапперов необходимо сравнить локальный и обновленный массивы и вызвать соответствующее событие в случае изменения.
public class TutorialZone : VarwinObject, IColliderAware
{
public delegate void ZoneObjectHandler(Wrapper wrapper);
[EventGroup("collision events")]
[Event(English: "object entered zone")]
public event ZoneObjectHandler ObjectEnterEvent;
[EventGroup("collision events")]
[Event(English: "object exited zone")]
public event ZoneObjectHandler ObjectExitEvent;
private Wrapper[] containedObjects;
public void OnObjectEnter(Wrapper[] wrappers)
{
foreach (Wrapper obj in wrappers)
{
if(containedObjects == null || !containedObjects.ToList().Contains(obj))
{
ObjectEnterEvent?.Invoke(obj);
}
}
containedObjects = wrappers;
}
public void OnObjectExit(Wrapper[] wrappers)
{
foreach (Wrapper obj in containedObjects)
{
if (wrappers == null || !wrappers.ToList().Contains(obj))
{
ObjectExitEvent?.Invoke(obj);
}
}
containedObjects = wrappers;
}
}
Шаг 4. Сбилдить объект.
Подробнее: Билд объектов.
Шаг 5. Загрузить объект в платформу Varwin.
Подробнее: Импорт контента в платформу Varwin.
Добавить на сцену созданную зону, лампочку и любой объект, который можно переносить. Ссылка: Подробнее про редактирование сцены.
Подписаться в блокли на созданные события - при попадании в зону объекта лампочка включается, при выходе - выключается.

Шаг 6. Тестирование.
Запустить режим предпросмотра или просмотра.
Взять добавленный объект, войти с ним в зону - лампочка включилась, выйти из зона - лампочка выключилась. Все работает!