Reality Composer - это новое приложение для создания опыта дополненной реальности с помощью Xcode. Когда в сцену добавлен 3D-объект или сущность, это позволяет вам создавать последовательности действий, которые анимируют, перемещают или трансформируют эту сущность. Каждая последовательность действий имеет множество триггеров, от столкновений с другими объектами до «столкновений» с камерой, от касания экрана до начала сцены. В этом руководстве показано, как вы можете использовать ни один из них и вместо этого напрямую связывать элементы управления SwiftUI с настраиваемыми последовательностями действий.

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

Когда вы открываете Xcode, создайте новый проект с шаблоном приложения дополненной реальности. Первые два файла, которые вам следует изменить, - это файлы ContentView и AppDelegate, которые будут точно такими же, как и в моем последнем руководстве Создайте свое первое приложение AR с RealityKit и SwiftUI. AppDelegate находится примерно на полпути, а ContentView - в конце. AppDelegate устанавливает ссылку на класс DataModel, который мы скоро создадим. Это позволяет нам постоянно хранить данные в Swift, которые в противном случае существовали бы только в файле реальности. ContentView объединяет пользовательский интерфейс и окно AR, если AR включен.

Вам также потребуется скопировать ARDisplayView из этого учебника, который возвращает объект ARView из класса DataModel, а не создает новый.

Файл реальности использует формат файла Apple для хранения одной или нескольких сцен AR и каждого объекта Entity 3D внутри них.

Если вы дважды щелкните файл Experience.rcproject Reality File, вы увидите предварительный просмотр сцены «Коробка», которая по сути представляет собой стальную коробку в начале координат. Нажав кнопку «Открыть в Reality Composer» в правом верхнем углу, вы сможете напрямую редактировать файл. Когда Reality Composer откроет файл, нажмите кнопку «Поведение» в правом верхнем углу. Это должно вызвать панель внизу экрана. Нажмите кнопку «плюс», чтобы создать новое поведение, прокрутите всплывающее окно вниз и нажмите «Пользовательский». Это позволяет вам выбрать любой триггер для поведения в вашем файле реальности. Щелкните в любом месте поля с надписью «Добавить триггер к этому поведению». Прокрутите всплывающее окно вниз и выберите «Уведомление». В текстовом поле «Идентификатор» уведомления напишите «Событие триггера».

Теперь вы можете добавить собственное действие. После того, как вы нажмете «Добавить действие в последовательность», вы можете выбрать любое действие из списка. Emphasize позволяет использовать встроенную анимацию RealityKit. Вы можете скрыть поле, но, поскольку оно уже отображается по умолчанию, при выборе «Показать» ничего не произойдет. Вы можете переместить его, добавить силу, чтобы «толкнуть» его, или воспроизвести звук.

Что бы вы ни выбрали, убедитесь, что вы выбрали стальной ящик как Затронутый объект. Если вы забудете сделать это позже, вы можете нажать кнопку «Выбрать» рядом с «Затронутые объекты», а затем щелкнуть стальной ящик в сцене, чтобы выбрать его. Если вы все сделали правильно, он должен быть зеленым. Нажмите кнопку «Готово» там, где раньше была кнопка «Выбрать». Теперь вы можете добавить еще одно действие, которое на этот раз будет уведомлением. Верно, мы хотим отправить уведомление из вашего кода, чтобы запустить действие, которое отправляет уведомление в ваш код. Без этого наш код Swift не знал бы, было ли уведомление успешно передано в файл реальности или нет.

Не забудьте добавить сюда стальной ящик как Затронутый объект.

Давайте сделаем наш пользовательский интерфейс, который не займет много времени с SwiftUI!

Поскольку у нас есть действие, которое уведомляет код о завершении последовательности действий, я решил, что мы внесем постоянные изменения в пользовательский интерфейс. Когда вы нажимаете кнопку, логическое значение buttonPressed меняет свое значение с false на true. Поскольку SwiftUI не имеет операторов if, вы не можете сказать «if buttonPressed», присвоить кнопке одно название, а затем дать ей другое название в условии else. Вместо этого нам нужно использовать троичное выражение, в котором используется вопросительный знак, за которым следует значение, если оно ложно, а затем значение, если оно истинно.

Нет реальной причины, по которой пользовательский интерфейс должен быть постоянно изменен, но это дает понять, что последовательность была завершена, и SwiftUI знал об этом факте. Вы можете заметить, что мы обращаемся к wrappedValue для buttonPressed bool, а не к самой buttonPressed. Это потому, что $ data.buttonPressed - это привязка, точно такая же, как та, которая используется переключателем AR вверху. Привязка переменной означает, что SwiftUI имеет прямой доступ для изменения этого свойства и обновляет пользовательский интерфейс при изменении свойства. Действие кнопки должно относиться непосредственно к общему статическому экземпляру DataModel, поскольку привязки не могут использоваться для прямого вызова функции Swift.

Теперь нам нужно создать нашу модель данных, в которой мы будем создавать триггер для последовательности действий. Я дал функции, которую мы называем, общее имя triggerAction, так как я дал вам свободу решать, каким будет ваше действие. Если хотите, вы можете использовать что-то более конкретное, например «moveBox», «spin» или что угодно, что вы выберете. Просто убедитесь, что ваш ARUIView имеет правильную функцию при нажатии кнопки. Стоит отметить, что если вы не создали хотя бы одно уведомление Xcode, не будет доступа к перечислению boxAnchor.notifications. Как и я, вам может быть сложно понять, почему вы не можете ссылаться на уведомление, пока вы не поймете, что не настроили его в Reality Composer.

Мы создаем объект ARView при инициализации класса DataModel точно так же, как это делается в шаблоне проекта приложения дополненной реальности по умолчанию.

Разница здесь в том, что мы добавляем блок кода в уведомление Action Done, которое мы настраиваем в конце нашей последовательности Action. Все, что мы здесь делаем, это устанавливаем для buttonPressed bool значение true, чтобы пользовательский интерфейс изменился. Очевидно, что в этом блоке кода вы можете делать что угодно, от вызова других функций Swift до отправки другого уведомления обратно в файл реальности. Вы могли заметить, что блок начинается с «вставки». Это передает обратно любую Сущность, которую вы выбрали в качестве Затронутого объекта. Если бы у вас была другая Сущность, отличная от стального ящика, вы могли бы передать ее обратно как Затронутый объект. Это упрощает доступ к Сущности, которая, как вы знаете, будет существовать и будет использоваться в блоке, когда произойдет это Действие.

Теперь, когда вы устанавливаете это на iPad, у вас должна быть левая боковая панель с переключателем с надписью AR и кнопкой с надписью Notify. Направьте iPad на плоскую горизонтальную плоскость, например на стол или пол, и нажмите переключатель AR. Вас могут попросить предоставить доступ к камере, и когда вы разрешите это, вы увидите то, что видит камера. Через несколько секунд наведения устройства на горизонтальную поверхность появится стальная коробка. Когда вы будете готовы увидеть свой стальной ящик в действии, нажмите кнопку «Уведомить». Поле должно делать то, что вы выбрали, а на кнопке теперь должно быть написано «Уведомлено». Вы можете нажать ее еще раз, но название изменится только один раз.

Следующие шаги

В этом руководстве представлены некоторые расширенные концепции, но при этом создается только базовое приложение AR. Это должен быть план для добавления дополнительных функций, поскольку теперь у вас есть строительные блоки для запуска любого действия из любого места в коде. Поскольку левая боковая панель приложения для iPad представляет собой список, в него можно добавить не более 10 дочерних элементов. Это может означать переключатель AR и 9 кнопок. Если вам понадобится больше элементов управления, чем это, вы можете просто использовать VStacks для разделения каждой группы из 10 элементов управления. Поскольку это список, он будет автоматически увеличиваться и прокручиваться по мере добавления дополнительных элементов управления.

Как следует из названия, последовательности действий имеют несколько пробелов. Вы можете поэкспериментировать с объединением в цепочку различных действий. Вы можете отправлять уведомления обратно в Xcode в нескольких точках последовательности. Вы даже можете использовать триггер касания в Reality Composer, который срабатывает, когда вы нажимаете на затронутый объект. Если вы уведомляете Xcode при касании элемента, вы можете сохранить объект Entity, который передается обратно как свойство вашего класса DataModel. Оттуда у вас может быть функция «коснитесь, чтобы выбрать», которая позволит вашему SwiftUI управлять любым объектом, который вы коснулись.

О Робе Стерджене

Роб - разработчик приложений для размещения в компании Twinkl. В настоящее время он работает над своими приложениями для iOS и Android, позволяющими учителям просматривать, систематизировать и загружать ресурсы на ходу.

ПРОЧИТАЙТЕ БОЛЬШЕ:

Как SwiftUI помогает детям создавать свои первые приложения для iOS

Создайте свое первое приложение AR с RealityKit и SwiftUI