Swift 4.2-Cocoapods:在resource_bundles中添加和访问脚本集

时间:2019-01-15 15:33:43

标签: ios swift cocoapods scenekit

尝试创建一个利用.scnassets文件夹的cocoapod。文件夹被导入到Resources中,而子对象没有任何问题,但是我找不到将 .dae 文件加载到SCNScene中的方法。据我了解,XCode如何将 .dae 转换为 .scn 资产。

.podspec 包括:

  s.resource_bundles = {
      'ARUtilsScenes' => ['ARUtils/Assets/ARScenes.scnassets']
   }

可将 ARScenes.scnassets 正确加载到Resources文件夹中。我正在尝试将场景加载到Pod内部(在Pod内部,而不是使用Pod的项目中,并且尝试了多种方法):

let arrowScene = SCNScene(named: "arrow.dae")

let arrowScene = SCNScene(named: "Resources/ARScenes.scnassets/arrow.dae")

let arrowScene = SCNScene(named: "arrow.dae", inDirectory: "Resources/ARScenes.scnassets", options: nil)

我尝试了各种文件/文件夹名称,并且能够加载图像,但是无法将 .dae 加载为SCNScene。我需要将 .xib 文件添加到我的 resource_bundles 中,还是有其他方法来确保 .scnassets 文件夹正确编译这些 .dae .scn ,以及是否可以将其加载到SCNScene中?

3 个答案:

答案 0 :(得分:1)

假设ZARKit是您的框架,分布在CocoaPods中。

.podspec包括:

s.resource_bundles = {
      'ARUtilsScenes' => ['ARUtils/Assets/ARScenes.scnassets']
   }

那么您应该这样做

let bundle = Bundle(for: #Your Class#.self).
let resourcePath = bundle.path(forResource: <#T##String?#>, ofType: <#T##String?#>)
let resourceBundle = Bundle(path: resourcePath)

let url = resourceBundle.url(forResource: "ARScenes.scnassets/<#YourResourceName-arrow#>", withExtension: "<#scn#>")
let arrowScene = SCNScene(url: url)

编辑:Z。Bagley

可接受的答案,但这是我使用的实际代码:

        // find bundle based on existing class in pod
        let frameworkBundle = Bundle(for: ARUtilsClass.self) //ARUtilsClass is an empty class, Pod is only extensions for existing classes
        // append the scenes bundle, scnassets, and scn/dae
        let arrowURL = frameworkBundle.resourceURL?.appendingPathComponent("ARUtilsScenes.bundle/ARScenes.scnassets/newArrow.scn")
        // create a node in parent
        var arrow = SCNNode()
        do {
            // get arrow scene from bundle
            let bundleArrowScene = try SCNScene(url: (arrowURL)!, options: nil)
            // add arrow node from scene
            arrow = bundleArrowScene.rootNode.childNode(withName: "arrow", recursively: true)!
        } catch {
            print("failed to find arrow resource")
        }

答案 1 :(得分:0)

从.scnassets文件夹访问.dae资产时,无需在路径中包含“ Resources /”

例如:let arrowScene = SCNScene(named: "ARScenes.scnassets/arrow.dae")

假设您的.scnassets文件夹称为该文件夹。

答案 2 :(得分:0)

Apple在更新的构建系统中引入了一个已知的错误,该错误会导致资产目录的异步编译,使资产目录在最终构建中不可访问。有关参考,请参见Cocoapods GitHub上的this thread。列出了几种解决方法,但是没有一种方法可以保证结果,所以现在我们似乎不得不接受它。