首页 > 解决方案 > Swift 4.2 - Cocoapods:在 resource_bundles 中添加和访问 scnassets

问题描述

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

.podspec包括:

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

正确加载ARScenes.scnassetsResources文件夹中。我正在尝试在我的 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并使其可用于加载到.scn 中SCNScene

标签: iosswiftcocoapodsscenekit

解决方案


假设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")
        }

推荐阅读