Flux de travail pour les cartes 2D : De l'image au niveau

ANDY TOUCH / UNITY TECHNOLOGIESContent Developer for Unity Technologies
Jan 25, 2018|10 Min
Flux de travail pour les cartes 2D : De l'image au niveau
Cette page a été traduite automatiquement pour faciliter votre expérience. Nous ne pouvons pas garantir l'exactitude ou la fiabilité du contenu traduit. Si vous avez des doutes quant à la qualité de cette traduction, reportez-vous à la version anglaise de la page web.

Dans Unity 2017.2, nous avons introduit un nouvel ajout au jeu de fonctionnalités 2D : Cartes en mosaïque ! En utilisant les Tilemaps, vous pouvez rapidement mettre en page et créer des niveaux 2D en utilisant une combinaison de Sprites et de GameObjects, et contrôler des propriétés telles que l'ordre des couches, les colliders des tilemaps, les tuiles animées et bien plus encore ! Dans ce billet, j'expliquerai le flux de travail complet en commençant par l'importation de votre fichier image dans Unity jusqu'à l'élaboration d'un niveau pour un jeu de plateforme en 2D !

Pour résumer, le flux de travail peut être résumé comme suit, chaque élément étant lié à un actif ou à un composant dans l'éditeur Unity :

Sprite -> Carreau -> Palette -> Pinceau -> Carte de carreau

Du point de vue d'une Unity, ces termes peuvent sembler un peu abstraits. Imaginez le processus d'une peinture réelle sur une toile réelle :

Couleur -> Peinture -> Palette de tuiles -> Pinceau -> Toile

Chaque étape du processus obéit à une logique similaire et porte même un nom similaire !

Pour ce billet, j'utiliserai l'image "GrassPlatform_TileSet" comme exemple principal :

Image of 'GrassPlatform_TileSet’

Le résultat final est un niveau construit à partir de ces pièces qu'un personnage 2D peut parcourir en tant que "niveau" :

Exemple d'image d'un caractère 2D en cours d'exécution
1) Sprites

L'importation d'une image dans Unity peut se faire de différentes manières :
- Enregistrer le fichier image souhaité dans le dossier "Assets" du projet.
- Dans le menu supérieur, sélectionnez "Assets -> Import New Asset", puis sélectionnez le fichier souhaité.
- Faites glisser le fichier image depuis votre navigateur de fichiers vers la "fenêtre de projet" de l'éditeur Unity (c'est probablement la méthode la plus simple !).

Une fois l'image importée dans votre projet, les paramètres d'importation par défaut du type de texture sont définis par le mode de comportement actuellement utilisé dans votre projet : 2D ou 3D.

Ce mode est défini à l'origine lors de la création d'un nouveau projet :

Image du mode défini lors de la création d'un nouveau projet

Ou peut être modifié dans les paramètres de l'éditeur :

Image des paramètres de l'éditeur

Comme mon projet est déjà configuré pour le mode de comportement 2D, 'GrassPlatform_TileSet' sera automatiquement importé avec le type de texture 'Sprite (2D et UI)', qui est le paramètre dont la ressource 'Tile' aura besoin pour référencer le Sprite.

Comme le "GrassPlatform_TileSet" est une série de sprites dans une seule image, nous devons le découper en sprites individuels ; cela peut être fait en réglant le mode de sprite de "Simple" à "Multiple" et en ouvrant l'éditeur de sprites :

Réglage de l'image pour le mode Sprite

La fenêtre de l'éditeur de sprites vous permet de "découper" une image en plusieurs sprites ; vous pouvez ainsi travailler sur une feuille de sprites dans le logiciel d'édition d'images de votre choix et définir les zones de l'image qui seront traitées comme des sprites "individuels" directement dans Unity. Plus besoin de jongler et de gérer des centaines de fichiers images individuels !

Comme "GrassPlatform_TileSet" est une image composée d'une série de tuiles, nous pouvons utiliser les paramètres de découpage de la grille de l'éditeur de sprites pour diviser automatiquement l'image en plusieurs sprites. Les dimensions de chaque "tuile cellulaire" dans ce jeu de tuiles sont de 64 pixels par 64 pixels, nous pouvons donc entrer ces paramètres et laisser l'éditeur de sprites générer automatiquement les tranches de sprites nécessaires :

Image de l'emplacement des paramètres en mode Sprite

Après avoir cliqué sur le bouton "Slice", nous disposons maintenant d'un ensemble de sprites découpés en tranches !

Image d'un ensemble de sprites tranchés

Dans la fenêtre de l'éditeur de sprites, chaque sprite découpé peut être sélectionné et modifié. Par exemple, vous pouvez donner un nom à chaque sprite et même modifier manuellement des valeurs telles que la position et les pivots.

Nous devons ensuite "appliquer" les modifications à la ressource sprite (en cliquant sur le bien nommé bouton "Appliquer" situé dans le coin supérieur droit de l'éditeur de sprites), ce qui nous permettra de référencer chaque sprite découpé individuellement dans la fenêtre du projet :

Image de l'application des modifications aux sprites

Maintenant que notre feuille de sprites a été découpée en sprites individuels, nous devons les "convertir" en tuiles.

2) Actif de la tuile

La tuile est un tout nouvel actif ajouté dans Unity 2017.2. Son but est de contenir les données que la carte des tuiles doit utiliser dans une cellule spécifique de la grille.

L'asset de base par défaut (qui peut être généré à partir de "Create -> Tile" dans la fenêtre de projet) permet d'assigner un Sprite et d'autres personnalisations telles que la teinte du Sprite et le type de collisionneur qu'il utilisera sur la Tilemap (ce qui sera expliqué plus tard).

Exemple d'application de personnalisations dans Sprite
3) Fenêtre de la palette de carreaux

Unity 2017.2 introduit une nouvelle fenêtre : la palette de tuiles ! Cette fenêtre fait partie intégrante de l'utilisation du nouveau système de mappemonde, car elle sert d'interface pour sélectionner les tuiles à utiliser et la manière dont la mappemonde doit être éditée avec ces tuiles.

Exemple d'image de la nouvelle palette de tuiles

Avant d'ajouter la tuile "TopGrassTile" à la fenêtre de la palette de tuiles, nous devons d'abord créer une nouvelle palette. Les palettes peuvent être utilisées pour organiser vos ensembles de tuiles au lieu de les "stocker" tous (il peut y en avoir des centaines ou plus !) sur un espace de travail dans la fenêtre.

Image des palettes utilisées pour organiser

Dans le menu déroulant Palette, il est possible de créer une toute nouvelle palette :

Image du menu déroulant de la palette

Il suffit d'un simple glisser-déposer pour ajouter "TopGrassTile" à cette palette nouvellement créée !

Image du glisser-déposer pour ajouter "TopGrassTile".

Cependant, dans certaines situations, nous pouvons être amenés à travailler avec des centaines et des centaines de 2D Sprites qui constituent notre scène en 2D. Il serait très fastidieux de créer manuellement une tuile pour chacun de ces sprites, puis de glisser-déposer chacun d'entre eux individuellement sur la palette.

Heureusement, il existe un flux de travail qui permet de générer automatiquement un ensemble de tuiles (une pour chaque sprite) et de les affecter toutes à la palette souhaitée. Et c'est aussi simple et facile que de glisser-déposer ! Au lieu de faire glisser une tuile sur la palette, faites glisser la feuille de Sprites source qui contient les Sprites découpés. Dans ce cas, il s'agit de "GrassPlatform_TileSet" :

Image de la feuille de Sprites source contenant les Sprites découpés.
4) Grille et carte des carreaux

Maintenant que notre feuille de sprites "GrassPlatform_TileSet" est configurée avec succès dans la fenêtre Tile Palette, il est temps de commencer à construire un niveau 2D !

Pour commencer, nous devons créer un nouveau "Tilemap" dans notre scène actuelle ; cela peut être fait à partir du menu déroulant "GameObject -> 2D Objects -> Tilemap". Cependant, cela ne crée pas seulement un GameObject "Tilemap" (avec les composants associés) mais aussi un GameObject "Grid" dont le GameObject "Tilemap" est automatiquement un enfant.

La structure de GameObjects la plus similaire à la configuration "Grid <-> Tilemap" est le système UI d'Unity ; où le GameObject parent Canvas agit comme un conteneur de mise en page pour tous ses GameObjects UI enfants (tels que le texte et les images). Le GameObjects "Grid" utilise le composant "Grid" pour définir les dimensions de tous ses GameObjects "Tilemap" enfants. Des options permettent de personnaliser la mise en page :

Options de présentation des images permettant une personnalisation

Le GameObjects Tilemap enfant est ensuite construit par le composant Tilemap et le composant Tilemap Renderer ; le premier contient les données des tuiles peintes et le second définit les paramètres visuels du rendu.

Image sur la définition des ensembles

Le système Tilemap a été conçu de manière à ce que plusieurs GameObjects Tilemap puissent être des enfants de la même grille, ce qui signifie que le résultat final de votre niveau peut être facilement composé par de multiples couches de différentes tuiles :

Image montrant un exemple de couches multiples de différentes tuiles

Chaque Tilemap Renderer vous permet de contrôler le matériau utilisé pour le rendu de ses tuiles, le calque de tri qu'il utilise (qui est le même système de calque que celui utilisé par les Sprite Renderers, les UI Canvases et les Particle Systems !

5) Peindre sur la carte des tuiles

Avant de pouvoir peindre des tuiles sur la carte des tuiles, deux choses doivent être sélectionnées : la carte des tuiles qui est actuellement focalisée et le pinceau qui est actuellement utilisé.

La première peut être choisie dans la liste déroulante "Carte de tuiles active" de la fenêtre Palette de tuiles située sous les Options d'édition :

Sélection déroulante de la table des matières

Cette liste déroulante affiche toutes les instances du composant "Tilemap" dans la scène et vous permet d'en sélectionner une pour la peindre et la modifier. La capture d'écran ci-dessus ne montre qu'une seule option "Tilemap", nommée d'après la GameObjects Tilemap par défaut, alors qu'une scène plus complexe avec plusieurs Tilemaps pourrait afficher une liste de Tilemaps actifs possibles comme celle-ci :

Liste déroulante pour la sélection du sol

Pour l'exemple "GrassPlatform_TileSet", le fait de renommer le GameObject "Tilemap" pour qu'il soit plus précis mettra également à jour le(s) nom(s) de la liste "Active Tilemap" :

Drop down selection for Ground Platform Tilemap (sélection déroulante pour la carte de la plate-forme au sol)

La prochaine chose à sélectionner est le pinceau actuel. Alors que la ressource "tuile" détermine les données contenues dans une cellule (visuels, type de collision, etc.), la ressource "brosse" définit la manière dont une ou plusieurs tuiles sont placées sur une carte de tuiles. Actuellement, Unity n'a qu'un seul pinceau (appelé "pinceau par défaut") intégré à sélectionner ; et il a les fonctionnalités attendues de son nom telles que le placement, l'effacement, le déplacement et le remplissage de tuiles sur la carte des tuiles. Cependant, sur le GitHub de l'équipe Unity Technologies, il y a un dépôt d'extras 2D qui contient une variété d'exemples sur la façon dont vous pouvez écrire vos propres brosses et tuiles personnalisées ! Une fois qu'ils sont importés dans votre projet, le menu Pinceau actuel (en bas de la fenêtre Palette des tuiles) vous permet de choisir le pinceau à utiliser :

Emplacement pour le choix du pinceau à utiliser

Bien que cet article ne traite pas de l'utilisation des brosses et des tuiles scriptables, il s'agit d'un domaine très puissant à étudier et à intégrer dans votre ensemble d'outils de conception de niveaux basés sur les cartes de tuiles.

Avec la carte des tuiles active et la brosse actuelle, nous pouvons alors sélectionner une tuile spécifique dans la fenêtre Palette des tuiles et la peindre sur la carte des tuiles de la scène ! Vous devez également vous assurer que l'icône "Pinceau" des outils d'édition est également sélectionnée :

Sélection de l'icône "pinceau" dans les outils d'édition

Succès ! Des carreaux sont peints sur la carte des carreaux ! Cependant, vous pouvez remarquer que les tuiles sont légèrement plus petites que la taille des cellules de la grille. Il ne s'agit pas d'un bogue, mais nous devons prendre un peu de recul pour expliquer pourquoi - et comment vous pouvez modifier la valeur par défaut.

La taille des cellules du composant Grid utilise les unités de distance de l'espace mondial d'Unity (par exemple, un cube Unity primitif avec une échelle par défaut de 1 pour chaque axe aura la même taille qu'une cellule sur la grille par défaut). Chaque ressource Sprite possède une valeur de pixels par unité dans ses paramètres d'importation, la valeur par défaut étant 100 :

Image du réglage standard des pixels
Glisser-déposer des images
Sélection de différentes images
Exemple d'image
Exemple d'image
Exemple d'image
Exemple d'image
Exemple d'image