SceneKit保存scn文件到磁盘报MDLErrorDomain error 0该如何解决
问题根因
- 写入路径不合法:
scnScene.write(to:)方法要求传入带.scn后缀的完整文件路径,你当前传入的是文档目录的文件夹路径,系统无法将场景文件直接写入文件夹,触发MDLErrorDomain报错。 - 隐式解包的
scnScene在写入时如果存在未加载完成的资源,会触发属性依赖循环,引发AttributeGraph报错。
修正方案
- 拼接完整的保存文件路径,指定
.scn后缀 - 增加写入配置选项,适配系统导出规则
- 避免强制解包
SCNScene实例,增加异常判断
修正后代码
// 避免强制解包,可选接收SCNScene实例 var scnScene: SCNScene? = SCNScene(named: "Art.scnassets/Ship") //获取 documents URL func getDocumentsDirectory() -> URL { let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) return paths[0] } //保存scn到磁盘 func saveSCNFileToDisk() { guard let scnScene = scnScene else { return } // 拼接完整的scn文件路径 let targetURL = getDocumentsDirectory().appendingPathComponent("SavedShip.scn") // 增加写入配置选项 let writeOptions: [SCNScene.OutputOption: Any] = [ .exportedFileType: SCNScene.FileType.scn, .convertToYUp: false, .compress: false ] scnScene.write(to: targetURL, options: writeOptions, delegate: nil) { progress, error, pointer in if let error = error { print(error.localizedDescription) return } self.scene = targetURL.absoluteString } }
内容的提问来源于stack exchange,提问作者Mane Manero
相关产品推荐
相关产品推荐

