RealityKit多场景图像锚点触发通知异常问题求助
问题修复方案
问题根源
你当前的代码依赖arView.scene.anchors数组的固定索引(0、1、2)判断场景锚定状态,这种方式存在严重问题:
- ARKit会自主管理锚点数组的顺序,初始添加顺序不代表数组中的最终顺序
- 系统可能自动添加其他锚点(比如平面检测锚点),导致数组索引偏移,取到非目标场景
- 若多个场景同时处于锚定状态,
else if逻辑会错误匹配第一个符合条件的非目标锚点
修复方案
方案一:直接检查场景自身的锚定状态(推荐)
每个Scene1/Scene2/Scene3本身就是AnchorEntity实例,直接检查它们的isAnchored属性即可,无需通过数组索引间接判断:
修改Button的点击事件代码:
Button("Replay") { if Scene1.isAnchored { Scene1.notifications.replay.post() } else if Scene2.isAnchored { Scene2.notifications.replay.post() } else if Scene3.isAnchored { Scene3.notifications.replay.post() } }
方案二:给锚点添加唯一标识,精准匹配(适用于复杂场景)
如果需要更严谨的锚点匹配逻辑,可以给每个场景锚点设置唯一标识,再遍历数组匹配:
- 在添加锚点时设置
name属性:
DispatchQueue.main.asyncAfter(deadline: .now()) { Scene1.name = "Scene1_Anchor" Scene2.name = "Scene2_Anchor" Scene3.name = "Scene3_Anchor" arView.scene.anchors.append(Scene1) arView.scene.anchors.append(Scene2) arView.scene.anchors.append(Scene3) }
- 修改
Button点击事件:
Button("Replay") { for anchor in arView.scene.anchors { guard let anchorEntity = anchor as? AnchorEntity, anchorEntity.isAnchored, let anchorName = anchorEntity.name else { continue } switch anchorName { case "Scene1_Anchor": Scene1.notifications.replay.post() case "Scene2_Anchor": Scene2.notifications.replay.post() case "Scene3_Anchor": Scene3.notifications.replay.post() default: break } } }
额外优化建议
- 避免使用
try!强制解包,建议用do-catch处理场景加载失败的情况,防止崩溃:
@State private var Scene1: Experience1.Scene1? @State private var Scene2: Experience1.Scene2? @State private var Scene3: Experience1.Scene3? // 在视图出现时加载场景 .onAppear { do { Scene1 = try Experience1.loadScene1() Scene2 = try Experience1.loadScene2() Scene3 = try Experience1.loadScene3() } catch { print("场景加载失败:\(error)") } }
内容的提问来源于stack exchange,提问作者kkk
相关产品推荐
相关产品推荐

