Я использую 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, мы были бы очень признательны!
На форуме разработчиков 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
}
Отлично, большое спасибо, Кэролайн!
Прежде всего хочу сказать, что все лавры полностью принадлежат @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)
}
}
Очень ценю добавленный контекст, спасибо, Энди!
Джек, пожалуйста! Конечно, если бы нам не помог инженер Vision Pro из Купертино, и если бы нам не помогла Кэролайн 👍🏻, то было бы очень сложно догадаться, какой набор словарей нужен в параметре userInfo
. API уведомлений, который ранее был в RealityComposer 1.5, был интуитивно понятным.
Хорошая работа, +голос.