如何在iOS的ARView中加载Reality Composer Pro创建的USDA场景文件
如何在iOS的ARView中加载Reality Composer Pro创建的USDA场景文件
看起来你遇到的核心问题是USDA文件找不到,这在使用Swift Package Manager管理Reality Composer Pro资源时确实容易踩坑,我来帮你一步步排查解决:
1. 确认Swift包的资源配置是否正确
你提到已经在Sources目录下添加了Resources文件夹,一定要确保你的RCP项目对应的Swift包的Package.swift文件正确声明了这些资源,否则Xcode不会把它们打包到Bundle中。打开你的Swift包的Package.swift,找到target配置部分,补充资源声明:
let package = Package( name: "YourRCPPackageName", // 替换成你实际的Swift包名称 platforms: [.iOS(.v17)], // 匹配你的项目iOS最低版本 products: [ .library( name: "YourRCPPackageName", targets: ["YourRCPPackageName"]), ], targets: [ .target( name: "YourRCPPackageName", resources: [ .process("Resources") // 这会包含Resources目录下的所有文件 ] ), ] )
保存后,右键你的Swift包,选择「Package」->「Update Package Caches」,确保配置生效。
2. 修正Bundle的引用
你的代码里用了realityKitContentBundle,这大概率是问题根源——这个Bundle通常对应Xcode默认创建的RealityKitContent包,而你的TestScene.usda是在自己导入的RCP Swift包里,所以要引用正确的Bundle:
- 最简单的方式是在你的RCP Swift包中创建一个空的标记类(比如
RCPPackageMarker.swift,内容仅为class RCPPackageMarker {}); - 然后在主App代码中通过这个类获取对应Bundle:
let rcpBundle = Bundle(for: RCPPackageMarker.self) - 最后在加载模型时传入这个Bundle:
let model = try! ModelEntity.loadModel(named: "TestScene.usda", in: rcpBundle)
3. 验证文件存在且配置正确
- 确认
TestScene.usda确实在Swift包的Resources目录下,并且文件名完全匹配代码中的字符串(iOS文件系统区分大小写,比如testscene.usda和TestScene.usda会被识别为不同文件); - 右键Xcode中的
TestScene.usda文件,查看右侧检查器的「Target Membership」,确保你的RCP Swift包的target被勾选,这样文件才会被打包到Bundle中。
4. 替换强制解包为do-catch调试
你当前用try!会直接导致崩溃,换成do-catch可以获取更详细的错误信息,帮你精准定位问题:
do { let model = try ModelEntity.loadModel(named: "TestScene.usda", in: rcpBundle) let anchor = AnchorEntity(.plane(.horizontal, classification: .any, minimumBounds: SIMD2<Float>(0.2, 0.2))) anchor.children.append(model) arView.scene.anchors.append(anchor) } catch { print("加载模型失败:\(error.localizedDescription)") print("完整错误详情:\(error)") }
运行后控制台会输出具体错误,比如是文件不存在,还是格式不兼容。
5. 适配场景类文件的加载方式
如果你的TestScene.usda是包含灯光、多个实体的完整RCP场景,也可以尝试用SceneEntity加载整个场景,再添加到锚点:
do { let scene = try SceneEntity.load(named: "TestScene.usda", in: rcpBundle) let anchor = AnchorEntity(.plane(.horizontal, classification: .any, minimumBounds: SIMD2<Float>(0.2, 0.2))) anchor.children.append(scene) arView.scene.anchors.append(anchor) } catch { print("加载场景失败:\(error)") }
总体来说,最可能的问题是Bundle引用错误或资源未被正确打包到Swift包中,按照上面的步骤排查应该能解决你的问题。
内容来源于stack exchange
相关产品推荐
相关产品推荐

