Bonjour lecteur! La première partie de l'article sur le développement de The Light Remake décrit le processus de portage du jeu vers la nouvelle version d'Unity. J'ai parlé un peu des shaders et des effets utilisés, des solutions mises en œuvre pour travailler avec la lumière, du contenu supplémentaire créé, du contenu de l'ancienne version retravaillé, etc. Dans la deuxième partie, nous parlerons d'autres aspects du développement, des post-effets, de la structure du projet, du travail avec le son, de l'optimisation et d'autres nuances.
Partie 2
Post effets
Lors du transfert du projet vers un nouveau moteur, il a été décidé de laisser les anciennes méthodes d'implémentation des post-effets qui étaient utilisées dans les versions antérieures d'Unity. Travailler avec eux était plus compréhensible pour moi et je pouvais apporter les modifications nécessaires au processus même de traitement d'image.
Gamma
Il n'y avait pas beaucoup de post-effets dans le jeu original, mais l'un des plus importants était la correction de la couleur et de la luminosité. Ensuite, j'ai réussi à obtenir au hasard une lueur blanchâtre agréable et une palette de couleurs un peu cool. La photo était contrastée et soulignait l'atmosphère fantastique du lieu. Le style visuel rappelait quelque peu la palette de couleurs Battlefield 3 de l'époque, ce qui me semblait une très heureuse coïncidence.
Une nuance intéressante est que plus tard, après le jeu original, je n'ai pas réussi à répéter complètement cet effet, il y avait toujours des subtilités qui faisaient que l'image ne ressemblait pas à l'original. À cet égard, j'ai décidé de changer la palette de couleurs du remake en une palette plus chaude et plus positive. La verdure est devenue plus lumineuse et plus expressive, et l'atmosphère est devenue plus associée à une journée d'été sensuelle. En bonus, après avoir terminé le jeu, j'ai ajouté la possibilité d'activer la correction des couleurs, similaire à l'original.
Lumière volumétrique
Un élément très important de ce remake est les post-effets associés à la lumière. Les anciennes versions d'Unity avaient un très joli effet sunburst Sun Shaft. Cependant, sa fonctionnalité était limitée, car elle ne pouvait être liée qu'à une seule source de lumière dans la scène.
À un moment donné, un effet d'éclairage volumétrique très divertissant des lumières volumétriques a attiré mon attentionIl vous permet de créer une très belle lueur dense et des rayons pouvant provenir de différentes sources. L'atmosphère de la scène devient plus volumineuse, les objets commencent à sombrer dans une légère brume d'air, ce qui m'a beaucoup impressionné. Le seul inconvénient était la forte intensité des ressources de l'effet. Néanmoins, j'ai décidé de l'appliquer et grâce à la lumière volumétrique, j'ai réussi à créer une lumière agréable du soleil tout au long de la scène, ainsi que des faisceaux de lumière mystiques dirigés à certains endroits: dans le couloir au début du jeu, dans une pièce avec un moineau. L'effet a également été utilisé pour souligner les accents sur les lampadaires qui brillent la nuit, dans l'épisode avec le projecteur, dans la chaufferie pour amplifier la lumière des fenêtres, dans la scène finale de l'ascension du personnage à la lumière.
SSAO et SSR
Les autres effets les plus lourds sont SSAO (Occlusion Ambiante), qui crée un ombrage doux dans les coins et sous les surfaces, nulle part sans. SSR (Screen Space Reflections) a également été ajouté, avec lequel il y avait de nombreux problèmes même au stade du développement. Le SSR simule les reflets sur les surfaces brillantes, ce qui donne de jolis reflets sur les carreaux, le métal, etc. Le problème est que l'effet était très lourd et réduisait presque de moitié le FPS sur mon matériel. Grâce à quelques manipulations dans le code post-effet, j'ai réussi à réduire légèrement la qualité du calcul et à améliorer légèrement les performances. En général, la fréquence d'images est devenue acceptable, mais dans certaines conditions (par exemple, avec Vsync activé), la SSR provoquait des gels et des saccades périodiques lorsque le personnage se déplaçait.
Autres
En plus des effets répertoriés, le projet utilise également la vignette, l'aberration chromatique, la cartographie des tons, l'anticrénelage, le brouillard global et la floraison. Pour l'optimisation, la vignette, l'aberration et le mappage de tons ont été combinés en un seul processus.
À propos, maintenant, lorsque je travaille avec le graphisme, je me souviens souvent de mon expérience personnelle d'étudier dans une école d'art, où on nous a appris à mettre en valeur les ombres contrastées sous les objets, à afficher des réflexes sur les surfaces des objets et à appliquer de la brume à l'horizon lorsque l'on travaille avec des paysages pour souligner une perspective aérienne. Maintenant, je sais que tout était SSAO, SSR et Global Fog!
Comment ça fonctionne?
Le projet original a été assemblé littéralement sur le genou. À cette époque, je n'avais aucune compétence en programmation et toutes les fonctionnalités du jeu étaient construites sur quelques scripts simples. Le principal était le script de déclenchement Activate, que j'ai trouvé dans les ressources Unity standard. Toutes les fonctions étaient basées sur le fait que le personnage entre dans un déclencheur, allume ou éteint certains objets et provoque les actions nécessaires. Il n'était pas question de sauvegarde ni de paramètres en jeu.
Système
Bien sûr, pour implémenter le remake, il était nécessaire d'écrire tout le système de jeu à partir de zéro: le système de contrôle, les sauvegardes, les paramètres et les mécanismes du jeu. En général, la construction compétente du système de projet reste une tâche difficile pour moi. En règle générale, je crée un objet système de base avec plusieurs objets enfants. Chacun d'eux remplit son propre groupe de fonctions et ils sont tous liés.
Étant donné que le jeu consiste essentiellement en un seul emplacement, j'ai décidé de ne pas me soucier de charger des scènes, des préfabriqués et des composants, j'ai placé tout ce dont j'avais besoin dans une scène principale. Des contrôleurs ont été créés pour gérer tout ce dont vous avez besoin, changer les paramètres, sauvegarder le jeu et lire les données sauvegardées, lire les textes pour les sous-titres et les notes à partir d'un fichier spécial à la racine du jeu, etc. Pour faciliter la mise en œuvre, comme dans les jeux précédents, il a été décidé d'utiliser le système de sauvegarde dans les points de contrôle. L'emplacement contient plusieurs dizaines d'objets interactifs tels que des portes, des éléments de jeu, des lampes à pétrole, etc. Pour chaque sauvegarde, il est nécessaire d'enregistrer les identificateurs d'état de l'objet, qui sont généralement une variable Int. Par exemple, la porte est fermée et verrouillée avec une clé: DoorOpen - o, DoorLocked - 1.Je n'entrerai pas dans les détails concernant le sujet de la programmation, puisque mes compétences dans ce domaine sont quelque peu spécifiques et superficielles, mais elles sont tout à fait suffisantes pour mettre en œuvre mes propres projets.
Deux finales
Une tâche intéressante pour moi a été la mise en œuvre de la notation virtuelle pour atteindre l'une des options de fin. Je voulais introduire un élément du défi dans le gameplay du remake et l'idée m'est venue de connecter cette idée avec le symbole principal du jeu - avec la lumière. Il a été décidé de créer un compteur qui analysera le niveau de lumière ambiante par plusieurs paramètres. La fin du jeu dépendra de la durée pendant laquelle le joueur reste dans un endroit éclairé ou au soleil. La première étape consiste à collecter les informations des sondes lumineuses placées dans la scène et le niveau de leur luminosité. Ce paramètre est traduit en moyenne et écrit dans une variable flottante.
De plus, le script prend en compte la présence de sources lumineuses supplémentaires à proximité, par exemple des lampes, la lumière des fenêtres, une lanterne allumée ou un briquet à la main. La présence de l'une des conditions ajoute certaines valeurs aux indicateurs lumineux déjà calculés. Et enfin, la lumière directe du soleil a l'effet le plus puissant sur le personnage. À partir d'une source de soleil, un raycast est tiré sur le personnage, qui indique au système si le joueur est en plein soleil.
Toutes ces valeurs sont résumées et comptées par un compteur, qui à la fin du jeu détermine à quoi ressemblera la finale. Si le joueur visitait rarement le ciel ouvert, sous des rayons directs, utilisait rarement une lanterne et un briquet, le paramètre final sera faible. Le système ne détermine pas toujours avec précision le niveau d'éclairage, mais en général, il s'acquitte de sa tâche. Pour le débogage et comme élément supplémentaire, il y a des taches de peinture réfléchissante sur le tuyau en métal dans les mains du personnage, ce qui est un indicateur d'éclairage.
Sous-titrage et localisation
Pour le remake, une nouvelle approche de la localisation et, en général, de l'affichage des textes et des messages a été élaborée. Plus précisément, cette approche a déjà été utilisée dans le projet du 7e secteur, mais le volume de contenu y était beaucoup moins important. La méthode de sauvegarde des données dans un document hml est prise comme base. Toutes les informations textuelles pour la localisation sont initialement stockées dans un fichier xml à la racine du jeu. Les messages sont divisés en groupes et sont étiquetés individuellement, appartiennent à certaines catégories et à certaines langues. Pour un saut de ligne, j'ai décidé d'utiliser le caractère (*), et de commencer un nouveau message (#).
Au bon moment (lors du choix d'une langue et du démarrage d'une scène), le contrôleur lit toutes les informations textuelles, les divise en lignes et en groupes séparés, et les écrit dans une sorte de bibliothèque ou de dictionnaire. Ensuite, des scripts individuels lisent ces informations, par exemple, lors de l'ouverture d'un menu ou de l'activation des sous-titres à l'écran. Le système m'a semblé personnellement pratique et, surtout, compréhensible. Il vous permet d'entrer facilement une nouvelle langue et d'apporter des modifications au texte existant.
Du son
Certains des sons de base ont été repris des sources originales. Ambiant, chant des oiseaux, son du projecteur de film, etc. il a été décidé de partir pour préserver la reconnaissance du projet. Cependant, beaucoup de nouveau contenu était nécessaire. Les sons du personnage lui-même, les pas, les objets activés, la respiration du héros à certains moments, l'effet d'un battement de cœur, etc. ont été ajoutés. Plus de variété a été ajoutée à l'ensemble des sons ambiants, le chant des sauterelles, des sons aléatoires d'objets tombant et des portes claquant ont été ajoutés. D'ailleurs, je me suis inspiré des paysages de la nouvelle Half Life Alyx pour ajouter le bruit des cigales ou des sauterelles, dans lequel l'atmosphère d'une chaude journée d'été est très fraîche. J'ai aimé écouter et regarder les enregistrements Ambient de City17 sur Youtube pendant un moment.
La plupart des sons ont été empruntés à des bibliothèques gratuites. Les fragments ont été combinés les uns aux autres, les effets ont été appliqués, la vitesse a été modifiée, etc.
La création de la bande originale est devenue une couche entière de travail responsable et minutieux. Les compositions du projet original n'étaient pas sous licence, il s'agissait d'un ensemble de morceaux de Ludovico Einaudi, du compositeur Thomas Newman et d'OST du jeu «Afraid of monsters». Néanmoins, on pénètre généralement dans l'âme de ce que l'on entend pour la première fois, par exemple, les originaux des morceaux me semblent souvent plus agréables que leurs remix, du moins pour moi. Dans ce cas, lors de la création de nouvelles compositions, je voulais vraiment préserver le style et l'atmosphère des morceaux originaux. Il me semble que le compositeur Dmitri Nikolaev, avec qui nous avions précédemment travaillé sur le jeu 35MM, a fait un excellent travail dans cette tâche. J'ai été particulièrement impressionné par le nouveau regard sur la composition dynamique qui sonnait lors de la projection du film dans la salle de conférence. Le morceau a conservé le style original énergique et légèrement psychédélique,a commencé à paraître frais, mais reconnaissable. À propos, le film lui-même a également été fortement révisé et comprenait beaucoup de nouveau matériel. Le contenu de la vidéo a été choisi plus soigneusement pour éviter la violation du droit d'auteur, et certains fragments ont été créés indépendamment.
Le lien montre la vidéo originale utilisée dans le jeu original de 2012.
Bien qu'il n'y ait pas de dialogue dans le jeu, il y avait une place pour le doublage. L'enregistrement a été assisté par Vsevolod Petrykin, qui avait précédemment participé au projet 35MM et qui a donné sa voix au personnage principal Petrovich. Son discours peut être entendu des haut-parleurs au moment où les avions apparaissent, du récepteur téléphonique dans l'épisode avec le lancement des missiles et à la radio, au deuxième étage du bâtiment principal.
Optimisation
L'optimisation est devenue l'un des sujets et des tâches les plus pénibles du travail sur le remake. Il se trouve que presque tous les projets que j'ai créés plus tôt sur l'ancienne version d'Unity (4.6) étaient assez simples en termes de charge sur le matériel. Le jeu 35 MM sur ma GTX 970 fonctionnait à 200-300 fps dans des endroits dans des scènes assez complexes et occupées. Le Light original, construit sur une version encore plus ancienne du moteur, affichait un FPS encore plus élevé. Mais lors du passage à Unity 2017, la fréquence d'images a chuté de 2 à 3 fois. Il est clair que la scène est devenue beaucoup plus complexe, des erreurs de calcul de lumière et de reflets, des post-effets supplémentaires, etc. ont été ajoutés. mais je ne m'attendais pas à une diminution aussi spectaculaire des performances. Le hic, c'est que même après avoir supprimé presque tout le contenu de la scène, mon FPS n'a pas dépassé 200-300. C'est une étape à moitié vide, Karl!Beaucoup de travail a été fait pour simplifier certaines géométries, créer des groupes Lod, mettre en place l'abattage par occlusion, etc.
De plus, à l'aide d'un script, les caméras se sont vu attribuer une distance de coupure pour certaines couches. Pour la mise en œuvre, un exemple des manuels Unity a été utilisé. Des objets de différentes tailles ont été affectés à des calques séparés, qui arrêtent le rendu si la caméra est trop éloignée. Les petits objets comme les bidons, les ordures, les débris de bois, les livres sont coupés après 20-30 mètres. Les plus grands - après 60-80. Toutes les mesures ci-dessus ont considérablement réduit le nombre de Drawcalls. En moyenne, le nombre d'appels de tirage dans une scène varie de 800 à 2000 DC. Le nombre de polygones dans une trame ne dépasse pas 1 million.
Coupure de luminaire
Dans le cadre de l'optimisation, un script spécial a été créé qui, toutes les 2-3 secondes, déterminait la distance par rapport aux petites sources de lumière dynamiques, comme les lampes à pétrole. Lorsque la caméra a été retirée des lampes, le script les a désactivées afin de ne pas charger le système avec des processus inutiles. De plus, lorsque le personnage est descendu dans le sous-sol, la source de lumière du soleil a été désactivée. Cela a considérablement réduit le nombre de DrawCalls.
Quelques détails
- Dans les couloirs du sous-sol, debout sous les puits d'égout en béton avec de l'eau ruisselante, vous pouvez voir des gouttes nuageuses apparaître sur l'écran (yeux / lunettes du personnage). Simplement simplifié - à condition que le héros appuie sur la gâchette et que la caméra soit dirigée vers le haut, le préfabriqué du système de particules avec un matériau Grabpass boueux est activé. À ce moment également, des gouttes peuvent être observées à la surface de la carte si vous la prenez entre vos mains.
- . . « », . . , .
- , .
- , , .
- . “STALKER ” , . , , . , . , / .
- , — 3 . , , . . .
Comme vous pouvez le voir dans l'article, développer votre propre projet est un processus très laborieux. Ce sont des nuits blanches, une recherche constante de solutions, une recherche d'inspiration, de défaite et de victoire. Mais, cela apporte un grand plaisir et un sentiment de réalisation de soi. Je dirais que c'est plus qu'un simple travail - c'est un mode de vie. Notre conscience est incroyable et capable de créer des choses étonnantes qui ne peuvent parfois pas être comparées à la réalité. Il y a tout un univers dans le crâne de n'importe quelle personne, et c'est merveilleux, c'est merveilleux que cet univers puisse d'une manière ou d'une autre être affiché à travers votre activité, que ce soit un film ou un jeu vidéo. Chaque œuvre est quelque chose de personnel, créé grâce à un travail dur et épuisant, quelque chose de très important et précieux, avant tout pour soi-même.
Je vous souhaite à tous bonne chance, inspiration créative et FPS élevé!