Cum să vă particularizați procedural proprietățile jocului cu cod

În acest tutorial vă vom arăta elementele de bază ale utilizării personalizării obiectului procedural în avantajul dvs., în Unity. În principiu se reduce la folosind întâmplări în anumite reguli. Dacă folosiți un sistem procedural (chiar simplu), puteți adăuga o gamă largă de diversitate și detalii jocului dvs., fără a fi nevoie să le creați manual.

Vom începe prin crearea manuală a unui copac simplu și apoi vom folosi tehnicile de personalizare procedurală pentru a automatiza crearea unei game de arbori asemănători, dar în mod semnificativ diferit. Apoi, vom plasa acești copaci într-un joc simplu, pentru a arăta cum arată în "acțiune".

Iată ce vor arăta copacii noștri generați în mod procedural:


Faceți clic pe butonul pentru a genera un nou set de copaci.

Înființat

Ca și în tutorialul meu anterior, va trebui să aveți Unity instalat și să aveți cunoștințe de bază despre acesta. (Consultați Cum puteți învăța unitatea pentru un loc bun pentru a începe.)

Creați un nou proiect pentru acest tutorial și bifați căsuța de etichetă controlerele de caractere; am putea avea nevoie de ei mai târziu.

Am pregătit niște copaci pe care îi vom folosi, pe care le puteți găsi în 3d-files folderul sursei de descărcare. Întregul dosar de proiect, în cazul în care doriți să îl utilizați, poate fi găsit și în descărcarea sursei, dar nu este necesar pentru acest tutorial.

Gata? Sa mergem!


Crearea unui copac

Să creați un copac simplu deoarece, pentru a adăuga atingeri procedurale, avem nevoie de un șablon de bază pentru a începe de la.

Puneți fișierele 3D pe care le-am menționat mai sus în dosarul de materiale. Nu uitați să setați scalarea la importator 1 Decat 0,001, astfel încât dimensiunile să se alinieze.

Acum creați un cub și numiți-l Copac. Mergeți la Filtrul de ochiuri componentă și schimbați cubul de plasă pentru tree_01 plasă. Ar trebui să apară dacă aveți fișierele 3D din dosarul dvs. de materiale.

Arborele ar putea să nu apară pe deplin încă. Acest lucru se datorează faptului că modelul 3D pentru copac susține două materiale (coajă și frunze), dar acum este încă setat la unul. Pentru a rezolva acest lucru, deschideți materiale array în Mesh Renderer componenta a cubului și setați mărimea la 2. Ar trebui să arate astfel:

Acum avem nevoie de materiale pentru scoarță și frunze. Creați două materiale noi și dați-le o culoare de bază maro și verde. Atribuiți aceste două materiale către materiale slot în Mesh Renderer din arbore, și ar trebui să apară cu acele materiale afișate, după cum urmează:

Pentru a termina acest arbore de bază, adăugați un collider de capsul făcând clic Componenta> Fizica> Collider de capsulă. Acest lucru este astfel încât nu vom muta "prin" copac atunci când vom testa mai târziu. Unitatea vă va întreba dacă doriți să înlocuiți colizorul de cutie curent pe copac, pe care ar trebui să-l confirmați. După adăugarea noului agitator, modificați valorile astfel încât forma capsulei să se suprapună peste trunchiul copacului, așa cum este cazul:

Aceste valori vor funcționa:

Acum, trageți obiectul copac în dosarul proiectului pentru al transforma într-un prefab. Arborele nostru de bază se face!


În mod alternativ, rotirea copacilor

Creați un script nou numit tree.js și adăugați-l în prefabricatul de copaci. Acum, adăugați următoarele linii la Start() funcţie:

transform.localEulerAngles.y = Random.Range (0, 360);

Arborele va fi acum rotit o sumă aleatorie pe axa y atunci când este creat. Aceasta înseamnă că dacă plasați un rând de arbori, cum ar fi:

... atunci toți se îndreaptă în direcția lor la începerea jocului. Puneți o grămadă de copaci în nivelul dvs. și încercați!


Ajustarea dimensiunii

În mod similar, putem modifica dimensiunea oricărui obiect. Adăugați următorul cod la tree.js script:

transform.localScale = transform.localScale * Random.Range (0.5, 1.5);

Aceasta va reduce sau mări dimensiunea arborelui. Dacă începeți cu o scară de 1 (care ar trebui să fie cazul dacă totul este configurat corect), noua scală va fi între 0,5 (jumătate mare) și 1,5 (50% mai mare). Acum copacii dvs. ar trebui să arate și mai diverse:


Folosind diferite modele 3D

S-ar putea să fi observat că în fișierele pe care ți le-am dat mai devreme sunt trei copaci. Asta se întâmplă pentru că acum vom trece în mod aleator modelul 3D pentru altul, creând chiar mai mulți copaci din șablon.

Pentru a face acest lucru, adăugați următorul cod la tree.js script:

var copac Mese: Mesh []; funcția Start () gameObject.GetComponent (MeshFilter) .mesh = copacMeshes [Random.Range (0, treeMeshes.Length)]; 

Înainte de a începe scena, totuși, atribuiți cele trei ochiuri pe care le avem la acea matrice, după cum urmează:

Dacă redați scena dvs., veți observa că acum primiți trei ochiuri de copaci diferite, repartizate aleatoriu.

Puteți testa toate acestea în demonstrația de mai jos. Dacă apăsați butonul, toți copacii vor fi înlocuiți cu noi și unici.


Schimbarea culorii

Acesta ar putea fi un pic dificil. În plus față de toate caracteristicile anterioare, vom da fiecărui copac o nuanță unică de verde și maro.

În primul rând, trebuie să știm cum să accesăm culorile. Materialul unui obiect poate fi de obicei accesat prin renderer.material.color. În cazul nostru, totuși, avem două culori, ceea ce înseamnă că trebuie să le accesăm prin intermediul acestora renderer.materials [0] .color și renderer.materials [1] .color. Verificați randatorul de ochi al arborelui pentru a vedea care material (frunze sau coajă) se găsește în slotul 0 și care este în slotul 1.

Crearea unei culori aleatorii funcționează similar cu pașii anteriori. Dacă adăugați aceste linii:

materialul renderer [0] .color = Culoare (Random.Range (0, 1.1), Random.Range (0, 1.1), Random.Range (0, 1.1)); materialul renderer [1] .color = Culoare (Random.Range (0, 1.1), Random.Range (0, 1.1), Random.Range (0, 1.1));

... atunci atât materialul de coaja, cât și materialul de frunză vor primi o culoare complet nouă. Hai să verificăm:

Bine, nu asta facem de fapt. Acestea sunt culori aleatorii din întregul spectru disponibil! Pentru obiectele artificiale, cum ar fi mașinile, acest lucru ar putea fi de ajuns. Dar avem copaci, așa că avem nevoie de verde și maro.

Înlocuiți codul de culoare pe care tocmai l-am adăugat cu următorul text:

materialul renderer [0] .color = Culoare (Random.Range (0.8, 1.1), Random.Range (0.4, 0.6), Random.Range (0, 0.2)); materialul renderer [1] .color = Culoare (Random.Range (0, 0.4), Random.Range (0.6, 1.1), Random.Range (0, 0.4));

Și încercați:

Mult mai bine. (Dacă brusc frunzele sunt maro și trunchiul este verde, schimbați 1 și 0 în renderer.materials [0].)

Codul produce o culoare nouă la începutul culorii programului. Cele trei valori aleatorii trec de la 0 (minim) până la 1 (maxim), care apoi corespund valorilor roșu, verde și albastru din culoare. Prin limitarea intervalului de întâmplări, cum ar fi spus Random.Range (0,3, 0,6), valorile sunt limitate la un anumit interval. Acest lucru ne permite să creăm o gamă de culori noi care sunt încă "verzi" sau orice culoare pe care o putem specifica.


Înclinarea arborelui (opțional)

Acesta este doar un mic truc, dar unul frumos, totuși. Putem da copacului o ușoară înclinare pe o parte, ceea ce elimină acel sentiment "curat plasat" care ar fi putut să apară în trecut

transform.localEulerAngles.x = Random.Range (-10, 10);

De această dată se aplică o rotație foarte mică axei x, făcând arborele să fie înclinat în direcția respectivă. Pentru a vă asigura că nu există nici un "spațiu" între rădăcinile copacului și pământ, "pivotul" (sau centrul) ochiurilor de copac este ușor deasupra rădăcinilor, ceea ce înseamnă că există suficientă cameră de vrăjitorie.

Întregul script arbore ar trebui să arate astfel:

var copac Mese: Mesh []; funcția Start () transform.localEulerAngles.y = Random.Range (0, 360); transform.localEulerAngles.x = Random.Range (-10, 10); transform.localScale = transform.localScale * Random.Range (0.5, 1.5); gameObject.GetComponent (MeshFilter) .mesh = copacMeshes [Random.Range (0, treeMeshes.Length)]; materialul renderer [0] .color = Culoare (Random.Range (0.8, 1.1), Random.Range (0.4, 0.6), Random.Range (0, 0.2)); materialul renderer [1] .color = Culoare (Random.Range (0, 0.4), Random.Range (0.6, 1.1), Random.Range (0, 0.4)); 

Puteți încerca totul în acest demo:


Crearea unui nivel simplu de procedură

Să vedem cum se simt într-un joc real.

Puneți un avion pe sol și aliniați-l. Acesta va fi "podeaua" pentru nivelul nostru. În timp ce sunteți la el, creați un material de podea și alocați-l pe podea. Setați factorul de scalare al planului la 50.1.50, așa că avem suficient spațiu.

Apoi, puneți pe scena un controler de prima persoană. Acesta poate fi găsit în controlerele de caractere care au fost importate la începutul tutorialului. (Dacă nu le aveți, faceți clic pe Active> Pachetul de import> Controlere de caractere). După ce ați pus controalele FPS, scoateți camera principală; controlerul vine cu propriile sale, deci nu mai avem nevoie de camera în scenă. De asemenea, adăugați o lumină direcțională.

Pentru a crea automat copaci, creați un nou fișier JavaScript și denumiți-l treeGenerator.js. Introduceți codul următor:

var copacPrefab: GameObject; var numberOfTrees: int = 20; funcția Start () pentru (var i: int = 0; i < numberOfTrees; i++) Instantiate(treePrefab, Vector3(transform.position.x + Random.Range(-40.0, 40.0), 0, transform.position.z + Random.Range(-40.0, 40.0)), transform.rotation); 

Pune treeGenerator.js script-ul pe podea, alocați prefabricarea copacului treePrefab slotul variabil și încercați:

Și terminat! Acum aveți un simplu joc de explorare, care va crea un nivel unic la fiecare fugă.

Îmbunătățiri suplimentare

Jocul pe care îl aveți acum poate fi extins în mod sălbatic. Puteți adăuga mai multe plante, cum ar fi palmieri sau tufișuri. Puteți adăuga alte obiecte, cum ar fi rocile sau merele. Sau puteți adăuga un fel de monedă sau pickups, pe care jucătorul ar putea să-l depășească pentru a-și mări scorul.


Concluzie

Aplicațiile procedurale reprezintă o modalitate simplă și eficientă de a crea detalii în mod automat. În loc să ai zece obiecte, ai putea infinit de multe.

Puteți folosi elementele pe care le-am jucat în propriul joc, sau le puteți despărți și le puteți re-scrie în funcție de scopurile proprii. De exemplu, am realizat un sistem care creează diferite lungimi de bambus:

Ai putea să faci mașini cu elemente variabile sau să plasați automat inamicii într-un nivel. Posibilitățile sunt nesfârșite.