Slik tilpasser du enhetlige spillobjekter med kode

I denne opplæringen vil jeg vise deg grunnleggende om å bruke prosedyreformet tilpasning til din fordel, i Unity. Det koker i utgangspunktet ned til Bruk av tilfeldighet innenfor visse regler. Hvis du bruker noen form for prosedyre system (selv en enkel), kan du legge til et mangfold av mangfold og detaljer i spillet ditt uten å måtte opprette alt manuelt..

Vi starter med å lage et enkelt tre manuelt, og deretter bruke prosedyrejusteringsteknikker for å automatisere etableringen av en rekke liknende forskjellige trær. Deretter plasserer vi disse trærne i et enkelt spill for å vise hvordan de ser ut i "handling".

Her er hva våre prosedyrisk genererte trær vil se ut:


Klikk på knappen for å generere et nytt sett med trær.

Setup

Som i min tidligere opplæring, må du ha Unity installert, og ha grunnleggende kunnskap om det. (Se Hvordan lære enhet for et godt sted å komme i gang.)

Opprett et nytt prosjekt for denne opplæringen, og merk av i boksen merket karakterkontrollere; Vi trenger kanskje dem senere.

Jeg har forberedt noen trær som vi vil bruke, som du finner i 3d-filer mappe av kilde nedlasting. Hele prosjektfilene, hvis du vil bruke dem, kan også bli funnet i kildenedlastingen, men er ikke nødvendig for denne opplæringen.

Klar? La oss gå!


Opprette et tre

La oss lage et enkelt tre først siden, for å legge til prosedyriske berører, trenger vi en grunnleggende mal for å starte fra.

Sett 3D-filene jeg nevnte ovenfor i aktivmappen. Husk å sette skaleringen i importøren til 1 heller enn 0,001, slik at størrelsene strekker seg opp.

Lag nå en kube og nevn den Tre. Gå til Mesh Filter komponent og bytt ut kubemasken for tree_01 mesh. Det bør dukke opp hvis du har 3D-filene i aktivmappen din.

Træret kan ikke vises fullt ut enda. Dette skyldes at 3D-modellen for treet støtter to materialer (bark og blader), men akkurat nå er det fortsatt satt til ett. For å fikse dette, åpne materialer array i Mesh Renderer komponent av kuben, og sett inn Størrelse til 2. Det skal se slik ut:

Nå trenger vi materialer for bark og blader. Lag to nye materialer og gi dem en grunnleggende brun og grønn farge. Tilordne disse to materialene til materialer sporet i Mesh Renderer av treet, og det skal vises med de viste materialene, slik:

For å fullføre dette grunnleggende treet, legg til en kapselkollider ved å klikke Komponent> Fysikk> Capsule Collider. Dette er slik at vi ikke beveger "gjennom" treet når vi tester det ut senere. Enhet vil spørre om du vil erstatte den nåværende boksen collider på treet, som du bør bekrefte. Når den nye collider er lagt til, endrer du verdiene slik at kapselens form overlapper trestammen på treet slik:

Disse verdiene vil fungere:

Trekk nå treobjektet i prosjektmappen for å gjøre det til en prefab. Vår grunnleggende tre er ferdig!


Tilfeldig rotering av trærne

Opprett et nytt skript som heter tree.js og legg det til treprefabrikken. Legg nå følgende linjer til Start() funksjon:

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

Treet vil nå roteres en tilfeldig mengde på y-aksen når den er opprettet. Dette betyr at hvis du plasserer en treserie, slik:

... da blir de alle i sin egen retning når de starter spillet. Sett en haug med trær i ditt nivå og prøv det ut!


Justere størrelsen

På samme måte kan vi endre størrelsen på ethvert objekt. Legg til følgende kode i tree.js manus:

transform.localScale = transform.localScale * Tilfeldig.Range (0,5, 1,5);

Dette vil enten redusere eller øke størrelsen på treet. Hvis du starter med en skala på 1 (som skal være tilfelle hvis alt er satt opp riktig), vil den nye skalaen være mellom 0,5 (halv så stor) og 1,5 (50% større). Nå skal trærne se enda mer varierte ut:


Bruke forskjellige 3D-modeller

Du har kanskje lagt merke til at det faktisk er tre trær i filene jeg ga deg tidligere. Det er fordi vi nå skal tilfeldigvis bytte ut 3D-modellen til en annen, og skape enda flere trær fra malen.

For å gjøre det, legg til følgende kode i tree.js manus:

var treeMeshes: Mesh []; funksjon Start () gameObject.GetComponent (MeshFilter) .mesh = treeMeshes [Random.Range (0, treeMeshes.Length)]; 

Før du begynner scenen, tildeler du de tre maskene vi har til den gruppen, slik:

Hvis du spiller din scene, vil du legge merke til at du nå får tre forskjellige tremasker, tilfeldig tilordnet.

Du kan teste alt dette ut i demoen nedenfor. Hvis du trykker på knappen, vil alle trærne bli erstattet med nye og unike.


Endre farge

Denne kan være litt vanskelig. I tillegg til alle de tidligere funksjonene gir vi hvert tre en unik nyanse av grønt og brunt.

Først må vi vite hvordan du får tilgang til fargene. Materialet til en gjenstand kan vanligvis nås via renderer.material.color. I vårt tilfelle har vi imidlertid to farger, noe som betyr at vi trenger tilgang til dem via renderer.materials [0] Color og renderer.materials [1] Color. Kontroller trådenes gjenger for å se hvilket materiale (blad eller bark) er i spor 0, og hvilken er i spor 1.

Å lage en tilfeldig farge fungerer på samme måte som forrige trinn. Hvis du legger til disse linjene:

renderer.materials [0] .color = Farge (Random.Range (0, 1.1), Random.Range (0, 1.1), Random.Range (0, 1.1)); renderer.materials [1] .color = Farge (Random.Range (0, 1.1), Random.Range (0, 1.1), Random.Range (0, 1.1));

... da vil både barkmaterialet og bladmaterialet få en helt ny farge tildelt. La oss sjekke det ut:

Ok, det er ikke det vi faktisk går for. Disse er tilfeldige farger fra hele tilgjengelig spektrum! For kunstige gjenstander, som biler, kan dette være nok. Men vi har trær, så vi trenger greener og brune.

Erstatt fargekoden vi nettopp har lagt til med dette:

renderer.materials [0] .color = Farge (Random.Range (0.8, 1.1), Random.Range (0.4, 0.6), Random.Range (0, 0.2)); renderer.materials [1] .color = Color (Random.Range (0, 0.4), Tilfeldig.Range (0,6, 1,1), Tilfeldig.Range (0, 0.4));

Og prøv det ut:

Mye bedre. (Hvis plutselig bladerne er brune og kofferten er grønn, bytt den 1 og 0 i renderer.materials [0].)

Koden gir en ny farge i begynnelsen av programfarge. De tre tilfeldige verdiene går fra 0 (minimum) til 1 (maksimum), som deretter tilsvarer de røde, grønne og blå verdiene i fargen. Ved å begrense rekkevidden av tilfeldigheten, som å si Tilfeldig.Range (0,3, 0,6), verdiene er begrenset til et bestemt område. Dette gjør at vi kan lage en rekke nye farger som fremdeles er "grønne", eller hvilken som helst farge vi kan spesifisere.


Tilting the Tree (valgfritt)

Dette er bare en liten tweak, men en fin en likevel. Vi kan gi treet en liten skråning til den ene siden, noe som eliminerer den "rent plassert" følelsen som kanskje har kommet opp tidligere

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

Denne gangen legges en veldig liten rotasjon på x-aksen, slik at treet lener seg i den retningen. For å sikre at det ikke er "gap" mellom treets røtter og bakken, er "pivot" (eller midten) av tremasker litt over røttene, noe som betyr at det er nok wiggle-rom tilgjengelig.

Hele trescriptet skal se slik ut:

var treeMeshes: Mesh []; funksjon Start () transform.localEulerAngles.y = Tilfeldig.Range (0, 360); transform.localEulerAngles.x = Random.Range (-10, 10); transform.localScale = transform.localScale * Tilfeldig.Range (0,5, 1,5); gameObject.GetComponent (MeshFilter) .mesh = treeMeshes [Random.Range (0, treeMeshes.Length)]; renderer.materials [0] .color = Farge (Random.Range (0.8, 1.1), Random.Range (0.4, 0.6), Random.Range (0, 0.2)); renderer.materials [1] .color = Color (Random.Range (0, 0.4), Tilfeldig.Range (0,6, 1,1), Tilfeldig.Range (0, 0.4)); 

Du kan prøve alt ut i denne demoen:


Opprette et enkelt prosessnivå

La oss se hvordan disse føler seg i et faktisk spill.

Sett et fly på bakken og skala det opp. Dette blir vår "gulv" for nivået. Mens du er på det, lager et gulvmateriale og tilordne det til gulvet. Sett skalfaktoren til flyet til 50.1.50, så vi har nok plass.

Deretter setter du en første personkontrollant inn i scenen. Den finnes i tegnkontrollerne som ble importert i begynnelsen av opplæringen. (Hvis du ikke har dem, klikk Eiendeler> Importpakke> Character Controllers). Etter at du har plassert FPS-kontrollerne, fjern hovedkameraet; Kontrolleren kommer med sin egen, så vi trenger ikke kameraet i scenen lenger. Legg også til et retningslys.

Hvis du vil opprette trær automatisk, oppretter du en ny JavaScript-fil og heter den treeGenerator.js. Sett inn følgende kode i den:

var treePrefab: GameObject; var numberOfTrees: int = 20; funksjon Start () for (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); 

Sett treeGenerator.js Skript på gulvet, tilordne treet prefab til treePrefab variabel spor, og prøv det ut:

Og ferdig! Nå har du et enkelt utforskende spill, som vil skape et unikt nivå hvert løp.

Ytterligere forbedringer

Spillet du har kan nå bli vilt utvidet. Du kan legge til flere planter, som palmer eller busker. Du kan legge til andre objekter, som bergarter eller epler. Eller du kan legge til en slags mynt eller pickup, som spilleren kan løpe over for å øke sin score.


Konklusjon

Prosessmessige berører er en enkel og effektiv måte å lage detaljer automatisk på. I stedet for å ha ti objekter, kan du ha uendelig mange.

Du kan bruke elementene vi spilte med i ditt eget spill, eller du kan ta dem fra hverandre og skrive dem på nytt for å passe dine egne formål. For eksempel laget jeg et system som skaper forskjellige lengder av bambus:

Du kan lage biler med variable elementer, eller plassere fiender automatisk på et nivå. Mulighetene er endeløse.