Du-te dincolo de arta retro pixel cu 3D umbrite în unitate

În acest tutorial, vă voi arăta cum să creați grafic 3D 3D pentru jocul dvs. Unity și explicați de ce doriți să o faceți în primul rând.

Astăzi, există o mulțime de instrumente 3D și motoare care permit oricui să facă jocuri 3D. Cu toate acestea, provocările artei 3D sunt descurajante și necesită adesea o mare cantitate de timp, efort și expertiză, pe care solo-ul gamedev sau hobbyistul nu le are. Modelele cu poligon scăzut, în combinație cu umbrirea plată, readuce stilul începutul anilor '90, folosind tehnici pe care le poate învăța oricine. Și nu este doar o revenire nostalgică; umbrirea în plan poate fi ușor combinată cu tehnici moderne cum ar fi hărțile de ocluzie a mediului înconjurător, pentru a vă oferi jocului un aspect remarcabil, avangardist.

Ia un exemplu proiectul Unity aici

Acest tutorial presupune că deja știți cum să faceți modelări 3D sau că puteți găsi modele 3D gratuite pe internet. Voi trage exemple de modele din aer subțire; există o mulțime de tutoriale pe internet despre cum să începeți să modelați 3D. Dacă începeți, vă recomand foarte mult Wings 3D și SketchUp. Ambele au interfețe extrem de accesibile în comparație cu aplicațiile profesionale de modelare și vor exporta în formate pe care le pot utiliza Blender și Unity.


De ce utilizați umbrirea netedă?

Deci v-ați decis să vă murdăriți mâinile cu Unity și să începeți să faceți un joc complet 3D. Poate că nu aveți abilități de joc de artă anterioare sau poate că ați făcut o artă pentru jocuri 2D; în orice caz, veți afla rapid că jocurile 3D necesită un set foarte mare de abilități de creat. Nu numai că trebuie să înveți cum să creezi modele 3D, ci și să modelezi acele modele pentru a trage corect o textură pe suprafața modelului tău. Trebuie, de asemenea, să creați cu ușurință textura, desigur.

Ce se întâmplă dacă ați putea să creați modelul, dar ați terminat și gata pentru joc după câțiva pași suplimentari de a culori și umbra? S-ar putea să ajungeți la așa ceva:

Sau asta:

Sigur, aspectul este spartan și lo-fi - dar asta e punctul! Indiferent dacă v-ați gândit la nostalgia timpurie a anilor '90, un aspect abstract modern sau pur și simplu doriți să economisiți o mulțime de timp pentru a face un joc de jam, umbrirea plată este o alegere excelentă de stil pentru începători și experți 3D.

Dacă începeți doar cu jocul de artă, simplitatea fluxului de lucru vă permite să vă concentrați asupra fundamentelor: învățați cum să creați un model 3D cu o siluetă și formă frumoasă și colorați-l cu un set mic de culori alese manual. Concentrarea pe aceste fundamente vă învață abilitățile de bază ale artei fără distragere a atenției.


Cum funcționează umbrirea plată

Fiecare model 3D este compus dintr-un set de vârfuri care determină forma acelui model. Pentru fiecare vertex, există și un vector numit a normal-gândiți-vă la acest lucru ca pe un mic știft care iese din vârf.

Motorul de randare folosește normal pentru fiecare vârf și compară direcția sa cu direcția oricărei surse de lumină și cu direcția în care se află camera, pentru a determina cantitatea de lumină care se aplică acelui vârf.

Redactorul încetinește ușor cantitatea de lumină de la un vârf la altul, oferind un model 3D de bază un aspect "pernă". Cu excepția cazului în care aplicați o textură (și adesea, chiar dacă o faceți), aceasta arată cu adevărat teribilă asupra a ceea ce nu este de fapt o suprafață curbată, "pillowy"

Cu o umbrire plată, întreaga suprafață a unui poligon primește o cantitate uniformă de lumină calculată de la o valoare normală care se lipsește în afară din centrul poligonului:

Aplicațiile moderne de modelare utilizează "marginile dure" sau "grupurile de netezire" pentru a ajusta normele vertexului modelului dvs. pentru a se potrivi cu poligonul în care se află, astfel încât acesta să fie uniform și uniform umbrit. Un artist 3D calificat le va folosi pentru a face ca marginile ascuțite să pară ascuțite și suprafețele plate ar arăta neted, dar suntem interesați să facem întregul model să fie ascuțit și plat. Din fericire, Unity face acest lucru foarte simplu.


Tehnica de bază

Dacă sunteți suficient de familiarizat cu instrumentul dvs. de modelare, puteți face modelul să arate umed, stabilind toate marginile ca fiind "grele". Cu toate acestea, în Unitate puteți alege pur și simplu să lăsați Unitatea să creeze margini dure automat:

Pasul 1

Faceți clic pe modelul dvs. în Proiect fereastră pentru a aduce în revistă Setări de import în Inspector panou.

Pasul 2

Mergeți la Normale & Tangente secțiune și, în normale dropdown, alege calculati.

Pasul 3

Seteaza Smoothing Angle la 0 și faceți clic pe aplica.

Unitatea va face orice margine care are un unghi mai clar decât aceasta într-o margine tare. Vrem ca toate marginea noastră să fie greu, așa că trebuie să fie 0 dă acest efect.

Simțiți-vă liber să experimentați diferite unghiuri de nivelare, în funcție de geometria modelului dvs., poate fi o modalitate uimitor de simplă de a oferi un aspect complet diferit.

Pasul 4

Acum, când modelul nostru este umbrit, trebuie să-i dăm o culoare! Există multe modalități de a face acest lucru, dar unele sunt mai bune decât altele:

  • Selectați porțiunile din modelul dvs. și setați-le la un material diferit pentru fiecare culoare pe care doriți să o utilizați.
  • Atribuiți culorile vârfurilor în programul dvs. de modelare.
  • Creați o "textură de paletă" care conține o grămadă de pătrate colorate și textură - cartografiați modelul folosind acest lucru.

Prefer foarte mult ultima metodă, pe care o voi descrie mai jos. În mod normal, după ce ați creat un model 3D, trebuie să îl desfaceți cu minuțiozitate pentru a se potrivi unei texturi artizanale. Cu toate acestea, deoarece suntem interesați doar de a avea o singură culoare pentru fiecare poligon, nu contează exact cum arată postul de dezlipire UV - ar putea fi doar un amestec aleatoriu de vârfuri, atâta timp cât este pe partea de sus a corectă culoare!

Primul pas în colorare este crearea texturii. Pentru exemplul nostru, să spunem că vrem patru culori:

Apoi, încărcați modelul 3D finalizat în modelul ales și încărcați-vă textura. Selectați toate fețele modelului pe care doriți să le obțineți o anumită culoare și dezlegați automat UV-ul. Rezultatul va fi probabil un amestec confuz de poligoane.

Așa cum am spus, asta nu contează. Mutați toate poligoanele unul peste celălalt și micșorați-le într-un mic pensulă care se va potrivi într-unul din pătratele de pe textura dvs. paletă. Apoi, trageți-le pe culoarea dorită.

Uitați-vă la modelul dvs.; secțiunile texturate au acum culoarea corectă! Repetați acest proces pentru restul fețelor modelului dvs., selectându-le și dezvelind din nou pe baza culorii pe care doriți să o faceți. Dacă faci o greșeală, nu e mare lucru, selectează din nou fețele, despachetezi din nou, dacă este necesar, și pune-le în locul potrivit pe textura. Același lucru nu se poate spune pentru dezlipirea "reală" UV!

Voilà! Aveți un model colorat, plin de culoare, pe care îl puteți importa în joc.


Ce alte metode?

În cazul în care vă întrebați, iată câteva motive pentru a evita celelalte două metode:

Materiale multiple

Această metodă creează o mulțime de materiale pe care trebuie să le urmăriți în unitate și, mai important, Unity nu vă va încărca dinamic modelele și nu va folosi un apel întreg pentru fiecare material, adesea cel mai mic blocaj al hardware-ului grafic modern.

Pur și simplu puneți, veți obține performanță teribil dacă utilizați această metodă pe scară largă.

Vertex Culori

Acest lucru funcționează, de fapt, destul de bine și, probabil, doriți să utilizați acest lucru în funcție de nevoile dvs. specifice sau de fluxul de artă. Cu toate acestea, veți observa ceva imediat: când importați modelul și utilizați un shader de bază difuz, culorile vertexului nu par să se afișeze!

Acest lucru se datorează faptului că shaderele de bază le ignoră; va trebui să utilizați shadere speciale care utilizează efectiv datele de culoare vertex. Acestea pot fi găsite cu ușurință, dar lucrurile se complică dacă doriți și alte efecte de redare de la alte shadere: aceste shadere nu folosesc adesea culori vertex și va trebui să modificați shader-ul.

Dacă nu știți deja cum să scrieți shadere, acest lucru poate duce la o mulțime de timp și efort pe care ați prefera să le cheltuiți în restul jocului. De asemenea, s-ar putea să fiu doar eu, dar mi se pare mult mai ușor să schimbați simultan mai multe culori cu o textură decât să le setați manual într-un model sau în joc cu un script.


Optimizarea

Acum, că aveți o paletă de texturi și o tehnică de bază găsită, puteți continua să creați restul modelelor pentru jocul dvs. După cum puteți suspecta, puteți să adăugați culori în paleta dvs. și să folosiți aceeași textura pentru întregul joc.

Există, de fapt, câteva avantaje mari de performanță pentru a face acest lucru: dacă rămânem în folosirea aceluiași material pentru întregul joc, Unitatea va atrage, de obicei, toate obiectele mai eficient prin "împachetarea" acestora. După cum am menționat mai devreme, "remiterile de apel" reprezintă un obstacol major în grafica computerizată și este o idee bună să le păstrați la un nivel minim.

Unitatea va încerca în mod automat să deseneze scena în cât mai puține apeluri de tragere posibil dacă folosiți un singur material pentru toate, deși fiecare model trebuie să fie scalat în același mod și să aibă mai puțin de aproximativ 300 de noduri. Acesta vă va informa cât de bine se face în Statistici fereastră:

Bacsis: Dacă doriți să aflați mai multe despre dozare, asigurați-vă că ați verificat documentele Unity pentru acest subiect. Aceasta ar trebui să fie necesară citirea pentru oricine este interesat de performanța jocului lor!


Schimbarea culorilor pe zbura

Aveți un set de modele care sunt umbrite și colorate și totul pare a fi în vigoare, dar dacă doriți să schimbați culorile în timp ce se joacă jocul?

De exemplu, să presupunem că aveți un scenariu care va da naștere la avion, dar după aceea doriți să-l colorați albastru dacă este prietenos sau roșu dacă este un inamic. Cu siguranta puteti crea doar palete separate si materiale separate, insa inseamna ca pierdeti cresterea performantei in lotul acestor doua tipuri de avioane.

Nu este o afacere mare dacă doar câțiva dintre ei sunt vizați imediat. Cu toate acestea, luați exemplul unui teren generat de procedură, alcătuit din tone și tone de plăci sau cuburi, de diferite tipuri de teren, cum ar fi un anumit joc de nisip popular. Aceasta ar însemna o tonă de apeluri - dar nu vă temeți, există o modalitate de a continua să folosiți doar un singur material!

Amintiți-vă cum ați colorat modelul prin împingerea coordonatelor UV în cutii colorate? Unitatea vă permite să modificați vârfurile modelului dvs. în zbor, inclusiv coordonatele UV, astfel încât pentru fiecare tip de teren diferit puteți să mutați coordonatele UV în cutia de culori corectă prin script.

Creați un nou script C # din Unity numit PaletteColorizer și lipiți acest cod în el:

utilizând UnityEngine; utilizând System.Collections; clasa publică PaletteColorizer: MonoBehavior public int colorsPerRow = 4; public int colorIndex = 0; suprascriere publică boolUVs = false; void Awake () if (! enabled) retur;  SetUVsToColor (colorIndex);  void Actualizare ()  void public SetUVsToColor (int colorIndex) if (overrideUVs) SetUVs (gameObject, GetColorOffset (colorIndex));  altfel TranslateUVs (gameObject, GetColorOffset (colorIndex));  Vector2 GetColorOffset (int colorIndex) Vector2 offset = nou Vector2 (); float rând = Mathf.Floor (colorIndex / colorsPerRow); flotare pas = 1.0f / colorsPerRow; offset.x = (colorIndex - (rând * colorsPerRow)) * pas; offset.y = (1.0f - (rând / culoriPerRow)); întoarcere offset;  void public static TraducereUV (GameObject obj, Vector2 offset) var meshFilter = obj.GetComponent (); Mesh mesh = meshFilter.mesh; var newUVs = Vector2 nou [mesh.uv.Length]; pentru (int i = 0; i < mesh.uv.Length; i++)  newUVs[i] = new Vector2(mesh.uv[i].x + offset.x, mesh.uv[i].y + offset.y);  mesh.uv = newUVs;  static public void SetUVs(GameObject obj, Vector2 offset)  var meshFilter = obj.GetComponent(); Mesh mesh = meshFilter.mesh; var newUVs = new Vector2[mesh.uv.Length]; for(int i=0; i < mesh.uv.Length; i++)  newUVs[i] = new Vector2(offset.x + 0.01f, offset.y - 0.01f);  mesh.uv = newUVs;  

Pentru a utiliza acest script, pur și simplu adăugați-l ca o componentă a oricărui obiect de joc cu un material folosind o textură paletă, setați numărul de culori pe rând și setați indicele de culoare (începând cu 0 în colțul din stânga sus și numărarea dreapta și în jos).

Dacă coordonatele UV ale modelului dvs. nu sunt configurate pentru a se încadra în interiorul cutiilor de palete (cum ar fi în cazul quad-ului "apă" în jurul hexelor), verificați Înlocuiți UV-urile Caseta de bifat; după cum puteți vedea mai sus, acest lucru va face scriptul să scrie în întregime noi coordonate, mai degrabă decât să schimbe cele existente.

Un lucru de ținut minte în legătură cu această metodă este că, atunci când modificați orice rețea, Unitatea va crea în liniște o rețea nouă în memorie. Dacă faceți acest lucru foarte des pe un număr mare de ochiuri, s-ar putea să întâmpinați probleme de memorie și veți dori să căutați un mijloc de cache și de partajare a ochiurilor care au fost colorate în același mod. Pentru un număr rezonabil de modele low-poly, totuși, probabil că niciodată nu trebuie să vă faceți griji.


Ocluzia mediului ocluziv

Plăcuțele plate nu trebuie neapărat să fie asociate întotdeauna cu blocuri de culoare uniforme. Un mod în care puteți adăuga niște detalii subtile și un aspect realist "prafuit" la orice suprafață este să adăugați o ocluzie ambientală. Unity Pro oferă modalități de a adăuga ocluzie ambientală ca filtru de postprocesare, dar vreau să vă arăt o modalitate prin care puteți adăuga acest bit suplimentar de lustruire fără a avea nevoie de versiunea Pro și fără a avea nevoie de niciun shade special.

Tot ce trebuie să faceți este să vă dezbrăcați modelul și să "coaceți" efectul de ocluzie ambientală asupra unei texturi. Acest lucru necesită să vă petreceți timp și efort pentru a vă despacheta corect modelul, dar după pasul respectiv, este vorba de câteva clicuri și un pic de plictisire în programul dvs. de vopsire pentru a vă da modelului dvs. un aspect puțin mai real, avangardist.

Pasul 1

În primul rând, veți dori să încărcați Blender cu o scenă goală: Apăsați A pentru a selecta toate obiectele din scena de pornire, apăsați Șterge, apoi apăsați D a confirma. Nu doriți nici o lampă sau aparat de fotografiat, deoarece acestea vor fi importate ca obiecte junk goale în Unity.

Pasul 2

Apoi, importați modelul în el. (Fișier> Import> Wavefront (.obj)). Pentru acest exemplu, să începem cu un bolovan.

Pasul 3

Deschideți Editorul UV și creați o textură care poate conține aproximativ cantitatea de detaliu dorită. Sunt destul de zgârcit, așadar rămân 256x256 pixeli pentru orice dimensiune a jucătorului (o piatră sau un copac) și merg mai mult pentru obiecte foarte mari (cum ar fi muntele pe care merg).

Pasul 4

Acum, desfaceți modelul. Există numeroase modalități de abordare, care sunt acoperite cu mult mai multe detalii decât am putea vreodată să sperăm, așa că vă rugăm să consultați documentația Blender sau alte tutoriale online despre cum să vă despachetați modelul corect și eficient.

Pasul 5

Acum că aveți un model dezbrăcat, sunteți gata să coaceți ocluzia ambientală pe textura dvs. Blender va face ocluzia ambientală direct pe textura dvs., respectând coordonatele UV pe care tocmai le-ați dezbrăcat. Pur și simplu urmați acești pași:

  1. Apasă pe Face (pictograma camerei) de pe panoul Proprietăți din partea dreaptă a ecranului.
  2. Derulați în jos până la Coace subsecțiune (în partea de jos) și extindeți-o.
  3. Schimba Modul de coacere din Full Render la Ocluzia mediului.
  4. Apasă pe Coace buton direct deasupra.

Pasul 6

Acum aveți textura AO coaptă și un model care are coordonatele UV corecte pentru al utiliza. Salvați textura într-un fișier imagine și exportați modelul în Blender într-un format pe care Unity îl poate utiliza (cum ar fi .FBX).

Pasul 7

În funcție de nevoile dvs., este posibil să utilizați textura așa cum este. Pur și simplu creați un nou material Diffuse care folosește noua dvs. textura AO coapte și setați culoarea la ceva care arată frumos.

Cu toate acestea, probabil veți dori să aveți modele cu mai multe culori, cum ar fi un copac. Trebuie doar să urmați câțiva pași suplimentari. Urmați instrucțiunile de mai sus pentru a crea o textura AO copt pentru modelul dvs. de copac. De data aceasta, totuși, veți dori să țineți evidența locului unde plasați coordonatele UV, deoarece va trebui să coloreze manual locațiile respective pe textura.

Ar fi înțelept să vă grupați insulele UV prin culoare. În acest exemplu, pun piesele portbagajului în partea superioară a texturii și părțile frunzei din partea de jos.

Pasul 8

Deschideți textura AO coptată cu programul de vopsea ales (orice lucru care suportă straturile va face, cum ar fi GIMP). Creați un strat nou și puneți-l deasupra stratului dvs. AO, utilizând stratul AO ca ghid pentru a culori noul strat în funcție de culorile pe care doriți să le vedeți în model.

Folosește lasou instrumentul sau alt instrument de selecție ales de dvs. pentru a selecta porțiunile texturii pe care doriți să o colorați, apoi completați cele cu culoarea corectă.

Pasul 9

Acum aveți culorile configurate, deci este timpul pentru sarcina finală: amestecarea AO peste culori. Mutați stratul AO deasupra stratului colorat și schimbați modul de amestecare în Multiplica.

Setați opacitatea stratului la ceea ce arată frumos. Folosește-ți propria judecată, dar nu uitați să notați acest procent, deoarece pentru a obține un efect uniform asupra tuturor texturilor dvs., veți dori să utilizați aceeași metodă de amestecare și cantitate.

Salvați această textură într-un fișier și importați-l în Unity alături de modelul de copac. Creați un material exact așa cum ați făcut pentru bolovan, folosind textura pe care tocmai ați făcut-o.

Cam asta e tot! Utilizați această tehnică pe toate modelele dvs. pentru a oferi scenei întregi un aspect mai lustruit și mai tangibil decât ați putea obține cu umbrirea de bază de bază.

S-ar putea să observați că materialele dvs. utilizează numai shadere de difuzie de bază. Unul dintre lucrurile frumoase despre utilizarea AO copt amestecat direct pe partea de sus a texturii de culoare este că puteți folosi această textura cu orice alt shader care are o textură difuză ... fără codul AO specific!


Concluzie

Acum aveți o unealtă utilă de tehnici grafice pe care le puteți folosi pentru a crea un întreg joc plat umbrit. Cu destulă practică, puteți realiza imagini uimitoare care sunt rapide pentru a produce și care fac eficient.