首页 > 解决方案 > 如何在使用 RealityKit、ARKit 和 SwiftUI 时触发函数来保存和加载世界地图数据?

问题描述

我正在使用RealityKit、 ARKit 和SwiftUI构建增强现实应用程序。内容视图有一个 ZStack,其中包含 ARView 和层叠在其上的 Swift 视图。

更具体地说,ARView 以 ARContentView() 的形式存在——一个包装 ARViewContainer() 的快速视图,它本身代表 RealityKit 中的 ARView。

我正在添加下面代码的照片。

带有 ZStack 的 contentView,包括分层的 UI 视图和 ARContentView

目标是让用户能够保存和加载世界地图数据,以便在他们关闭并重新打开他们的应用程序后保持 AR 体验。

问题是我试图通过单击 SwiftUI 视图中的按钮来触发保存和加载世界地图数据的功能,而这些按钮必须触发在 ARView 中保存和加载世界地图数据的功能。

可以通过向视图添加手势(例如向上滑动)来触发代码以从 ARView 中保存世界地图数据,如下所示,但我需要从内容视图按钮中实际链接这些功能

真正让我困惑的是:

因为 ARView 已经由 Apple 定义,我只能通过扩展它并添加新功能来向它添加功能,所以我不能向它添加一个绑定变量来跟上内容视图中的事件状态(因为存储变量不能添加到扩展中)。

使用当前 AR 会话与世界地图对象交互的功能之一的示例

如何在 ZStack 中包含 ARContentView 的父 SwiftUI 视图中触发这些不同的 ARView 相关操作?

同样......问题仍然存在,当 ARView 中发生事件时,如何将返回的信息发送回 SwiftUI 内容视图,以便它可以更改其状态变量并触发动画?(这可能是一个单独的问题,但问题的基础仍然是这两种视图之间的联系)

启动一个新的增强现实 RealityKit 项目时免费提供的 ARViewContainer 结构有几个函数 - makeUIView() 和 updateUIView() 包含在其中,但我还没有找到任何关于如何使用 updateUIView() 函数的教程。

ARContainerView 的图像采用 var 进行构造以及其中的函数

我想知道 ARContainerView 结构中的 updateUIView() 函数是否可以解决我在这些层之间的连接问题,如果是,如何使用它,如果不是,如何解决问题?

如果有任何不清楚的地方,请告诉我。谢谢您的帮助。

标签: iosswiftuiarkitrealitykitworld-map

解决方案


当您需要在您的SwiftUI视图和UIViewRepresentable容纳您的视图之间进行协调时ARView,您可以使用ARViewCoordinatorandARSessionDelegate在它们之间传递数据。当我有时间时,我会加载一个示例,或者您可以在 Youtube 上查看 Reality School 以获得教程。


推荐阅读