Swift 4.2 - Cocoapods: добавление и доступ к scnassets в resource_bundles - PullRequest
0 голосов
/ 15 января 2019

Попытка создать cocoapod, который использует папку .scnassets. Папка импортируется в Resources без каких-либо проблем с дочерними объектами, но я не могу найти способ загрузить файлы .dae в SCNScene. Насколько я понимаю, может быть проблема с тем, как XCode преобразует .dae в .scn активы.

.podspec включает в себя:

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

, который правильно загружает ARScenes.scnassets в папку Resources. Я пытаюсь загрузить сцену в моем модуле (внутри модуля, а не в проекте, который использует модуль и пробовал различные методы):

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 голосов
/ 23 января 2019

В обновленной системе сборки Apple есть известная ошибка, которая приводит к асинхронной компиляции каталогов ресурсов, что делает их недоступными в окончательной сборке. Для справки смотрите эту ветку на Cocoapods GitHub. Для этого есть несколько обходных путей, но ни один из них не гарантирует результатов, поэтому сейчас нам, похоже, придется с этим смириться

0 голосов
/ 28 января 2019

Предположим, 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)

редактирование: З. Бэгли

Принял ответ, но это был фактический код, который я использовал:

        // 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")
        }
0 голосов
/ 21 января 2019

При доступе к ресурсу .dae из папки .scnassets не нужно включать «Resources /» в путь

Например: let arrowScene = SCNScene(named: "ARScenes.scnassets/arrow.dae")

Предполагается, что ваша папка .scnassets называется так.

...