Animation Flash dans Unity3D à partir de zéro. Première partie, lyrique

Dans cette série d'articles, je vais vous expliquer comment et pourquoi nous avons décidé de créer notre propre solution pour l'importation d'animation Flash vers Unity, ainsi que les techniques d'optimisation et le fonctionnement interne du plug-in. J'ai également beaucoup d'autres choses fascinantes à raconter: les composants internes du format SWF, les fonctionnalités spéciales de l'extension de l'éditeur Unity et les questions générales d'animation. Vous trouverez tout cela à l'intérieur!




Présentation


Lorsque vous commencez à travailler sur un projet, vous devez toujours faire face au problème du choix des technologies pour la plupart de ses composants. L'un de ces composants est, bien sûr, le système d'animation. Maintenant, il y a quelques variables dont dépendra votre choix. La première question que vous devez vous poser est de savoir avec quels outils vos animateurs sont habitués (peuvent travailler) et lesquels sont plus faciles à trouver. Bien sûr, choisir un produit extrêmement spécifique n'a pas beaucoup de sens. Dans ce cas, si vos employés partent pour une raison quelconque (ou se font renverser par un bus), il sera presque impossible de les remplacer. Donc, en gros, votre projet, en tout ou en partie, sera arrêté pour une durée indéterminée, ce qui peut être très coûteux, notamment pour un produit commercial. La deuxième variable est plus technique, et elle consiste à intégrer les outils dans votre moteur. Existe-t-il des solutions tierces et quelle est leur qualité? Avez-vous la possibilité et la capacité de créer votre propre solution? Bien sûr, l'efficacité et la commodité de tout ce qui précède est également cruciale. Et la troisième variable est la capacité des outils. Ainsi, si vous avez vraiment, vraiment besoin d' une cinématique inverse , il serait très étrange de votre part de préférer l'animation non squelettique.


Types d'animation 2D


Maintenant, regardons les techniques d'animation les plus populaires dans les jeux. Je ne considérerai que l'animation 2D, car l'animation 3D est un sujet pour une conversation complètement différente, avec ses propres approches et outils. N'hésitez pas à sauter cette section si vous connaissez bien cette question (croyez-moi, il n'y aura pas de révélations ni de révélateurs). De même, si vous n'êtes ici que pour voir les fonctionnalités de l'animation Flash, vous les trouverez dans l'article ci-dessous.


Animation image par image


Lancement de notre mini-revue, le type d'animation le plus simple et le plus ancien: l'animation image par image. Dans cette animation, chaque image est représentée par une image individuelle, et en changeant ces images très rapidement, nous obtenons l'illusion du mouvement.


Avantages:


Implémentation élémentaire, généralement disponible pour tout moteur. Quelle que soit la complexité et le style d'animation, vous pouvez même insérer l'ensemble des images du film (en théorie, bien sûr). Tous les outils: presque tout peut vous fournir une séquence d'images que vous pouvez, si vous en avez besoin, rassembler en un seul atlas de texture.


Inconvénients:


Le principal inconvénient est, bien sûr, la quantité de mémoire requise par tout cela. Certes, vous pouvez utiliser toutes sortes d'astuces, telles que la découpe de cadres en blocs, puis la réutilisation des blocs répétitifs, le chargement en arrière-plan des cadres du disque et la suppression de ceux déjà affichés, etc. Mais rappelez-vous que toutes ces astuces ont aussi leurs propres inconvénients. Par exemple, la découpe en blocs ne peut être utilisée que dans le pixel art , le chargement en arrière-plan exerce une pression supplémentaire sur le disque, prend beaucoup d'espace sur ce disque, augmentant ainsi la taille du jeu lui-même, ainsi que la quantité de données requises pour qu'un utilisateur puisse le lancer ou le mettre à jour.


Conclusion:


Fonctionne uniquement pour les petites et quelques images d'animation, parfait pour le pixel art et les jeux de style rétro comme NES .


Animation vidéo


Fondamentalement, l'animation vidéo est une apothéose de la folie image par image. Et oui, il est toujours appliqué et parfois même à juste titre. Nous avons implémenté quelque chose comme ça dans les jeux d' objets cachés pour une animation volumineuse et complexe, ainsi que pour des cinématiques avec une touche de réalisme. Ajoutez à cela des codecs comme theora ou vp8 , et vous pourrez créer votre propre animation vidéo (même avec la composition alpha ).


Ce qui est bien avec ce genre d'animation, c'est bien sûr que vous pouvez créer presque n'importe quoi, des scènes gérées par la scène avec de vrais acteurs aux batailles en 3D. Une mauvaise chose est une grande charge sur le CPU lorsque vous décodez et, bien sûr, la qualité d'image. Le compromis entre qualité et efficacité ne peut être atteint que dans un nombre limité de cas spécifiques, comme dans les jeux d'objets cachés mentionnés ci-dessus.

Donc, de toute façon, l'animation vidéo n'est pas pour tout le monde et n'est pas toujours applicable, presque jamais, pour être précis. Fondamentalement, ce type d'animation fonctionne très bien uniquement pour les cinématiques rendues. Si vous parvenez à faire une bonne mise en œuvre d'une telle animation, ce ne sera certainement pas un morceau de gâteau. Il y a des tonnes de nuances et d'astuces à garder à l'esprit, tant en ce qui concerne la qualité de l'image de sortie que la charge du processeur. En raison de cette spécificité, il existe très peu d'implémentations prêtes à l'emploi, qui ne sont pas assez bonnes ou qui coûtent cher (bonjour, Bink_Video ), donc la plupart des gens préfèrent écrire les leurs.


Animation squelettique


Passons donc à des types d'animation 2D plus populaires et plus modernes. Les animations squelettiques gagnent de plus en plus les cœurs et les esprits des développeurs 2D, devenant la norme d'animation de jeu. Ce qui est drôle, c'est qu'ils sont devenus si populaires en 2D relativement récemment, contrairement à la 3D, où ils remontent très loin, lorsque nos ancêtres créaient Half-Life . L'essence de l'animation squelettique, vous seriez surpris, est un squelette créé par un animateur. Fondamentalement, un squelette est un ensemble d'os connectés les uns aux autres et formant une structure arborescente. Les os sont liés en morceaux, représentés par des images individuelles. Cette construction commence à bouger lorsque les os sont déplacés ou tournés les uns par rapport aux autres. Les déplacements et les rotations des os du squelette respectent la chronologie générale de l'animation.


Les avantages sont évidents: nous n'avons pas à stocker chaque image d'animation en tant qu'image distincte, uniquement les pièces (par exemple, les jambes et les bras du personnage), qui seront déplacées par les os. Il existe des implémentations vraiment cool de ce type d'animation avec des temps d'exécution pour différentes plates-formes et moteurs, qui sont abordables ou même gratuits: Spine , Spriter , Anima2D , DragonBones et autres. En utilisant le squelette et ses fonctionnalités, vous pouvez obtenir un niveau de fluidité incroyable de votre animation en interpolant les positions des os. Vous pouvez également alterner les transitions entre les scènes et même mélanger deux types de scènes différents: prise de vue en cours d'exécution, prise de vue en rampant, etc. Je ne vais pas énumérer toutes les possibilités d'animation squelettique, alors gardez à l'esprit qu'il y en a vraiment beaucoup et qu'elles sont vraiment cool. Et je préfère vous donner un lien vers le site Web de la colonne vertébrale où vous pouvez les examiner attentivement, avec des photos et des descriptions


On dirait que nous avons eu notre soldat universel, mais pas tout de suite. Il a également ses propres inconvénients. Et je dois dire tout de suite que pour de nombreux projets et animations, ces inconvénients peuvent même ne pas exister. Donc, si l'animation squelettique fonctionne pour vous - c'est tout simplement génial, utilisez-la, car elle a l'air vraiment fine et moderne.


Revenons maintenant aux inconvénients. L'animation squelettique nécessite une étape supplémentaire - le gréement. Il s'agit de créer un squelette et de relier des os et des pièces. Si votre objet n'a qu'une seule animation, pas quelques-unes, comme par exemple le personnage du jeu de plateforme , alors cette étape ne vous sert à rien. Vous devez également vous rappeler que toutes les scènes ne peuvent pas être facilement animées avec des os. En fait, il existe de nombreux exemples où il est préférable de s'en passer, à la fois en termes de création et de performances de fin de jeu. Je voudrais également souligner que la disponibilité d'experts sur le marché est un facteur important. Bien sûr, avec la popularité croissante de l'animation squelettique, leur nombre augmente également, mais il ne sera probablement pas facile pour vous de les intégrer dans votre équipe. La variété des outils fait également sa part. Chacun a ses propres préférences, mais il faut être flexible et prêt à apprendre, ce qui crée des difficultés supplémentaires pour recruter et former vos employés.


Animation de la chronologie


J'ai gardé ce type d'animation pour la fin non pas parce qu'il est meilleur que tous les autres, mais parce qu'il est principalement représenté par une animation Flash dont nous allons parler dans la partie technique de cet article. Maintenant, Flash n'est pas le seul représentant de ce type d'animation, mais c'est certainement le principal, donc à partir de maintenant, je vais tout décrire par rapport à lui. Les scènes d'animation de la chronologie sont constituées de pièces animées en différents calques sur la chronologie. Fondamentalement, c'est presque la même chose que ce que nous avons vu dans l'animation squelettique, mais sans squelettes. En utilisant les images clés de la chronologie, nous pouvons déplacer, faire pivoter, remplacer et ajouter de nouvelles pièces dans ces images et, bien sûr, interpoler les transitions, les mises à l'échelle et les rotations entre elles. Cela signifie que dans ce cas, nous déplaçons non pas les os auxquels les pièces sont attachées, mais les pièces elles-mêmes. Bien sûr, cela nous prive de nombreuses possibilités d'animation squelettique, mais comme je l'ai déjà dit, tout le monde n'en a pas besoin. De plus, nous bénéficions d'autres avantages, tels que:


  • possibilité d'ajouter et d'insérer de nouvelles pièces au milieu d'une scène;
  • pas de gréement, pas d'os parfois inutiles;
  • Adobe Flash (actuellement Adobe Animate ) l'outil d'animation le plus ancien et testé au fil des ans; un grand nombre d'animateurs, d'une manière ou d'une autre, peuvent travailler avec lui;
  • possibilité d'utiliser d'anciennes scènes lors du transfert de vos projets Flash vers Unity, y compris les scènes que vous avez créées dans des graphiques vectoriels , pas seulement dans un raster .

Vous pouvez vous demander, Flash n'est-il pas mort? En tant que navigateur, oui, mais en tant qu'outil d'animation, il est toujours dans le jeu. Et je vais vous en dire plus, il n'y a aucune alternative à Flash maintenant ou prévue. Y a-t-il des inconvénients? Bien sûr. Et le principal inconvénient est que ... ce n'est pas une animation squelettique, ha-ha. Donc, nous perdons la possibilité de mélanger nos scènes les unes avec les autres, la cinématique inverse et quelques autres fonctionnalités que vous ne pouvez utiliser que lorsque vous travaillez avec des squelettes. Mais nous avons des chronologies les unes dans les autres, ainsi que des masques raster et vectoriels! Et les animateurs adorent les masques! Ici, il faut noter que Spine a également récemment ajouté l' option d'écrêtage , mais jusqu'à présent, ils sont uniquement géométriques et sévèrement limités par rapport aux masques Flash.


Types d'animation: Résumé


Bien sûr, je n'ai pas répertorié tous les types d'animation, mais seulement les principaux. Par exemple, j'ai laissé derrière moi ce qu'on appelle l'animation procédurale, lorsque les objets ou les pièces sont uniquement pilotés par du code, mais il n'est guère possible de comparer celui-ci à d'autres, et je ne voulais pas rendre l'article trop long à lire. Je suppose que maintenant, il vaut mieux que nous examinions de plus près quelque chose de plus spécialisé dans l'animation pour compléter l'image.

Donc, pour résumer. Comme toujours et ailleurs, il n'y a pas de soldat universel ici. Vous devez choisir votre solution en fonction de votre projet, de vos tâches et des personnes. Après tout, qui a dit que vous n'aviez à utiliser qu'un seul type d'animation à la fois? Il y a beaucoup de projets où nous pouvons voir tous les types d'animation utilisés, et tout le monde est content. Animation vidéo pour les cinématiques, squelette pour les personnages, chronologie pour les décors, procédure pour le vol des systèmes de particules des émetteurs et image unique pour les particules elles-mêmes. Nous tirons simplement le meilleur de chaque type.


Dilemme et décision d'écrire notre propre solution


Quoi qu'il en soit, pour des raisons objectives, nous avons décidé que pour notre projet, nous avions besoin d'une animation Flash. Puis la question s'est posée, de leur intégration dans le moteur. Après avoir essayé plusieurs options de plug-in, nous avons opté pour celle que nous considérions la meilleure pour ses capacités. Bien qu'il soit vivant et bien soutenu, il avait également une licence d'entreprise totalement inabordable, mais qui peut vraiment mettre un prix sur un bon produit? Maintenant, je ne vous donnerai intentionnellement aucun nom, donc ne faites pas ressembler à de la publicité ou de l'anti-publicité.

Nous avons passé près d'un an de développement avec ce plug-in, période pendant laquelle il est devenu clair pourquoi nous ne pouvons pas continuer à l'utiliser. C'est en particulier la qualité de son intégration à Unity. Cela a entraîné des bogues assez graves qui ont été vaincus par les développeurs pas facilement, pas rapidement et non sans combat. Les performances sur les appareils cibles étaient également terribles, et pour nous, cela signifie toujours le niveau iPad 2 . C'est arrivé parce que nous avons essayé de faire une intégration à un moteur particulier, en ignorant ses spécificités et ses nids de poule. Nous étions plus que satisfaits de la fonctionnalité, mais les développeurs ont refusé d'ouvrir le code source pour nous, même sur une base individuelle. C'est ainsi que nous avons décidé d'écrire notre propre solution.

J'ai eu une expérience assez réussie dans l'écriture d'extensions pour Unity et une petite expérience dans la conversion de scènes d'animation Flash à mes propres formats. Cela fait un certain temps depuis le dernier, pour être juste, mais quelque chose dont je me souviens encore. Dans le même temps, j'ai pris la décision d'écrire tout cela comme un projet pour animaux de compagnie, donc je ne dépendrais pas du projet principal ou de l'entreprise où je travaille. Et, avouons-le, c'est agréable d'avoir une telle production par vous-même. Quoi qu'il en soit, armé d'une spécification de format SWF de 250 pages, je me suis lancé dans la bataille.


Options d'exportation


Pour commencer, discutons des options que nous avons pour exporter l'animation à partir de l'éditeur Flash. Il y en a quelques-uns, chacun ayant ses propres avantages et inconvénients. Nous allons passer en revue les principaux.


Format .XFL


Dans l'éditeur d'animation Flash, vous pouvez enregistrer le fichier source dans un format .XFL non compressé au lieu du fichier .FLA fermé par défaut. Maintenant, ce format est assez facile à utiliser, mais il n'a pas de documentation. Fondamentalement, il se compose de quelques sous-répertoires et d'un tas de fichiers .XML décrivant tous les états des clips stockés à l'intérieur. Le format de description est également très simple et compréhensible, comme vous pouvez le voir dans l'exemple ci-dessous:


static_clip.xml

<DOMSymbolItem name="static_clip" itemID="5c719f28-00000051" lastModified="1550950184"> <timeline> <DOMTimeline name="static_clip"> <layers> <DOMLayer name="Layer_1" color="#00FFFF" current="true" isSelected="true"> <frames> <DOMFrame index="0" keyMode="9728"> <elements> <DOMBitmapInstance selected="true" libraryItemName="bitmap.png"/> </elements> </DOMFrame> </frames> </DOMLayer> </layers> </DOMTimeline> </timeline> </DOMSymbolItem> 
Lien source

Ce que nous avons obtenu ici est ce clip, static_clip avec un calque, Layer_1 et une image stockant une image raster appelée bitmap.png .


movie_clip.xml

 <DOMSymbolItem name="movie_clip" itemID="5c719f30-00000053" lastModified="1550950713"> <timeline> <DOMTimeline name="movie_clip"> <layers> <DOMLayer name="Layer_1" color="#00FFFF" current="true" isSelected="true"> <frames> <DOMFrame index="0" duration="4" tweenType="motion" motionTweenSnap="true" keyMode="22017"> <elements> <DOMSymbolInstance libraryItemName="static_clip"> <matrix> <Matrix tx="-50" ty="-50"/> </matrix> <transformationPoint> <Point x="28.5" y="27.5"/> </transformationPoint> </DOMSymbolInstance> </elements> </DOMFrame> <DOMFrame index="4" tweenType="motion" motionTweenSnap="true" keyMode="22017"> <elements> <DOMSymbolInstance libraryItemName="static_clip" centerPoint3DX="128.5" centerPoint3DY="127.5"> <matrix> <Matrix tx="100" ty="100"/> </matrix> <transformationPoint> <Point x="28.5" y="27.5"/> </transformationPoint> </DOMSymbolInstance> </elements> </DOMFrame> </frames> </DOMLayer> </layers> </DOMTimeline> </timeline> </DOMSymbolItem> 
Lien source

Ici vous pouvez voir la description du clip movie_clip , qui se compose de deux images clés avec les index 0 et 4, respectivement. Dans ces images, notre clip static_clip est stocké par les coordonnées (-50;-50) et (100;100) . Ici, il y a une interpolation de mouvement entre les images (une animation procédurale, dans notre cas, ce n'est qu'un décalage, sans mise à l'échelle ni rotation). Ainsi, la position du clip statique entre les images clés peut être calculée en utilisant une interpolation linéaire des coordonnées que nous prenons à partir de ces images.

Bien sûr, dans le cas d'une véritable animation, tout sera, euh ... un peu plus compliqué et volumineux, mais tout peut être compris, même sans documentation. Et il pourrait vous sembler que c'est ça. Et en fait, je suis au courant de plusieurs projets et entreprises qui ont suivi cette voie et qui ont connu un certain succès, mais non sans limitations et difficultés. Et ces difficultés sont la vraie bosse du .XFL, qui sont:


  1. Les interpolations peuvent être très différentes, à la fois simples - avec interpolation linéaire et plus complexes - avec des fonctions et des graphiques personnalisés de cette interpolation; le morphing des graphiques vectoriels sur les préadolescents n'est effectué que selon leurs propres règles, compréhensibles uniquement pour les gars de Macromedia et d'Adobe;
  2. Les graphiques vectoriels, comme toutes les animations, à l'exception des graphiques raster, sont décrits dans un fichier texte. Par exemple . Cela signifie que vous devez écrire votre propre rasterizer, ce qui, en raison de la nature et de la complexité du format vectoriel dans Flash, ne peut pas être fait;
  3. Les règles de lecture des animations, y compris celles imbriquées, doivent être créées à partir de zéro. Il n'y a pas de documentation pour cela, et des réponses à des questions telles que quand et quelle image doit être affichée, quand l'interpolation et quand la laisser sans interpolation, vous devrez le découvrir par vous-même, tout en essayant de couvrir tous les cas possibles pendant les tests, ce qui, croyez-moi, est un exercice très simple pour une solution générale et non privée.

Ce ne sont pas tous des inconvénients de cette approche, mais je pense que cela suffit pour que vous compreniez que cela ne fonctionnerait pour une solution générale qu'avec de fortes limites. Il y a longtemps, j'ai emprunté cette voie en travaillant sur l'un de mes projets. Il y avait des cinématiques Flash avec des interpolations classiques (sans règles d'interpolation personnalisées et des fonctions d'interpolation spéciales), des graphiques raster jut et aucune autre opportunité avancée fournie par l'éditeur Flash. J'ai trouvé cette solution propriétaire assez rapidement et efficace, mais elle nécessitait toujours de sérieuses limitations sur les animateurs, afin qu'ils n'utilisent rien que vous puissiez appeler compliqué. L'approche a le droit d'exister et il y a quelques bibliothèques basées sur elle, avec des degrés variables de minable, mais, comme je l'ai dit, elle fonctionne avec beaucoup de limitations.


Scripts .JSFL


Une autre option presque fonctionnelle pour obtenir des informations sur nos animations, les scripts .JSFL vous permettent d'étendre votre éditeur Flash, d'interagir avec son environnement, de modifier votre animation et, bien sûr, d'obtenir toutes les informations nécessaires sur les chronologies, les calques, les clips et les images à l'intérieur . Il est également utilisé par les animateurs pour automatiser divers processus, mais c'est en fait une histoire complètement différente. Dans l'ensemble, l'approche présente tous les inconvénients de la précédente, donc je ne vais pas y aller profondément. Permettez-moi de dire que cela vous permet d'exporter vos scènes d'animation, par exemple, image par image, mais nous savons que ce n'est pas ce qu'un vrai Jedi ferait (mais, bien sûr, cela pourrait être fait dans certains projets). Nous reviendrons sur ces scripts plus tard, lorsque nous discuterons de l'approche que j'ai choisie: pour la pixellisation des graphiques vectoriels et l'optimisation des scènes exportées.


Application AIR


Cette approche fonctionne vraiment et peut être utilisée comme il se doit. Pourtant, je ne l'ai pas choisi, mais je vais vous parler de cette option, juste pour mémoire. L'essence de cette approche est que nous créons une application AIR sur Flash lui-même ou, pour les puristes, par exemple, sur Haxe . Cette application va extraire toutes les informations des scènes d'animation que vous avez déjà compilées au format SWF. Dans l'application, nous lisons la scène image par image, obtenons toutes les informations sur les images et l'enregistrons au format le plus approprié pour notre exécution. En utilisant cette méthode, nous abordons tous les problèmes que j'ai mentionnés ci-dessus:


  • nous n'avons pas besoin de pixelliser nos graphiques vectoriels, car cela sera fait par le runtime Flash. La seule chose qui nous reste à faire est d'obtenir ces informations et de sauvegarder la sortie raster de nos morceaux vectoriels;
  • nous n'avons pas à inventer de règles de lecture et à gérer l'interpolation d'interpolation personnalisée, le lecteur Flash intégré à l'application AIR sait exactement comment cela doit être fait et fait essentiellement le travail pour nous;

En bonus, nous avons la possibilité d'utiliser des scripts de cadre (tous les play() , stop() et autres gotoAndPlay() , certains animateurs les aiment vraiment). Comme inconvénient, nous perdons une occasion d'exporter les scènes en boucle dans Flash lui-même. Mais ce n'est pas si mal, vraiment, car nous pouvons les boucler dans notre runtime, et les animateurs pourraient tout préparer pour cela.


Il convient de noter maintenant que je suis sûr que tout sera plus ou moins difficile que je ne le décris, car personnellement je n'y suis pas allé, donc je ne peux pas vraiment vous dire tous les détails. Je souhaite la bienvenue à ceux qui sont allés dans ce sens pour partager leur expérience, je serai heureux de lire sur vos succès et vos échecs!


Votre propre lecteur flash


C'est probablement l'option la plus juste, la plus évidente et la plus simple de toutes, mais c'est aussi la plus difficile. Après tout, c'est ce que fait un vrai lecteur Flash, celui que la plupart d'entre nous a installé dans le navigateur préféré en tant qu'add-on. Maintenant, les représentants populaires de ce genre sont: gameswf et, né du premier, scaleform . Tous les deux sont morts aujourd'hui. Ce qui est fascinant à leur sujet, c'est qu'ils étaient principalement utilisés pour les implémentations GUI dans divers projets, y compris AAA . Mais notre intérêt est dans les internes, pas dans les applications des bibliothèques mortes.


Tout lecteur Flash décent a au moins deux choses importantes cachées à l'intérieur:


  • Analyseur de format SWF;
  • rasterizer de graphiques vectoriels;
  • machine virtuelle pour lancer ActionScript du code;
  • bibliothèque standard pour un code personnalisé;

Je sais que tu penses. Chacun de ces points ci-dessus crie que même si quelque chose comme cela est possible à implémenter, vous devrez changer de équipe pour cette tâche et passer quelques années sur le développement de la version de base. Même la mise en œuvre d'une petite partie juste pour jouer quelque chose, vous prendra un certain temps, et vous pouvez être sûr que les ajouts supplémentaires sous la forme de nombreuses parties non documentées de ce pipeline doubleront cette longue période.


Oui, Internet est plein de tentatives pour implémenter chacune de ces parties, variant en degrés de minable et de bug. Mais vous ne pouvez même pas prendre ces développements comme base pour vos propres trucs car vous ne devriez passer des années que pour la chasse aux bogues. Vous devrez également ajouter tous les tests unitaires non écrits avant de vous rendre compte que vous ne pourrez jamais implémenter complètement chaque petite chose. Les gars qui ont essayé d'ajouter les capacités nécessaires à gameswf comprendront de quoi je parle. Un bon lecteur Flash devrait également pixelliser les graphiques vectoriels non à l'avance, mais pendant l'exécution, ce qui aura un impact sur les performances que tous les projets ne peuvent pas atteindre. Soit dit en passant, je veux dire bonjour aux survivants qui ont essayé d'utiliser Scaleform sur des appareils mobiles. Quoi qu'il en soit, c'est la voie la plus solennelle et la plus désespérée, et ce n'est certainement pas notre choix.


Combiner les approches


Donc, nous sommes enfin passés à mon option. Après avoir étudié toutes les manières possibles, j'ai trouvé cette combinaison intéressante. Il est relativement facile à mettre en œuvre, gérable par une seule personne et offre en même temps suffisamment de fonctionnalités pour couvrir tous les besoins de presque toutes les productions d'animation de chronologie 2D.


Tout d'abord, nous allons utiliser la scène d'animation compilée en SWF, pour ne pas inventer diverses options de lecture et ne deviner presque jamais comment fonctionne le lecteur Flash à l'intérieur, car nous ne pouvons pas couvrir tous les cas, mais nous sommes toujours à la recherche de la solution générale. De plus, Flash Editor se débarrasse de toutes les interpolations que nous avons utilisées dans notre animation, nous donnant seulement les positions nues des pièces dans le SWF compilé.


Deuxièmement, nous interdisons l'utilisation de scripts dans l'animation. Oui, cette exigence est certainement très difficile et triste, mais je n'ai pas toute une équipe de programmeurs pour implémenter une machine virtuelle décente et une bibliothèque standard qu'ils devraient écrire presque les yeux bandés. Ici, bien sûr, vous pouvez voir un inconvénient de mon approche par rapport à la méthode d'application AIR. Dans le second, nous pourrions utiliser certains scripts pour la lecture d'animation interne. En même temps, cela ne nous empêche pas de créer de bonnes scènes d'animation. Pour transférer des informations personnalisées de la scène dans le jeu, vous pouvez utiliser ce que l'on appelle des frame labels , que vous découvrirez dans le code. Vous pouvez également épingler des événements utilisateur sur les trames particulières à l'aide des fonctions de rappel du runtime.


Ensuite, nous nous débarrassons de l'écriture de notre propre rasterizer de graphiques vectoriels, car nous ne pouvons pas l'écrire pour le cas général et pour couvrir toutes les options et possibilités de vecteur dans Flash. Au lieu de cela, nous allons pixelliser nos graphiques avant (!) Compilation en utilisant un script JSFL. Pendant ce temps, en utilisant ce même script, nous allons optimiser nos graphiques vectoriels en fusionnant les clips statiques dans une image, et zoomer les images raster résultantes vers l'intérieur ou vers l'arrière pour notre propre priorité: qualité et / ou performance. Ici aussi, il convient de prendre en compte les options de qualité / résolution de l'art pour les appareils avec différentes densités de pixels d'écran (par exemple, l'art HD et SD).


Conclusion de la partie lyrique


Ceci conclut la première partie de mon article. Dans le second, nous allons discuter des détails d'implémentation technique, des fragments de code, des images (!), De l'optimisation, des astuces et des ajustements. Bientôt, ne le manquez pas!

Source: https://habr.com/ru/post/fr445102/


All Articles