SCNParticleSystem 从文档目录加载

san*_*osh 5 ios scenekit swift arkit

我正在尝试从我无法加载的下载包加载 SCNParticleSystem。

资源的路径。

file:///var/mobile/Containers/Data/Application/A91E9970-CDE1-43D8-B822-4B61EFC6149B/Documents/so/solarsystem.bundle/Contents/Resources/

                let objScene = SCNParticleSystem(named: "stars", inDirectory: directory)
Run Code Online (Sandbox Code Playgroud)

该对象为零。

Lës*_*ski 5

这是一个合法的问题,因为SceneKit没有提供开箱即用的解决方案来从主包之外的文件初始化粒子系统(唯一的 init 方法SCNParticleSystem.init(named:inDirectory:)意味着SCNParticleSystem.scnp文件位于主包中)。

\n\n

幸运的是,.scnp文件只是编码/存档的SCNParticleSystem实例,我们可以使用它们轻松解码/取消存档NSKeyedUnarchiver

\n\n
extension SCNParticleSystem {\n    static func make(fromFileAt url: URL) -> SCNParticleSystem? {\n        guard let data = try? Data(contentsOf: url),\n            let object = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data),\n            let system = object as? SCNParticleSystem else { return nil }\n\n        return system\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果不需要支持iOS 9iOS 10可以使用and 类型强制NSKeyedUnarchiver.unarchivedObject(ofClass: SCNParticleSystem.self, from: data)转换来NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(_:)代替,这在iOS 11.0.

\n\n

您最有可能遇到的另一个问题是丢失粒子图像。这是因为默认情况下SceneKit会在主包中查找它们。截至当前版本的 iOS(即iOS 12)和 Xcode ( )文件Xcode 10中的粒子图像(属性)是.scnpparticleImageString主包中的纹理文件名的值(可能会更改,但可能不会,但是没有太多否则我们可以使用)。

\n\n

所以我的建议是采用该文件名并在其所在的同一目录中查找具有相同名称的纹理文件.scnp

\n\n
extension SCNParticleSystem {\n    static func make(fromFileAt url: URL) -> SCNParticleSystem? {\n        guard let data = try? Data(contentsOf: url),\n            let object = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data),\n            let system = object as? SCNParticleSystem else { return nil }\n\n        if let particleImageName = system.particleImage as? String {\n            let particleImageURL = url\n                .deletingLastPathComponent()\n                .appendingPathComponent(particleImageName)\n\n            if FileManager.default.fileExists(atPath: particleImageURL.path) {\n                system.particleImage = particleImageURL\n            }\n        }\n\n        return system\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

您只需设置URL图像文件的SceneKit从那里处理它。

\n\n
\n\n

作为一个小旁注,可下载内容的推荐目录是Application Support目录,而不是Documents.

\n\n
\n

应用支持:使用此目录存储除与 user\xe2\x80\x99s 文档关联的应用程序数据文件之外的所有应用程序数据文件。例如,您可以使用此目录来存储应用程序创建的数据文件、配置文件、模板或由应用程序管理的其他固定或可修改资源。应用程序可以使用此目录来存储最初包含在 app\xe2\x80\x99s 捆绑包中的资源的可修改副本。游戏可能会使用此目录来存储用户购买并从服务器下载的新关卡。

\n
\n\n

(来自文件系统基础知识

\n