Jocurile de puzzle au deseori loc într-o rețea care conține dale care au comportamente și proprietăți și reacționează la reguli și intrări. În această serie vă voi arăta cum să construiți o versiune simplă, de bază a jocului clasic Minesweeper, care este exemplul perfect pentru a începe de la crearea propriilor jocuri de puzzle.
Indiferent dacă faceți un joc de memorie pentru copii sau un titlu de strategie complex, implementarea blocurilor de bază ale Minesweeper-ului este un loc minunat pentru a începe. În prima parte a acestei serii de tutorial în trei părți, vom construi un câmp de joc pe care îl puteți folosi apoi pentru a vă crea propria versiune a jocului.
Veți avea nevoie de Unitate pentru acest lucru și o înțelegere de bază a acestuia. (Check out Arkanoid Build With Unity dacă sunteți nou la el.) Codul sursă poate fi descărcat, dar nu este necesar pentru a finaliza acest tutorial.
Minesweeper este un joc de puzzle în care trebuie să localizați toate minele într-un câmp. Dimensiunea câmpului variază în funcție de dificultate și poate varia de la 9x9 (ușor) la 16x30 (greu) sau orice dimensiune personalizată.
Făcând clic pe o piesă pe care o "descoperiți". Dacă este o mină, pierzi; dacă este gol și cel puțin o mină se află într-una din țiglele care se învecinează, apare un număr care arată numărul de mine din țiglele vecine. Dacă nu există mine în gresie adiacentă, toate plăcile adiacente sunt descoperite.
O placă poate fi marcată cu un clic dreapta pe ea, punând astfel un steag pe ea. Odată ce toate dalele cu mine au fost marcate corect, jocul este câștigat.
Încercați-l aici:
Din regulile de mai sus, putem extrapola diferitele elemente pe care le va avea nevoie de versiunea noastră simplă de minesweeper. Acestea sunt
Creați un nou proiect Unity. Creați un Cub și denumiți-l Ţiglă
. Trageți-l în folderul proiectului pentru al transforma într-un prefabricat. Vom folosi această placă nefuncțională pentru a construi câmpul de joc și apoi adăugați mai târziu funcționalitate.
Creați un nou obiect gol și denumiți-l Grilă
, și transformați-l și într-un prefabricat. Acesta va fi generatorul câmpului de joc și toate plăcile din interiorul acestuia.
Creați un nou fișier JS, denumiți-l Grilă
precum și adăugați-l la Grilă
obiect.
Adăugați următoarele linii în scriptul Grid, astfel încât să putem începe crearea unui câmp:
public var tilePrefab: GameObject; public var numberOfTiles: int = 10; public dist distanceBetween Tiles: float = 1.0; funcția Start () CreateTiles (); funcția CreateTiles ()
Apoi, trageți prefabricarea Tile pe Prefabricarea plăcilor slot a Grilă
obiect. Ar trebui să arate astfel:
numberOfTiles
variabilă vă va permite să setați numărul de plăci care urmează a fi create. DistanceBetweenTiles
definește distanța dintre ele, astfel încât să putem ajusta spațiul în funcție de preferințele noastre.
Chiar acum, generatorul de rețea nu face nimic. Pentru ca acesta să creeze mai multe plăci, adăugați acest cod CreateTiles ()
funcţie:
var xOffset: float = 0,0; pentru (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);
Dacă rulați scena curentă, ar trebui să creați o linie a plăcilor noastre, cum ar fi:
Funcția creează copii ale prefabricatului de plăci - cât de multe am specificat - și le plasează într-un rând, la o distanță de distanceBetweenTiles
în afară. Încercați câteva valori diferite pentru a găsi distanțe bune.
Dar pentru Minesweeper avem nevoie de o rețea, nu de o linie. Pentru a realiza acest lucru, adăugați această variabilă la începutul Grilă
cod:
public var tilesPerRow: int = 4;
... și să adapteze CreateTiles ()
funcția de a arăta astfel:
funcția CreateTiles () var xOffset: float = 0.0; var zOffset: float = 0,0; pentru (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);
Dacă o rulați, ar trebui să ajungeți cu mai multe linii de dale:
Dacă setați tilesPerRow
variabile corect (cum ar fi 24
gresie în 6
rânduri), generatorul ar trebui să creeze un câmp de joc dreptunghiular frumos. Dacă abilitățile de programare sunt destul de avansate, puteți încerca să dați seama cum să automatizeze procesul în continuare. (Versiunea Minesweeper pe care o construim va funcționa și cu câmpuri neregulate.)
Acum, că putem crea un câmp de bază, personalizat Minesweeper, putem lucra la adăugarea de mine efective.
Creați un nou fișier JS, denumiți-l Ţiglă
, și adăugați-l la prefab. Apoi, adăugați următoarea variabilă la ea:
public var este MENU: boolean = false;
Acest lucru ne va spune dacă țigla are o mină în ea.
Apoi, trebuie să punem mina în grilă. Pentru asta, schimbați GameObject
tip de prefabricat de tigla la noul Ţiglă
clasa pe care am creat-o.
Schimba tilePrefab
variabilă astfel încât să pară următoarele:
public var tilePrefab: Placi;
Apoi, alocați din nou obiectului Tiglă acelei variabile. Acum, acesta poate accesa automat variabilele pe care le punem de acolo de la început.
Alocarea minelor este puțin mai complicată. Vom face asta de la generatorul de rețele.
Mai întâi, trei matrice pentru a ține țiglele noastre la codul Grid:
plăci statice varToate: plăci []; static var tilesMine: Array; statice var tilesUnmined: Array;
Trebuie, de asemenea, să le inițializăm. Puneți următoarele linii la începutul CreateTiles ()
funcţie:
tilesAll = Placi noi [numberOfTiles]; tilesMined = Array nou (); tilesUnmined = Array nou ();
Apoi, modificați comanda instanțiată în CreateTiles ()
funcția de a arăta astfel:
var newTile = Instanțiate (tilePrefab, Vector3 (transform.position.x + xOffset, transform.position.y, transform.position.z + zOffset), transform.rotation); gresieToate [tilesCreated] = newTile;
Acum adăugați această comandă la sfârșitul CreateTiles ()
pentru a porni funcția AssignMines ()
proces:
AssignMines ();
CreateTiles ()
funcția ar trebui să arate astfel:
funcția CreateTiles () tilesAll = Placă nouă [numberOfTiles]; tilesMined = Array nou (); tilesUnmined = Array nou (); var xOffset: float = 0,0; var zOffset: float = 0,0; pentru (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();
Adăugați, de asemenea, funcția AssignMines ()
, astfel încât să putem folosi de fapt:
funcția AssignMines () tilesUnmined = tilesAll; pentru (var minesSignificat: 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;
Iată ce se întâmplă: Când se creează o nouă țiglă în CreateTiles
-funcția, este adăugată la tilesAll
-matrice. Toate plăcile din interior sunt apoi copiate în tilesUnmined
-matrice. Din această matrice, am ales în mod aleatoriu o piesă pentru a adăuga o mină. Adăugăm o mina pentru a seta isMined
-variabilă la adevărat, scoateți-o din tilesUnmined
-și adăugați-l la tilesMined
-array (pe care o vom folosi ulterior). În final am plasat aleatoriu cantitatea specificată de mine pe câmpul de joc.
Chiar acum, o țiglă minată nu este vizibil diferită de o țiglă nemăcinată. Scopul jocului este să-ți dai seama, după toate!
În această construire puteți testa cum ar trebui să funcționeze. În scopuri demonstrative, țiglele minate apar ca roșii.
Și voilá: acum aveți un câmp Minesweeper cu o dimensiune personalizată!
Chiar acum, plăcile sunt cuburi standard de unitate. Să le transformăm în realitate gresie.
În fișierele sursă, veți găsi un fișier 3D numit puzzleObjects.fbx. Copiați-l în dosarul dvs. de materiale, astfel încât îl putem folosi în jocul nostru. Asigurați-vă că fișierul este importat cu dimensiunea acestuia setată la 1
, astfel încât să se potrivească cu setările pe care le-am utilizat până acum.
Setările de import ale fișierului ar trebui să arate astfel:
Apoi, mergeți la setările prefabricării plăcilor de tigla și schimbați cubul de plasă pentru tileImproved plasă.
În timp ce suntem aici, apăsați restabili pe Box Collider componentă a plăcii. Acest lucru va face ca ciocanul să se potrivească din nou în jurul plăcii.
În cele din urmă, dați țiglă un material nou, deci nu are aspectul alb standard.
Amintiți-vă să aplicați toate modificările prefabricatului de dale, astfel încât noile să fie create atunci când începem un nou joc. Dacă încercați acest lucru, jocul ar trebui să creeze grila utilizând aceste plăci noi în loc de vechile cuburi.
Avem nevoie de o modalitate de a afișa un număr pentru ca o piesă să ne arate cât de multe mine sunt adiacente. O modalitate simplă de a realiza acest lucru este prin utilizarea a Text 3D, care vine cu Unitatea.
Creați unul făcând clic GameObject> Creați alte> Text 3D, și adăugați-o la țiglă. Ar trebui să arate astfel:
Să îmbunătățim asta. Rotiți textul astfel încât să fie orientat în sus. Setați șirul la care se afișează în prezent 0
, astfel încât să știm ce mărime va fi textul. De asemenea, adaptați Marimea fontului și Mărimea textului, astfel încât să nu pară neclară.
Grozav! Acum trebuie să putem accesa textul 3D în cod. Adăugați următoarea variabilă la Ţiglă
cod:
public var displayText: TextMesh;
Glisați textul 3D pe slotul deschis, pentru a putea accesa ulterior codul ulterior.
Amintiți-vă să aplicați totul la prefabricarea plăcilor și să-l încercați. Trebuie create acum plăci noi și importate.
Am creat o bază funcțională pentru jocul de puzzle, dar nu se poate juca deocamdată. Vom adăuga acea funcționalitate în a doua parte a acestei serii.