Lorsque vous avez une idée d'un nouveau mécanisme de jeu, ou même un flash de concept intéressant, vous en serez bientôt obsédé par une immense envie de commencer à faire déjà quelque chose. Parfois, vous écrivez ces idées quelque part et leur donnez une chance de déclencher un cycle de développement complet plus tard. Mais je suis tombé sur l'action inverse. Mon jeu actuel est devenu ce monstre géant qui mangeait de l'argent et du temps, et est devenu beaucoup plus grand que je ne le pensais. J'ai donc dû le remettre pendant un certain temps. Mais je ne pouvais pas m'asseoir sans développement de jeux, et pendant mon temps libre, j'ai commencé à travailler sur mon nouveau projet! De plus, celui-ci était assez différent des précédents, car j'ai décidé de cibler le mobile. Si vous êtes intéressé par la façon dont ce projet a été réalisé, d'une petite idée à la version finale, alors plongeons-nous!

De toute évidence, je parle de mon expérience et de ma vision, mais beaucoup de choses seraient communes à n'importe quel projet, et vous trouverez peut-être quelques conseils utiles pour vous-même.
Sculpter sur la base de l'idée
L'idée principale était assez simple - faisons un labyrinthe, un labyrinthe! Bien que vous puissiez trouver des jeux simples dans ce genre au magasin, mais je pense que vous devriez apporter quelque chose de plus dans le jeu que de simplement suivre le cliché de genre. Je suis profondément préoccupé par la conception de jeux en général, j'aime les histoires et les expériences d'aventure complètes avec un début distinct et une fin importante. Je ne pouvais pas faire ici une exception à mes idéaux. De plus, je voulais une mécanique de jeu intéressante. Mon approche était d'ajouter une autre variable à l'ensemble pour échapper au concept de labyrinthe. Et après quelques brainstormings, la nouvelle idée est née. C'était la chaîne et le système de commutateurs à chaîne. Ainsi, le mouvement du personnage principal est limité par la longueur de la chaîne et les chemins choisis par le joueur. Dans cet esprit, vous aurez besoin non seulement de trouver la sortie mais aussi de trouver le chemin le plus court possible! Et si je vous dis que votre chaîne est assez courte et que vous ne pouvez aller plus loin qu'après un interrupteur de chaîne qui fournira le nouveau point d'ancrage et la nouvelle chaîne de longueur différente. Maintenant, le jeu commence à être plus difficile, car vous devrez trouver le bon ordre de ces commutateurs à l'intérieur du labyrinthe. Et si cela ne vous suffisait pas - alors ajoutons des portes, que vous devez ouvrir avec des activateurs spéciaux quelque part à l'intérieur d'un labyrinthe, puis revenir en pensant toujours aux interrupteurs et à la chaîne.

Comprendre les limites
Certes, il n'a pas été facile de planifier toutes ces fonctionnalités à l'avance. Certains d'entre eux ont été réalisés en raison de limitations techniques et d'une gestion stricte du temps. Le but était de le rendre aussi rapide que possible et de ne pas augmenter considérablement la complexité de tous les aspects du jeu en cours de développement. La chaîne a été faite en utilisant les articulations et ne pouvait pas être traitée par la physique du moteur de jeu après une certaine longueur, éclatant littéralement en morceaux. J'ai donc dû restreindre sa longueur et continuer à continuer le chemin. En effet, il y avait une solution pour écrire des scripts de chaîne entièrement personnalisés simulant la vraie physique, mais c'était une tâche longue que je ne pouvais pas me permettre.
Pourtant, j'ai réussi à maintenir une certaine longueur à la chaîne, et la pensée initiale était de faire de petites chambres de labyrinthe où vous devez trouver le chemin le plus court, mais ce n'était pas suffisant. Si tout le jeu était comme ça, alors ce sera assez fastidieux car vous n'avez qu'une seule tâche répétitive sans changer l'expérience, ni même la difficulté. Pourtant, ces idées ont joué un rôle dans le match final.
Inspiration et réflexions: expérience de prototypage
Après quelques prototypes, il était clair que les labyrinthes, où vous devez vous égarer du chemin le plus court et même avoir des retours en arrière, étaient les plus intéressants. La décision finale a donc été d'ajouter des sections de gameplay distinctes les unes après les autres - les grands labyrinthes avec plusieurs commutateurs et les petits labyrinthes avec le chemin le plus court possible. Tous se sont connectés avec des couloirs vides pour libérer l'esprit du joueur du sentiment d'un défi constant. Mais juste au moment des tests est venue une autre idée qui a fourni une nouvelle pensée critique - nous avons besoin de plus de mécanismes de gameplay. Parce qu'être dans les mêmes murs de ces labyrinthes les uns après les autres, même avec une certaine courbe de difficulté, n'était toujours pas suffisant pour garder l'attention des joueurs.
Pour ajouter à la durée d'attention, n'oubliez pas que le jeu est destiné à la plate-forme mobile. Ne jamais le concevoir pour avoir de longues sessions de jeu sans interruption. J'ai décidé de faire des sauvegardes sur chaque changement de chaîne, afin que le joueur puisse partir à tout moment et ne jamais être loin de la session de jeu précédente. Bien sûr, j'ai quelques intentions sur la façon dont le jeu doit être joué, mais ma session ininterrompue maximale prévue est d'environ 5 minutes. Cela inclut uniquement les scènes où la musique est présentée.
Revenant à la variété de la mécanique, j'ai ajouté des puzzles impliquant la chaîne comme outil pour les résoudre. Il s'agit d'une excellente solution de conception de jeux - pour réutiliser des objets du monde que vous connaissez déjà comme nouvel outil.

Il y avait différentes idées de nombreuses énigmes différentes avec ce nouvel outil, mais la décision finale a été de mettre en œuvre un seul type avec une variation de sa difficulté. Si vous pensez que votre jeu a besoin de toutes vos nouvelles idées et de ses variantes, mais que vous n'avez pas le temps de les mettre en œuvre, alors arrêtez! Votre objectif ici est de terminer le jeu. Dans le cas, vous n'implémenterez pas ces fonctionnalités maintenant, ni même jusqu'à la fin du cycle de développement - la seule solution est de mettre à jour le jeu plus tard, et la seconde et plus radicale - pour créer un jeu complètement nouveau plus tard avec tous les manquants fonctionnalités. Si vous avez le produit de base en main, il serait plus facile de continuer. Ne laissez tout simplement pas les fonctionnalités pour arrêter la sortie. Ne le faites que s'ils sont la partie critique du produit complet qui lui ajoute une expérience unique et que vous ne pouvez pas imaginer le jeu sans ces fonctionnalités.
Survolez les trucs techniques: comment le monde a été construit
La chaîne a été faite avec des articulations configurables avec un mouvement verrouillé sur tous les axes. Puis instancié sous forme de segments de chaîne, avec 4 corps rigides reliés entre eux par 4 articulations dans un segment. Les sources de la chaîne sont similaires aux puits. Pour un bon fonctionnement, je viens de supprimer les segments qui passaient sous la surface et d'en instancier de nouveaux lorsque la dernière articulation du segment s'est rapprochée de la surface. De plus, le corps rigide de la dernière articulation était limité pour avoir un mouvement vertical uniquement pour servir d'ancrage. De plus, la corde a un matériau de collision spécial sans beaucoup de friction.

Le joueur a été fait avec un corps rigide qui a un simple suivi pour cibler le script pour le déplacer. Et la cible a un agent de navigation dessus. Donc, lorsque nous déplaçons notre joystick, nous ne déplaçons la cible qu'avec le système de navigation, et le corps rigide du joueur a essayé d'atteindre la cible par la force physique. Si nous n'avions que le système de navigation, la chaîne ne pourrait pas l'arrêter, et le joueur agissait exactement comme le corps rigide cinématique avec un contrôle absolu de la position. Le seul problème avec l'application de la force est qu'avec le nombre variable de segments de chaîne, nous avons également la variable en masse attachée au joueur. Ensuite, si vous avez trop de masse à l'extrémité de la chaîne, elle explosera. Et sinon, le joueur serait entraîné en arrière par la chaîne ou ne bougerait pas du tout. J'ai donc appliqué un changement de masse par rapport à la longueur réelle de la chaîne. Mais la solution la plus intéressante contre l'explosion de la chaîne - la déstabilisation de sa physique, était de limiter la vitesse maximale dans ses parties singulières par un script personnalisé.
Le Labyrinthe lui-même était fait des plus petits labyrinthes, des puzzles et des couloirs qui les reliaient tous. Quand j'ai commencé à concevoir ces labyrinthes - j'ai juste pris mon stylo et mon papier quadrillé et j'ai commencé à les dessiner mur par mur. Mais après de nombreux changements à cause du vrai prototypage et de la façon dont il a été affecté par la chaîne, j'étais sûr que c'était la façon la plus inefficace de faire les choses. J'ai donc créé une fenêtre d'édition personnalisée pour mes labyrinthes. C'était comme le stylo et le papier, mais avec un état enregistré qui pourrait générer le labyrinthe complet des murs, du sol et des chaînes préfabriquées. J'ai également ajouté un contrôle sur la longueur des chaînes-sources, et c'était la solution complète au problème de conception du labyrinthe.

Gardez à l'esprit que pour l'instanciation du temps de l'éditeur, vous devez utiliser les méthodes
PrefabUtility et non l'
instantiate commun, car sinon, vous obtiendrez des clones de vos objets préfabriqués détachés du préfabriqué d'origine.
Post-traitement
C'est une préférence personnelle mais j'adore le post-traitement et je ne pourrais pas imaginer mon jeu sans lui.
Bloom est une option incontournable, mais j'aime aussi la
profondeur de champ et la solution
FXAA simple. Avec la nouvelle pile de post-traitement, les étapes pour l'implémenter correctement étaient assez simples. J'ai également ajouté une sphère de déclenchement au-dessus du lecteur, qui avait un autre profil avec l'effet d'
aberration chromatique , qui s'est déplacé sur le lecteur au moment du changement. De plus, le profil séparé pour la cinématique de fin. Mais après l'une des mises à jour,
tout a cessé de fonctionner et après avoir testé sur l'appareil, je suis
tombé sur un autre problème . Avec un peu de
RenderDoc , la raison était claire et immédiatement corrigée, mais j'espère que nous verrons le correctif officiel de l'équipe Unity.
Début de la route des optimisations
Lorsque le jeu était presque prêt et que la lecture initiale sur mon appareil était terminée, j'ai essayé de lancer le jeu sur un appareil moins puissant que celui que j'avais auparavant dans le développement. C'était pathétique. J'ai déjà remarqué de petites baisses sur mon appareil, mais après les premières étapes de la résolution du problème de surchauffe, j'ai pensé que je ne verrais jamais un bégaiement aussi dramatique.
Pour la surchauffe - les étapes sont simples, je n'avais pas besoin de 60fps, donc verrouillé à 30. Plus un scaler de résolution personnalisé qui limitait la taille de l'écran court à 720p. Une autre astuce avec la modification des pas de
temps chez
Time Manager n'a pas fonctionné pour moi, en raison d'une telle dépendance aux calculs physiques lourds. Quand j'ai essayé d'augmenter le pas de temps, la chaîne a explosé assez souvent pour atteindre ses limites.
Tout ce travail a été effectué avant les tests des appareils faibles. J'ai donc commencé à regarder de plus près le profileur.
Un point intéressant était que j'avais trop de sources audio qui étaient activées tout le temps. Mais je n'ai jamais eu besoin d'eux tous en même temps, et les événements de les jouer étaient assez déterministes. Je me suis retrouvé avec presque toutes les sources désactivées par défaut, et ne les activant que pour l'activation du son nécessaire, puis les désactivant juste après la fin du son.
Certains scripts ont bénéficié de mises à jour manuelles au lieu de celles propriétaires, en particulier lorsque j'avais de nombreux objets similaires avec le même script et une méthode de
mise à
jour à l' intérieur.
Renommez simplement votre méthode
Update en
ManualUpdate et appelez-la de l'extérieur. Dans mon cas, tous mes puzzles étaient sur la scène, et ils ont appelé leurs méthodes de mise à jour, chaque pilier à l'intérieur de chaque puzzle avait sa propre méthode de mise à jour, et même les déclencheurs de pilier avaient leurs propres méthodes de mise à jour. Sans ces multiples mises à jour automatiques et appelant la méthode de mise à jour manuellement sur chaque objet à partir d'un seul endroit, j'ai réussi à réduire considérablement la surcharge des appels de méthodes internes d'Unity.
La dernière mais l'une des choses les plus importantes dans l'optimisation est la partie de rendu. Si vous souhaitez expédier votre jeu mobile avec des shaders
standard - alors vous êtes fou! Peut-être que dans de rares cas avec un petit nombre de matériaux et une complexité de petites variantes de shader, car le shader standard en a des tonnes, vous pouvez l'accomplir en ciblant uniquement les appareils de niveau supérieur. Mais dans mon cas, je me suis retrouvé avec presque tous les shaders modifiés pour utiliser des shaders personnalisés, basés sur des variantes de surface mobile. Mais je n'ai pas trouvé un bon moyen de simuler le métal / la douceur avec un modèle d'éclairage personnalisé, donc seuls les matériaux métalliques brillants se sont retrouvés avec un shader standard. Cependant, si vous voyez les versions compilées, il n'est pas évident de choisir la bonne lorsque vous avez plus de 190 opérations dans le shader standard contre moins de 70 dans un shader personnalisé. N'oubliez pas que l'approche
PBR , qui comprend le shader standard par défaut, est vraiment gourmande en
GPU et beaucoup trop complexe pour les mobiles. Vous devez utiliser des shaders spécialement optimisés pour les mobiles dès le début du développement. Faites-les pour vous-même ou utilisez ceux qui sont intégrés à Unity.
Le prochain arrêt: débogueur de trames
La prochaine astuce de performance consiste à vérifier le débogueur de trame pour les ruptures de traitement par lots inhabituelles. Ou tout simplement pour voir le nombre d'appels dont vous avez besoin pour rendre la scène entière.
J'ai eu un comportement étrange lorsque le débogueur a révélé que certains objets restitués séquentiellement cassaient le lot malgré le même matériau. Même le message n'était pas clair car il disait que j'avais différentes sources de lumière pour eux. Mais toute la scène a utilisé la seule source de lumière directionnelle! Ces objets avaient le même matériau, et toutes leurs propriétés étaient les mêmes! Mais pas tous parce que je ne regardais que le matériau et les propriétés de rendu. La vraie raison était que j'ai changé ma source de lumière pour une élimination personnalisée par couches. Et l'objet de séquence de rupture était dans un calque spécifique qui n'était tout simplement pas allumé.
Quoi qu'il en soit, le débogueur d'images affiche parfois un étrange ordre de rendu qui rompt le traitement par lots. Certaines de ces occurrences étaient ridicules, et la correction manuelle de la file d'attente de rendu des matériaux a aidé à le résoudre.
En outre, le débogueur d'images a montré que, malgré la quasi-totalité des objets rendus statiques, j'avais beaucoup de lots qui n'avaient aucun sens. Tout simplement parce que j'en avais tellement, que le doseur a fait de nombreux maillages statiques et n'a jamais essayé de les regrouper par position. Dans ce cas, j'avais mes murs de labyrinthe sur un écran composé de 5 ou 6 lots différents. Mais ceux faits du même matériau! Je me suis retrouvé à n'ajouter que des objets de sol comme statiques car tous les ont fait à l'intérieur d'un maillage par lots. Et le reste a été laissé avec les murs groupés dynamiquement sans aucun problème, avec leur file d'attente de matériel corrigée en une seule. Le batching dynamique fait un peu de bruit sur le
CPU , mais dans mon cas, la différence même sur le périphérique faible était juste marginale par rapport au
batching statique personnalisé via
StaticBatchingUtility . Et le traitement par lots dynamique était encore plus efficace pour moi pour enregistrer les appels que le traitement statique personnalisé sur les cas de bord.
Les autres choses que le débogueur d'images a souligné étaient les ombres et les cascades. Si vous êtes curieux, chaque cascade d'ombres est à peu près un autre shadowpass pour tout l'écran. Donc, si vous avez plusieurs lots dans shadowpass, multipliez ce nombre par le nombre de cascades que vous avez. Je viens de désactiver les cascades après cette découverte. Mais j'avais toujours besoin d'ombres en temps réel décentes et j'ai fini par ajuster la distance de détourage de la caméra et passer aux ombres proches de la qualité moyenne. Je sais que ce ne sont pas les plus jolies, mais c'était bien mieux que d'en avoir des stables avec une résolution inférieure ou aucune ombre.
Le dernier débogueur et performances du cadre est le post-traitement. Même avec seulement quelques effets activés, ceux-ci étaient presque les plus lourds - Bloom et Depth of Field. Les deux ont utilisé l'échantillonnage de la trame à basse résolution mais avec une texture d'entrée et des shaders de filtre différents. J'ai déjà changé
Bloom pour utiliser le mode rapide - filtre carré à l'intérieur du shader au lieu d'une circulaire plus complexe. Malheureusement, cela ne suffisait pas. J'ai donc fini par changer le facteur d'échelle de résolution dans le tampon de trame initial de l'effet. Il utilise la demi-résolution par défaut, mais j'ai vu de grandes améliorations lorsqu'il n'est pas utilisé la demi-résolution mais seulement un tiers de celle-ci. Le rétrécir plus d'un quart n'a presque pas eu d'effet avec d'autres visuels dégradants. Donc ma solution pour post-traiter sur mobile est un tiers! Ou en utilisant des solutions entièrement personnalisées.
Presque là: polonais!
Naturellement, chaque projet est unique, et vous devriez penser au vôtre en particulier, mais ici je voulais juste montrer quelles parties j'ai décidé de mettre dans mon processus de polissage et pourquoi.
Les premières étapes du polissage ont été effectuées juste après le premier test alpha et avant les optimisations de performances. Avec les premiers commentaires, j'ai ajouté des fonctionnalités mineures qui étaient presque là, mais qui ne se sont pas vraiment démarquées.
Le premier était le sol coloré, que j'avais une vision dès le début du développement, mais dans le processus actuel, toutes les palettes auxquelles je pouvais penser semblaient peu naturelles. Donc, au premier tour, je me suis terminé avec le dégradé de couleurs du clair au foncé pendant tout le chemin du jeu. Mais le test a montré que cela ne suffisait pas. Avec un peu de difficulté à travers toutes les combinaisons de couleurs, la bonne a été créée. Même ce petit détail visuel a eu un impact notable sur la sensation générale du jeu. Avec la distinction entre les étapes, vous aviez plus de sentiment d'accomplissement et de progrès.
L'autre notion était l'envie d'avoir une sensation plus amusante et dynamique du joueur. Même si je n'étais pas fan de cela au début, mais j'ai réussi à trouver un petit compromis qui se sentait mieux mais n'a pas remanié la sensation de calme du personnage. C'était le verrouillage du cristal dans le lecteur pour ne jamais tourner par rapport au monde. Mais pour le joueur qui avait l'impression que le cristal intérieur tournait à chaque mouvement. En fait, quand je n'étais qu'un enfant, j'ai eu une balle qui en avait une autre à l'intérieur. Cette partie intérieure flottait dans une petite quantité de substance liquide qui n'était pas perceptible, et quand vous l'avez roulée sur la surface, il semblait qu'elle planait sans aucun roulement du tout. Cette fonctionnalité m'a un peu rappelé ce sentiment unique.
Après tous les changements de performances, le jeu a commencé à fonctionner comme prévu, même sur cet appareil à faible performance. Pas le plus bas, mais c'était OK pour moi. Et puis j'ai le temps de réfléchir à d'autres fonctionnalités qui auront un impact sur le sentiment général du jeu et qui ont été essentielles à ma vision.
Le premier laissait les rayures sur le sol et a été mis en œuvre assez rapidement comme pool de décalcomanies. Même si vous ne le voyez peut-être jamais, cela ajoute certainement à l'atmosphère du labyrinthe.
La deuxième caractéristique qui a affecté la sensation générale à mes yeux était des pierres dans les couloirs qui auraient dû ajouter plus de dynamisme au monde froid et vide. C'était juste la vision, et aussi sans aucun problème implémenté dans le jeu final. Il a présenté une sensation étrangement satisfaisante à chaque fois que vous voyez ces petites pierres tomber dans le noir.
Point de libération
Une fois tous les tests terminés et que vous êtes satisfait du polissage, vous êtes prêt pour la sortie!
Pour moi, l'objectif principal depuis le début était de faire de l'expérience solo sans aucune distraction. La décision était donc claire: pas de publicité, pas d'achat dans le jeu, pas de boîte à butin. Pour ces fonctionnalités, vous devez concevoir le jeu dès le début pour vous en remettre fortement à une partie essentielle de l'expérience. Dans mon cas, je savais que le jeu entier pour un joueur moyen va durer environ trois à quatre heures d'expérience. J'ai donc placé un prix fixe raisonnable et je l'ai laissé partir. Il ne s'est pas écoulé assez de temps depuis la sortie pour penser à des ventes substantielles et sans aucune promotion pour le moment. Mais en tant que développeur, je suis assez satisfait du jeu, et si jamais quelqu'un l'aime, c'est un succès pour moi.
PS
En fin de compte, certaines fonctionnalités ont été laissées pour compte. En particulier, il reste encore à faire pour compléter l'atmosphère du jeu, mais ce n'est pas quelque chose qui change radicalement l'expérience, donc cela peut être fait comme une mise à jour post-sortie. Les autres fonctionnalités ne pouvaient jamais disparaître. Malheureusement pour moi, j'ai une idée excitante au moment de tester la version finale. Je pense que cela s'est produit parce qu'il y a eu une pause d'une semaine dans le développement, et j'ai un nouveau look après un retour. Peut-être qu'un jour il y aurait le deuxième jeu, mais en ce moment toutes les idées attendront que leur heure soit ramenée au nouveau cycle de développement.
PPSS'il vous plaît, si vous trouvez des erreurs de frappe ou de grammaire, envoyez-moi des messages personnels pour les corriger.