我正在为 VisionOS 2 Beta 使用 Reality Composer Pro 2.0 和 Xcode 16 beta。

通过在点击 swiftui 按钮时调用,我可以查看并触发 Xcode 中 RealityView 中的 RCP 动画组件动画,一切都playAnimation很好scene.availableAnimations[0]

我也希望能够通过点击 swiftui 按钮来触发新的时间线操作动画,但我不确定在代码中访问时间线操作以触发它们的最佳方法。

我看到我可以从 Xcode 发送一个通知来触发时间线操作(如屏幕截图所示),但我不确定如何从 SwiftUI 发送通知到 RCP 来触发这个“SpinAndMove”时间线动画。

如果有人可以帮助从 SwiftUI 向 RCP 发送通知,或者有更好的“最佳实践”方法从 RCP 外部触发时间线操作,我们将不胜感激!


最佳答案
2

Apple 开发者论坛已回答了这个问题:

该帖子描述了如何使用 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"
    ])
}

insideFlipReality Composer Pro 中通知名称在哪里定义,appModel.contentEntity?.scene是在里面定义的RealityView

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

2

  • 1
    做得好,+赞。


    – 

  • 1
    太好了,非常感谢 Caroline!


    – 

首先,我想说,所有的荣誉都属于@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)
    }
}

2

  • 1
    非常感谢所添加的背景信息,谢谢你安迪!


    – 

  • 2
    Jack,不用客气!当然,如果没有来自库比蒂诺的 Vision Pro 工程师帮助我们,如果没有 Caroline 帮助我们👍🏻,那么猜测参数中需要一组什么样的字典将非常困难userInfo。RealityComposer 1.5 之前拥有的通知 API 非常


    –