Problème : mouvement des SCNNode avec ARKit

Bonjour, et merci d’avance pour votre attention.
J’ai besoin, pour une application iOS, de déplacer des nodes dans une scène ARKit, mais je n’y parviens pas. Pour que ma question aide le plus grand nombre, et qu’elle soit plus simple à comprendre, je vais me concentrer sur l’apparition de mes nodes dans la scène. Je souhaite qu’ils apparaissent à environ 10cm du plan (la grille de jeu), puis qu’ils descendent un par un jusqu’à se poser dessus.

Voici mon code initial (à savoir : je me sers d’une classe “Player” qui a comme propriétés un SCNNode et une méthode appears(), et mon mainNode (la grille de jeu) est créé dans le renderer(nodeFor) du View Controller) :

for player in playersArray {
                mainNode.addChildNode(player.playerNode)
                player.appears()
            }

Et voilà la méthode appears() :

func appears() {
    if self.playerNode.position.z == self.size/56 {
        self.playerNode.position.z = self.size/2.8
    }
    
    if self.playerNode.position.z >= self.size/28 {
        self.playerNode.position.z -= self.size/112
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + milliseconds(40)){self.appears()}
    }
}

(Size est une constante qui représente la taille du plan)


(Premier essai) À ce moment, je m’attendais à voir mes nodes apparaître puis descendre un par un, mais j’exécutais le code de façon asynchrone : tous les nodes se sont mis à jouer leur “animation” en même temps !


(Deuxième essai) Pour cette raison, j’ai essayé d’utiliser Timer.scheduledTimer, mais la même chose s’est produite (étant donné qu’ils doivent tourner sur le main thread, les appeler de façon synchrone faisait freezer la scène).


(Troisième essai) Après plusieurs jours de recherche, j’ai décidé de changer le niveau du dispatch et de le passer sur le background, et de me servir des DispatchGroup pour attendre que chaque node ait finit son “animation” avant d’ordonner au suivant d’apparaître. Tous les nodes sont apparus instantanément sur la grille, comme si “l’animation” n’existait pas.


(Quatrième essai) Ensuite, j’ai voulu me servir des DispatchSemaphore, et d’incrémenter ma semaphore quand “l’animation” se terminerait, mais la scène se freezait pendant l’attente du signal.


(Cinquième essai) Enfin, j’ai voulu me débarrasser de toutes ces méthodes, et me servir des SCNAction avec un TimeInterval pour les faire se déplacer un par un, mais ils se sont encore une fois tous téléportés en même temps.


Si quelqu’un a une idée de la façon dont je dois résoudre le problème, je suis preneur ! Merci encore pour votre attention.

Je n’ai pas encore pris le temps d’étudier SceneKit donc je vais peut être dire une bêtise, mais pourquoi tu calcule toi-même les étapes de ton animation ?
Tu peux animer directment tes nodes non ?
Par exemple ceci : https://developer.apple.com/documentation/scenekit/animation/animating_scenekit_content