2
votes

Swift 4.2 - Cocoapods: Ajout et accès à des scnassets dans resource_bundles

Tentative de création d'un cocoapod qui utilise un dossier .scnassets . Le dossier est importé dans Resources sans aucun problème avec les objets enfants, mais je ne trouve pas de moyen de charger les fichiers .dae dans une SCNScene code>. D'après ce que je comprends, il peut y avoir un problème avec la façon dont XCode convertit .dae en éléments .scn .

.podspec comprend: p >

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

qui charge correctement les ARScenes.scnassets dans le dossier Resources . J'essaie de charger une scène à l'intérieur de mon pod (à l'intérieur du pod et non dans un projet qui utilise le pod, et j'ai essayé diverses méthodes):

let arrowScene = SCNScene (nommé : "arrow.dae")

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

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

J'ai essayé une variété de fichiers / noms de dossier, et je peux charger des images mais je ne parviens pas à charger un .dae en tant que SCNScene . Dois-je ajouter des fichiers .xib à mes resource_bundles , ou existe-t-il un autre moyen de garantir que le dossier .scnassets compile correctement ces .dae à .scn et les rendre disponibles pour le chargement dans une SCNScene?


2 commentaires

Est-il possible de partager votre Pod quelque part? Il est plus facile pour les autres d'essayer dans le même scénario.


Je vais voir ce que je peux faire (peut-être ne pas y arriver avant le week-end), mais l'idée générale est simplement d'utiliser SCNScene à l'intérieur d'un CocoaPod à partir d'un élément resource_bundle . Similaire à la façon dont UIImage est importé en ciblant le bundle: stackoverflow.com/a/35903720/856336, mais avec SCNScene (qui n'a pas d'attribut de bundle, seulement un attribut d'annuaire)


3 Réponses :


0
votes

Lors de l'accès à l'élément .dae à partir du dossier .scnassets, il ne devrait pas être nécessaire d'inclure le "Resources /" dans le chemin

Par exemple: let arrowScene = SCNScene (nommé: "ARScenes.scnassets / arrow.dae")

En supposant que votre dossier .scnassets s'appelle ainsi.


3 commentaires

C'est vrai pour une inclusion de scénario normal, mais c'est pour un Cocoa Pod, qui regroupe ces éléments avant la construction de XCode. J'ai essayé toutes les variantes de chemins, et cela fonctionne bien dans mon projet principal, mais je dois inclure cet actif dans le Cocoa Pod.


Oh, bien sûr, j'ai mal lu - cette réponse stackoverflow.com/a/35903720/856336 devrait être ce que vous recherchez . En gros, trouvez le bundle de l'une de vos classes dans votre pod - puis créez l'URL du bundle pour la ressource (que vous avez définie dans le podspec) - et utilisez ce bundle lors de la demande de la ressource, en utilisant le format que j'ai mentionné ci-dessus.


J'aurais aimé que cela fonctionne, mais cela ne fonctionne que pour les images (il est mentionné dans la question que je l'ai fait fonctionner pour les images mais pas pour .dae ou .scn). Merci d'avoir examiné cela. Cela a quelque chose à voir avec la façon dont les scènes SceneKit regroupent je suppose, car vous ne pouvez pas cibler directement un bundle avec SCNScene (comme vous pouvez le faire avec UIImage dans cette question )



0
votes

Il y a un bogue connu introduit avec le système de construction mis à jour par Apple qui provoque la compilation asynchrone des catalogues d'actifs les rendant inaccessibles dans la version finale. Pour référence, voir ce fil sur Cocoapods GitHub. Il existe plusieurs solutions de contournement pour cela, mais aucune d'entre elles ne garantit les résultats, donc pour l'instant, nous semblons devoir vivre avec


1 commentaires

Merci pour l'info, je n'avais jamais vu celui-ci auparavant. Le problème est en référence à ressource (s) par opposition à resouce_bundle (qui a été implémenté pour ajouter de manière à précompiler les bundles et les cibler, si j'ai lu le documents corrects). Je vais certainement examiner le mode hérité mentionné et vous expliquer comment cela se passe.



4
votes

Supposons que ZARKit est votre framework distribué dans CocoaPods.

.podspec inclut:

        // 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")
        }

alors vous devrait faire ceci

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)

edit: par Z. Bagley

Réponse acceptée, mais c'était le code réel J'ai utilisé:

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


0 commentaires