AR в Unity

Что такое дополненная реальность?

Дополненная реальность (англ. — AR, augmented reality) — одна из самых перспективных технологий XXI века. Сферы применения — практически везде: от игровой индустрии до медицины.

Самый простой вариант AR — когда в твоем смартфоне при наведении на картинку или предмет появляется какое-нибудь изображение — особого удивления, конечно, не вызывает. А вот варианты, когда на изображение можно воздействовать и оно как-то откликается, вызывают восторг перед новыми технологиями. А ведь это еще не самая яркая разновидность дополненной реальности.

Вот несколько примеров:

Маски в социальных сетях
Маски в социальных сетях
Игры
Игры

Самое сложное в дополненной реальности — корректно спроецировать 3D-изображение на видео ряд. Условно можно выделить несколько подходов к решению этой задачи:

Геопозиция - использование навигации, чтобы определить позицию, в которой нужно отобразить объект.
Геопозиция — использование навигации, чтобы определить позицию, в которой нужно отобразить объект.
Распознавание поверхности - программа ищет прямые линии и пытается определить расположение поверхностей.
Распознавание поверхности — программа ищет прямые линии и пытается определить расположение поверхностей.
Распознавание лица - так, например, работают маски.
Распознавание лица — так, например, работают маски.

Как сделать AR приложение в Unity?

Для того, чтобы упростить задачу по проецированию объекта на поверхность, используют маркеры. Например такие:

Пример маркера для AR
Пример маркера для AR
Маркеры — это чаще всего простые черно-белые изображения, которые печатают на бумаге или упаковках. Принцип их работы напоминает штрих-коды или qr-коды: программе очень просто распознать контрастное черно-белое изображение. После того как маркер найден программой, программа считает его поверхностью и размещает поверх видео ряда с маркером виртуальный объект в нужном месте.

Для Unity есть замечательное решение, с помощью которого ты можешь опробовать маркерную AR — Dot AR.

DotAR в офисе Юниум
DotAR в офисе Юниум

Как работает DotAR?

На камере размещен скрипт, который сначала выключает игровой объект Board, находит элемент интерфейса Raw Image и транслирует на него видео с камеры (да, тебе нужна веб-камера, чтобы разрабатывать AR!). После этого скрипт постоянно анализирует кадры видео и ищет маркер. Если скрипт его находит, то он включает игровой объект Board и, если маркер меняет положение, скрипт также перемещает Board. Создается нужная нам иллюзия, которая в нашем случае и будет назваться AR.

Если тебе этого не достаточно, то мы можем сделать мини-игру, которая будет напоминать нам PokemonGo. Тебе понадобятся:

Первое, что нужно сделать — разместить 3D-модель покемона в том же месте, где находиться зеленый куб, а также сделать 3D-модель дочерним к игровому объекту Board:

Пикачу в кубе
Пикачу3

Куб тебе больше не нужен, поэтому его можно удалить. Теперь вместо куба, твоя программа будет проецировать покемона. Осталось сделать скрипт, с помощью которого можно будет его поймать 🙂

Создай новый скрипт и назови его Gotcha. Также создай кнопку, которой ты добавишь этот скрипт, у кнопки нужно заменить Source Image в окне Инспектор (как работать с интерфейсом?) на картинку с покеболом. Вот логика работы Gotcha.cs:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;  // чтобы все работало, необходимо подключить к скрипту интерфейс


public class Gotcha : MonoBehaviour {

    public int chance; // здесь ты сможешь указать значение от 0 до 100 в окне Инспектор - это шанс поймать покемона

    void Start()
    {
        // получаем и сохраняем компонент кнопки
        Button button = GetComponent< Button >();
        // передаем имя PrintClicked в AddListener.
        // onClick - событие клика
        button.onClick.AddListener(TryGotcha);
    }
    public void TryGotcha()
    {
        if (chance > Random.Range(0,100)) // генерируем число от 0 до 100
        {
            print("Попался!"); // если число, которое выпало меньше, чем шанс поймать покемона, то мы выводим сообщение о том, что покемон попался
        }
        else
        {
            print("Неудача!"); // если нет, то мы выводим сообщение о том, что у Игрока не получилось
        }
    }

}

Но, как ты заметил, покемон остается на своем месте. Теперь нужно научить твой скрипт, его ловить. Самый простой способ — просто удалять покемона 🙂

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;  // чтобы все работало, необходимо подключить к скрипту интерфейс


public class Gotcha : MonoBehaviour {

    public int chance; // здесь ты сможешь указать значение от 0 до 100 в окне Инспектор
    public GameObject pokemon; // в окне Инспектор нужно будет указать игровой объект с покемоном

    void Start()
    {
        // получаем и сохраняем компонент кнопки
        Button button = GetComponent< Button >();
        // передаем имя PrintClicked в AddListener.
        // onClick - событие клика
        button.onClick.AddListener(TryGotcha);
    }
    public void TryGotcha()
    {
        if (chance > Random.Range(0,100))
        {
            print("Попался!");
            Destroy(pokemon, 0f); // удаляем покемона
        }
        else
        {
            print("Неудача!");
        }
    }

}

Еще можно выводить победную надпись «Gotcha!» прямо в интерфейс. Вот как получилось у нас:

Gotcha!
Gotcha!

Делимся с тобой нашей версией проекта — Pokemon Example.7z — удачи!