Отправьте уведомление из SwiftUI Xcode 16 для запуска анимации действия временной шкалы Reality Composer Pro

Я использую Reality Composer Pro 2.0 и бета-версию Xcode 16 для бета-версии VisionOS 2.

Я могу видеть и запускать анимацию компонента анимации RCP в RealityView в Xcode, вызывая playAnimation на scene.availableAnimations[0] при нажатии кнопки SwiftUI, там все хорошо.

Я также хочу иметь возможность запускать новые анимации действий временной шкалы, нажав кнопку SwiftUI, но я не уверен, что это лучший способ получить доступ к действиям временной шкалы, чтобы вызвать их в коде.

Я вижу, что могу отправить уведомление из Xcode, которое вызовет действие временной шкалы (как показано на снимке экрана), но я не уверен, как отправить уведомление из SwiftUI в RCP, чтобы запустить эту анимацию временной шкалы «SpinAndMove».

Если бы кто-нибудь мог помочь отправить уведомление из SwiftUI в RCP или если есть лучший метод «лучших практик» для запуска действий временной шкалы из-за пределов RCP, мы были бы очень признательны!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
380
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

На форуме разработчиков Apple был дан ответ: https://forums.developer.apple.com/forums/thread/756978

В этом посте описывается, как отправить уведомление с помощью VisionOS, но мне удалось заставить его работать на целевой macOS с помощью:

if let scene = appModel.contentEntity?.scene {
  NotificationCenter.default.post(
    name: Notification.Name("RealityKit.NotificationTrigger"),
    object: nil,
    userInfo: [
      "RealityKit.NotificationTrigger.Scene": scene,
      "RealityKit.NotificationTrigger.Identifier": "insideFlip"
    ])
}

Где insideFlip было имя уведомления, определенное в Reality Composer Pro, а appModel.contentEntity?.scene было определено внутри RealityView.

if let immersiveContentEntity =
    try? await Entity(named: "Immersive", in: realityKitContentBundle) {
  appModel.contentEntity = immersiveContentEntity
}

Хорошая работа, +голос.

Andy Jazz 26.06.2024 13:29

Отлично, большое спасибо, Кэролайн!

Jack Johnson 26.06.2024 17:15

Прежде всего хочу сказать, что все лавры полностью принадлежат @Caroline. Я просто хочу дополнить этот пост и опубликовать настройки сцены RCP 2.0 и полную версию кода. Вот кнопка Hide отправляет уведомление на сцену RCP 2.0, чтобы активировать выбранное поведение временной шкалы.

struct ContentView : View {
    @Environment(\.realityKitScene) var scene
    let rkcb = realityKitContentBundle
    let rknt = "RealityKit.NotificationTrigger"
    
    fileprivate func notify(_ scene: RealityKit.Scene) {
        let notification = Notification(name: .init(rknt),
                                    userInfo: ["\(rknt).Scene" : scene,
                                          "\(rknt).Identifier" : "notifier"])
        NotificationCenter.default.post(notification)
    }
    
    var body: some View {
        RealityView { rvc in
            if let model = try? await Entity(named: "Scene", in: rkcb) {
                rvc.add(model)
            }
        }
        .gesture(
            SpatialTapGesture()
                .targetedToAnyEntity()
                .onEnded {
                    if $0.entity.applyTapForBehaviors() {
                        print("Tapped")
                    }
                }
        )
        Button("<< Hide >>") {
            if let scene { notify(scene) }     // A miracle happens here
        }
        .font(.system(size: 125))
        .padding3D(.front)
    }
}

Очень ценю добавленный контекст, спасибо, Энди!

Jack Johnson 26.06.2024 17:16

Джек, пожалуйста! Конечно, если бы нам не помог инженер Vision Pro из Купертино, и если бы нам не помогла Кэролайн 👍🏻, то было бы очень сложно догадаться, какой набор словарей нужен в параметре userInfo. API уведомлений, который ранее был в RealityComposer 1.5, был интуитивно понятным.

Andy Jazz 26.06.2024 17:45

Другие вопросы по теме