Les jeux de réflexion ont souvent lieu sur une grille contenant des mosaïques ayant des comportements et des propriétés, et réagissent aux règles et aux entrées. Dans cette série, je vais vous montrer comment construire une version simple et basique du jeu classique Minesweeper, qui est l'exemple parfait pour créer vos propres jeux de réflexion..
Que vous réalisiez un jeu de mémoire pour enfants ou un titre de stratégie complexe, la mise en œuvre des éléments de base de Minesweeper est un excellent point de départ. Dans la première partie de cette série de tutoriels en trois parties, nous créerons un terrain de jeu que vous pourrez ensuite utiliser pour créer votre propre version du jeu..
Vous aurez besoin de l'unité pour cela et d'une compréhension de base de celui-ci. (Consultez Build Arkanoid With Unity si vous débutez dans ce logiciel.) Le code source peut être téléchargé, mais il n'est pas nécessaire de suivre ce didacticiel..
Minesweeper est un jeu de réflexion dans lequel vous devez localiser toutes les mines d'un champ. La taille du champ varie selon la difficulté et peut aller de 9x9 tuiles (facile) à 16x30 tuiles (dure), ou n’importe quelle dimension personnalisée..
En cliquant sur une tuile, vous la "découvrez". Si c'est une mine, vous perdez; si elle est vide et qu’au moins une mine se trouve dans l’une des tuiles adjacentes, un numéro apparaît, indiquant le nombre de mines dans les tuiles voisines. S'il n'y a pas de mines dans les tuiles adjacentes, toutes les tuiles adjacentes sont également découvertes.
Une tuile peut être marquée en faisant un clic droit dessus, mettant ainsi un drapeau dessus. Une fois que toutes les tuiles avec les mines ont été correctement marquées, la partie est gagnée.
Essayez-le ici:
À partir des règles ci-dessus, nous pouvons extrapoler les différents éléments dont notre version simple de démineur aura besoin. Ceux-ci sont
Créez un nouveau projet Unity. Créez un cube et nommez-le Tuile
. Faites-le glisser dans le dossier du projet pour le transformer en préfabriqué. Nous allons utiliser cette tuile non fonctionnelle pour créer le terrain de jeu, puis lui ajouter des fonctionnalités plus tard..
Créez un nouvel objet vide et nommez-le la grille
, et le transformer en un préfabriqué aussi. Ce sera le générateur du champ de jeu et de toutes les tuiles qu'il contient..
Créez un nouveau fichier JS, nommez-le la grille
aussi, et l'ajouter à la la grille
objet.
Ajoutez les lignes suivantes au script Grid pour pouvoir créer un champ:
public var tilePrefab: GameObject; public var numberOfTiles: int = 10; public var distanceBetweenTiles: float = 1.0; fonction Start () CreateTiles (); fonction CreateTiles ()
Ensuite, faites glisser le préfabriqué Tile sur le Tuile préfabriqué fente du la grille
objet. Ça devrait ressembler à ça:
le numberOfTiles
variable vous permettra de définir le nombre de tuiles à créer. DistanceEntreTuies
définit la distance entre eux, afin que nous puissions ajuster l'espacement à notre goût.
À l'heure actuelle, le générateur de réseau ne fait rien. Pour qu’il crée plusieurs tuiles, ajoutez ce code le CreateTiles ()
une fonction:
var xOffset: float = 0.0; pour (var tilesCreated: int = 0; tilesCreated < numberOfTiles; tilesCreated += 1) xOffset += distanceBetweenTiles; Instantiate(tilePrefab, Vector3(transform.position.x + xOffset, transform.position.y, transform.position.z), transform.rotation);
Si vous exécutez la scène en cours, il devrait créer une ligne de nos tuiles, comme ceci:
La fonction crée des copies du préfabriqué de tuiles - autant que nous l’avons spécifié - et les place dans une rangée, à une distance de distanceEntreToies
une part. Essayez différentes valeurs pour trouver un bon espacement.
Mais pour Minesweeper, nous aurons besoin d’une grille, pas d’une ligne. Pour ce faire, ajoutez cette variable au début de la la grille
code:
public var tilesPerRow: int = 4;
… Et adapter le CreateTiles ()
fonction à ressembler à ceci:
function CreateTiles () var xOffset: float = 0.0; var zOffset: float = 0.0; pour (var tilesCreated: int = 0; tilesCreated < numberOfTiles; tilesCreated += 1) xOffset += distanceBetweenTiles; if(tilesCreated % tilesPerRow == 0) zOffset += distanceBetweenTiles; xOffset = 0; Instantiate(tilePrefab, Vector3(transform.position.x + xOffset, transform.position.y, transform.position.z + zOffset), transform.rotation);
Si vous l'exécutez, vous devriez vous retrouver avec plusieurs lignes de tuiles:
Si vous définissez le tilesPerRow
variable correctement (comme 24
tuiles dans 6
rangées), le générateur doit créer un joli terrain de jeu rectangulaire. Si vos compétences en programmation sont suffisamment avancées, vous pouvez essayer de trouver comment automatiser davantage le processus. (La version de Minesweeper que nous construisons fonctionnera également avec des champs de forme irrégulière.)
Maintenant que nous pouvons créer un champ de base de dragueur de mines, nous pouvons y ajouter des mines réelles..
Créez un nouveau fichier JS, nommez-le Tuile
, et l'ajouter au préfabriqué de tuile. Ensuite, ajoutez-y la variable suivante:
public var isMined: boolean = false;
Cela nous dira si la tuile contient une mine.
Ensuite, nous devons mettre les mines réelles dans la grille. Pour cela, changez le GameObject
type de préfabriqué à la nouvelle Tuile
classe que nous venons de créer.
Changer la tilePrefab
variable donc ça ressemble à ça:
public var tilePrefab: Tile;
Et puis assignez à nouveau l'objet Tile à cette variable. Maintenant, il peut accéder automatiquement aux variables que nous avons mises là depuis le début.
Assigner des mines est un peu plus compliqué. Nous ferons cela à partir du générateur de grille.
Premièrement, trois tableaux pour maintenir nos tuiles au code de la grille:
static var tilesAll: Tile []; static var tilesMined: Array; static var tilesUnmined: Array;
Nous devons également les initialiser. Mettez les lignes suivantes au début de la CreateTiles ()
une fonction:
tilesAll = new Tile [numberOfTiles]; tilesMined = new Array (); tilesUnmined = new Array ();
Ensuite, changez la commande instancier dans le CreateTiles ()
fonction à ressembler à ceci:
var newTile = Instantiate (tilePrefab, Vector3 (transform.position.x + xOffset, transform.position.y, transform.position.z + zOffset), transform.rotation); tilesAll [tilesCreated] = newTile;
Maintenant, ajoutez cette commande à la fin de la CreateTiles ()
fonction pour démarrer le AssignMines ()
processus:
AssignMines ();
le CreateTiles ()
la fonction devrait ressembler à ceci:
function CreateTiles () tilesAll = new Tile [numberOfTiles]; tilesMined = new Array (); tilesUnmined = new Array (); var xOffset: float = 0.0; var zOffset: float = 0.0; pour (var tilesCreated: int = 0; tilesCreated < numberOfTiles; tilesCreated += 1) xOffset += distanceBetweenTiles; if(tilesCreated % tilesPerRow == 0) zOffset += distanceBetweenTiles; xOffset = 0; var newTile = Instantiate(tilePrefab, Vector3(transform.position.x + xOffset, transform.position.y, transform.position.z + zOffset), transform.rotation); tilesAll[tilesCreated] = newTile; AssignMines();
Ajoutez également la fonction AssignMines ()
, afin que nous puissions l’utiliser:
fonction AssignMines () tilesUnmined = tilesAll; pour (var minesAssigned: int = 0; minesAssigned < numberOfMines; minesAssigned += 1) var currentTile: Tile = tilesUnmined[Random.Range(0, tilesUnmined.length)]; tilesMined.Push(currentTile); tilesUnmined.Remove(currentTile); currentTile.GetComponent(Tile).isMined = true;
Voici ce qui se passe: quand une nouvelle tuile est créée dans le CreateTiles
-fonction, il est ajouté à la carreauxTous
-tableau. Toutes les tuiles sont ensuite copiées dans le carreauxUnmined
-tableau. De ce tableau, nous avons choisi au hasard une tuile à laquelle ajouter une mine. Nous ajoutons une mine à en mettant le isMined
-variable à true, supprimez-le du carreauxUnmined
-tableau et l'ajouter à la tilesMined
-tableau (que nous utiliserons plus tard). Finalement, nous avons placé au hasard le nombre spécifié de mines sur le terrain de jeu.
À l'heure actuelle, une tuile minée n'est pas visiblement différente d'une tuile non minée. Le but du jeu est de comprendre cela, après tout!
Dans cette version, vous pouvez tester son fonctionnement. À des fins de démonstration, les tuiles minées apparaissent en rouge.
Et voila: vous avez maintenant un champ Démineur avec une taille personnalisée!
Pour le moment, les tuiles sont des cubes Unity standard. Faisons-en une réalité carrelage.
Dans les fichiers sources, vous trouverez un fichier 3D appelé puzzleObjects.fbx. Copiez-le dans votre dossier d'actif, afin que nous puissions l'utiliser dans notre jeu. Assurez-vous que le fichier est importé avec sa taille définie sur 1
, afin qu'il s'adapte aux paramètres que nous utilisons jusqu'à présent.
Les paramètres d'importation du fichier doivent ressembler à ceci:
Ensuite, allez dans les paramètres du préfabriqué, et remplacez le maillage du cube par le carrelage amélioré engrener.
Pendant que nous sommes ici, appuyez sur Réinitialiser sur le Collisionneur de boîte composant de la tuile. Cela rendra le collisionneur parfaitement ajusté autour du carreau.
Enfin, donnez à la dalle un nouveau matériau, afin qu’elle n’ait pas l’aspect blanc standard.
N'oubliez pas d'appliquer également toutes les modifications au préfabriqué, afin que de nouvelles modifications soient créées lorsque nous commençons une nouvelle partie. Si vous l'essayez, le jeu devrait créer la grille en utilisant ces nouvelles tuiles au lieu des anciens cubes..
Nous avons besoin d'un moyen d'afficher un numéro pour qu'une tuile nous indique le nombre de mines adjacentes. Un moyen simple d’y parvenir est d’utiliser un Texte 3D, qui vient avec l'unité.
Créez-en un en cliquant sur GameObject> Créer autre> Texte 3D, et l'ajouter à la tuile. Ça devrait ressembler à ça:
Améliorons cela. Faites pivoter le texte afin qu’il soit orienté vers le haut. Définir la chaîne qu'il affiche actuellement 0
, afin que nous sachions quelle sera la taille du texte. Également adapter le Taille de police et Taille du texte, pour qu'il ne soit pas flou.
Génial! Nous devons maintenant pouvoir accéder au texte 3D dans le code. Ajoutez la variable suivante à la Tuile
code:
public var displayText: TextMesh;
Faites glisser le texte 3D sur l'emplacement ouvert, afin que nous puissions y accéder via le code ultérieurement.
N'oubliez pas de tout appliquer au préfabriqué et de l'essayer. Les nouveaux carreaux et les carreaux importés doivent maintenant être créés.
Nous avons créé une base fonctionnelle pour notre jeu de puzzle, mais nous ne pouvons pas encore y jouer. Nous allons ajouter cette fonctionnalité dans la deuxième partie de cette série.