You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 13:05:27