如何让Entity自动往复移动?RealityKit球体移动代码无效果求助
问题原因
RealityView的update闭包不是逐帧持续执行的,它仅在视图状态发生变化(比如布局调整、内容实体增删)时才会被调用,所以你依赖它实现球体持续移动的逻辑根本无法触发连续的位置更新。
解决方案
推荐使用RealityKit原生的动画Action系统,这是最符合框架设计且性能最优的方式:
修改你的RealityView代码,在添加实体后直接给球体绑定无限重复的移动动作:
var body: some View { RealityView { content in do { let immersiveEntity = try await Entity(named: "Immersive", in: realityKitContentBundle) immersiveEntity.name = "sphere" content.add(immersiveEntity) // 添加无限重复的移动动作 let moveStep = SIMD3<Float>(0.1, 0, 0) // 每次移动的增量 let moveAction = Action.move(by: moveStep, duration: 0.01) // 单次移动的时长 immersiveEntity.runAction(.repeatForever(moveAction)) } catch { print("加载实体失败:\(error)") } } // 不需要update闭包,因为动作由RealityKit自动管理 }
替代方案(异步循环更新)
如果你需要更灵活的控制逻辑,也可以在视图出现时启动一个异步循环,模拟逐帧更新:
var body: some View { RealityView { content in do { let immersiveEntity = try await Entity(named: "Immersive", in: realityKitContentBundle) immersiveEntity.name = "sphere" content.add(immersiveEntity) } catch { print("加载实体失败:\(error)") } } update: { content in // 这里可保留用于状态同步,但不需要移动逻辑 } .onAppear { Task { while true { await MainActor.run { if let sphere = content.entities.first(where: { $0.name == "sphere" }) { sphere.position.x += 0.1 } } // 控制帧率,这里模拟60帧/秒 try? await Task.sleep(nanoseconds: 1_000_000_000 / 60) } } } }
注意事项
- 优先使用RealityKit的Action系统,它会自动处理动画的帧率和性能优化,避免手动循环可能带来的线程问题。
- 原代码中的
update闭包仅适合处理视图状态变化时的一次性同步,不适合做持续的动画逻辑。
内容的提问来源于stack exchange,提问作者swiftyboi
相关产品推荐
相关产品推荐

