Une comparaison entre les deux outils
Lorsque j’ai commencé cet article, j’avais l’intention de parler de l’animation de l’application de jeu d’échecs que j’ai passée à documenter ces dernières semaines.
Mais en examinant le sujet, j’ai réalisé qu’Apple avait des idées très différentes à ce sujet par rapport à leurs précédents frameworks avec SceneKit et SpriteKit. Vous n’avez ni SCNTransactions ni CAAnimations, avec pas mal d’options différentes, que mon collègue Andy Jazz a brièvement abordées dans ce Donc poste.
C’est une liste beaucoup plus complète que celle que j’ai le temps d’aborder ici; l’objectif de cet article est « *.USDZ » basé sur les animations par rapport aux déclencheurs RC, aux notifications et aux actions. Les premières animations sans code, les secondes à la fois des animations « en conserve » et augmentées, si vous voulez.
Bref
Voici donc le défi – aux échecs, vous avez 64 cases, 32 pièces et six modèles, certains doublés deux fois, des pions dans une classe à part. Chaque modèle a son propre ensemble de règles pour se déplacer sur le plateau. Des règles qui disent que certains peuvent déplacer des cases simples, d’autres plusieurs. Différentes pièces peuvent se déplacer dans différentes directions, certaines en diagonale, d’autres en lignes droites. Vous ne pouvez pas traverser les autres joueurs, à l’exception du chevalier ou du cheval qui peut sauter par-dessus eux. Vous avez quelques exceptions comme le roque et la promotion – mais ce sont des exceptions exceptionnelles.
Dynamique
Bien sûr, au-delà du simple déplacement, je dois trouver un moyen d’indiquer quelle pièce vous voulez déplacer où. Sélectionner la pièce est facile, mais décider de l’action suivante est plus compliqué. Dois-je rendre le tableau plus interactif ? Pourrais-je avoir un affichage tête haute ? Dois-je implémenter des gestes personnalisés ? J’avais besoin d’y réfléchir.
RealityKit vous permet de jouer des animations contre des entités en les créant et en les exportant dans Blender.
Pour en arriver là, j’ai d’abord exporté [using *.usdc] la scène du mélangeur sans animations, exportant ensuite deux autres copies avec rien d’autre que des animations. J’ai ensuite converti les trois exportations au format « *.usdz », je les ai chargées dans l’application, j’ai ajouté la première à la scène et j’ai utilisé les deuxième et troisième en tant que mouvements « préparés » ; déclenché via l’interface SwiftUI pour rendre évident ce qui se passe.
let model = try! Entity.load(named: "ChessSceneA")
anchor.addChild(model)let model2 = try! Entity.load(named: "ChessSceneB")
whiting = white
.throttle(for: 0.01, scheduler: RunLoop.main, latest: true)
.sink(receiveValue: { [self] _ in
let animation = model2.availableAnimations
if animation.count > 0 {
model.playAnimation(animation[0], transitionDuration: 4, startsPaused: false)
} else {
print("no....")
}
Faisabilité
Mais de qui je plaisante – il n’y a aucun moyen de créer puis de gérer un pool d’animations « préparées » pour une partie d’échecs. Imaginez que la reine puisse se déplacer dans n’importe quelle direction, n’importe quel nombre de cases de n’importe où – peut-être qu’avec beaucoup de travail acharné et une logique prête à l’emploi, vous pourriez le faire fonctionner, mais non, ce n’est tout simplement pas une solution évolutive.
Ayant décidé/prouvé que Blender n’allait pas suffire, j’avais besoin d’autre chose, un outil qui me permettrait de m’interfacer avec le code et de gérer le jeu, c’est là que RC entre en scène.
Reality Composer est l’un des quelques outils dédiés sur lesquels Apple a travaillé pour vous aider, vous et moi, à développer des applications AR, avec son cousin Reality Converter. Vous pouvez trouver de nombreux articles sur le premier sur moyen.combien que peu abordent le sujet sur lequel je veux me concentrer ici – le codage augmenté, comme je l’appellerai.
Codage augmenté
L’outil compagnon Apple Reality Composer est un constructeur d’applications, donnant à quelqu’un sans compétences en codage la possibilité de créer des scènes interactives dans leurs applications AR. Il est venu avec des animations en conserve [most of which are awful, sorry, Apple] et des opportunités de code augmenté, comme je les appellerai. Outre les animations, des déclencheurs prédéfinis sont également disponibles, avec la liste définitive de la WWDC2019.
Les quatre premiers étaient pour les non-programmeurs, et le dernier était pour le reste d’entre nous. Vous avez une liste similaire pour les actions, encore une fois avec une notification cachée à la toute fin. Le concept ici est identique à celui qu’ils utilisent avec le Combine Framework, donc si vous êtes familier avec cela, ce sera un jeu d’enfant.
Voici un GIF animé montrant une animation en conserve et du code augmenté en action.
L’action est l’un des mouvements RC « préparés » – une rotation – avec la notification d’un message que je renvoie à l’interface SwiftUI pour basculer un booléen qui contrôle le message GameOver. Voici la partie code de la conversation, suivie de la configuration RC :
@State var gameOver = falseCustomARView(view: arview)
.scaleEffect(zoomScale)
.onReceive(game) { _ in
gameOver.toggle()
}
if gameOver {
Text("GameOver") { $0.kern = CGFloat(2)}
.font(Fonts.neutonRegular(size: 64))
.foregroundColor(Color.white)
}
Donc, dans la version du jeu, je vais appuyer sur l’image du modèle pour lancer les choses avec une action pour me rappeler sur quelle pièce j’ai tapé. Pour continuer à jouer, j’ajoute un déclencheur à chaque case du plateau pour demander la pièce sur laquelle je viens de taper.
Mais attendez, car ce deuxième déclencheur doit récupérer les informations du premier ; le deuxième déclencheur ne peut donc pas être un mouvement « préparé » ; ce doit être un mouvement « qualifié » avec des coordonnées si vous voulez.
J’aurai donc besoin d’un déclencheur de notification ; ce sera le déclencheur que j’ajouterai aux carrés : ils exécuteront un code personnalisé qui vérifiera que le carré est vide, actionnera une destruction s’il y a déjà une pièce sur ledit carré, puis demandera de se déplacer de la pièce précédemment indiquée.
À quoi ressemble le deuxième cas dans le code – voir ici ; J’ai ajouté une étiquette avec un geste pour envoyer un message [thru Combine] à ma scène générée par ARKit pour lui demander de publier un message sur la scène.
Text("knight")
.font(Fonts.neutonRegular(size: 32))
.foregroundColor(whiteBack ? .white : .blue)
.onTapGesture {
move.send()
}
Avec la seconde moitié de cette action décrite dans ce code. Dans cet extrait, j’ai configuré un abonnement au message qui envoie un deuxième message au modèle de la scène.
moving = move
.throttle(for: 0.01, scheduler: RunLoop.main, latest: true)
.sink(receiveValue: { [self] _ in
model.notifications.tapKnight.post()
})
Voici une démo avec mon chevalier montrant tout cela se met en place. Je tape sur le bouton et le chevalier fait un 360.
Le RC vaut-il la peine ou non ?
Les animations ont certainement leur place, et en ajouter une à chaque pièce ou une seule animation géniale pourrait être une bonne chose. Mais clairement, j’ai besoin de plus.
Le RC est-il à la hauteur ? Je ne suis pas sûr. L’organisation des déclencheurs, des actions et des notifications est une longue liste hiérarchique qui se sent libre pour tous. Sans structure, ce ne sera pas plus facile à gérer que des blocs de code pour faire presque la même chose. Dans mon esprit, Apple devrait copier le menu Blender Materials et vous permettre de créer un réseau d’actions d’animation. Maintenant, cela ferait passer les choses au niveau supérieur.
Si quelqu’un lit ceci d’Apple, une API liée à la scène pourrait être une option intéressante. En effet, pendant que j’y pense, je pourrais peut-être en construire un en utilisant le nouveau ADSL capacités ainsi que ces déclencheurs, actions et notifications. Nourriture pour la pensée. Faites cela, et je peux créer mon propre outil pour gérer les animations.
Suivant
Cela dit, l’un des principaux points à retenir que les gens d’Apple ont déclaré lors de la WWDC2022 pour les applications de réalité augmentée est que vous devez donner aux objets avec eux l’impression qu’ils sont réels… et pour ce faire, vous devez utiliser la physique.