Programmering av et spill med enhet: En nybegynnerguide

Programmering av et spill med enhet: En nybegynnerguide
Denne guiden er tilgjengelig for nedlasting som en gratis PDF. Last ned denne filen nå . Kopier og del dette gjerne med venner og familie.

Et overraskende trekk ved internettøkonomien er fremveksten av indie -videospill. En gang det eksklusive domenet til triple-A-studioer med tusen mann, multi-million dollar, er det utviklet en rekke verktøysett som gir moderne spillutviklingsressurser i hendene på enkeltpersoner eller små ad-hoc-samlinger av programmerere og designere. Vi har tidligere diskutert de beste indiespillene, så sørg for å sjekke dem for å få litt inspirasjon til hva som kan oppnås med verktøy som Unity.





Disse indie-spillutviklingsteamene har vist en smidighet og risikotoleranse som i mange tilfeller lar dem presse spillinnovasjon raskere enn sine store budsjett-kolleger. En rekke sjokkerende vellykkede indietitler har premiere de siste årene, inkludert Minecraft , Limbo , og Super kjøttgutt , og selv om du ikke trenger ferdigheter for å lage spill som dette, kan du lage et spill ved hjelp av Buildbox.





I det raskt utviklende landskapet med indiespillutvikling, Enhet har dukket opp som en de-facto-standard: den lave kostnaden, brukervennligheten og det brede funksjonssettet gjør den ideell for rask spillutvikling. Samhold er så fleksibel at du kan til og med lag dine egne spillkontrollere med litt DIY vet hvordan!





Selv store studioer som CCP (Developers of Eve Online ) bruk den til raskt prototyping av spillkonsepter. Unity tilbyr en 'spillmotor i en eske' - en fysikk- og gjengivelsesmotor med kroker for flere skriptspråk, tilpasset praktisk talt alle sjangere videospill.

Selv om Unity gir en visuell redaktør for å manipulere spillmiljøet, er Unity ikke et verktøy for å lage programmer for spill. Det krever at du programmerer for å produsere resultater, men gir deg også et mye mer fleksibelt og kraftig verktøy enn noe 'game maker' -program muligens kan.



Enhet vil ikke gjøre jobben for deg, men det reduserer adgangsbarrieren vesentlig. Når du starter helt fra bunnen av med C ++ og OpenGL, kan det ta dager å komme til et punkt der det faktisk er noe som gjengis på skjermen. Ved å bruke Unity tar det omtrent ti sekunder. Unity legger de grunnleggende elementene i spillskaping i hendene på nybegynnere programmerere på en rask, intuitiv måte.

I dag vil jeg veilede deg gjennom alt du trenger å vite for å lage et spill i Unity, som er delt inn i ti hovedkapitler:





§1 - Versjoner av enhet

§2 - Installere enhet





§3-En kort introduksjon til det objektorienterte paradigmet

§4 - Grunnleggende om enhet

§5 – Eksempel: Grunnleggende elementer i et spill

§6 - Scripting in Unity

§7 – Eksempel: Scripting Pong

§8 – Utforske dokumentasjonen / lære mer

§9 - Bygg spillet ditt / kompiler til en frittstående applikasjon

§10-Sluttnotater

1. Versjoner av enhet

Enhet kommer i to grunnleggende smaker: pro -versjonen og gratisversjonen. Det er en antall forskjeller , men i grove trekk støtter pro-versjonen en rekke visuelle forbedringer (som myke skygger i sanntid og etterbehandling), og et stort antall relativt mindre funksjoner som er ekstremt nyttige for mer komplekse spill.

Når det er sagt, for de fleste relativt enkle spillene du kanskje vil bygge, er gratisversjonen av Unity helt tilstrekkelig. Vi vil bryte ned de viktigste forskjellene nedenfor mer detaljert for de som er interessert.

1.1 Priser

Gratisversjonen av Unity er selvfølgelig gratis. Imidlertid er det noen få begrensninger: gratisversjonen av Unity kan ikke lisensieres til noe selskap med en årlig inntekt på mer enn $ 100 000 . Selv om slike organisasjoner er utenfor omfanget av denne veiledningen, er det sannsynligvis lurt å komme til Pro -versjonen hvis du mistenker at du kan bli en slik organisasjon.

Pro -versjonen av Unity er $ 75 en måned, eller $ 1500 for en permanent lisens, og har ingen grenser for hva du kan gjøre med spillene som er opprettet med den. Det er også en 30-dagers gratis prøveversjon tilgjengelig, som vi vil bruke for denne guiden, for å gi deg en så fullstendig oversikt over de tilgjengelige funksjonene som mulig. Et ettårig studentlisens er også tilgjengelig gjennom Studere til $ 129 .

1.2 Funksjoner

Det er mange funksjoner fraværende i gratisversjonen av Unity. Imidlertid er de viktigste forskjellene som følger: gratisversjonen av Unity mangler en rekke gjengivelsesalternativer som gir mulighet for bedre utseende, raskere kjørende spill (LOD-støtte, skjermplass etterbehandling, avanserte shaders, sanntids myk skygger og utsatt gjengivelse). Det mangler også det fulle mekanim animasjonssystem , og noen AI -verktøy.

Generelt, for komplekse, store prosjekter eller prosjekter der grafisk ytelse er viktig, er pro-versjonen verdt. Jeg bruker pro-versjonen, fordi jeg utvikler virtual reality-spill for Oculus Rift, og etterbehandlingsstøtten på skjermen er nødvendig for å samhandle riktig med headsettet.

2. Installere Unity

Enhet er grei å installere. Du kan laste ned den kjørbare filen fra unity3d.com/get-unity/download .

Når du har lastet den ned, kjører du den og følger installasjonsinstruksjonene. Når installasjonen er fullført, vises et vindu med tittelen 'aktiver din Unity -lisens'. Merk av i boksen 'aktiver en gratis 30-dagers prøveversjon av Unity Pro' og deretter 'OK'.

Gratulerer! Du har nå en 30-dagers prøveversjon av Unity Pro. Når prøveperioden utløper, hvis du ikke vil kjøpe pro -versjonen, kan du bytte til gratisversjonen og beholde eksisterende innhold.

installere en ny versjon av office 2016

3. En kort introduksjon til det objektorienterte paradigmet

Før du begynner med Unity, er det viktig at vi går litt over det grunnleggende. Enhet støtter begge deler C # og JavaScript til spillprogrammering ; Vi jobber med C# for denne opplæringen.

For det første, hvis du aldri har programmert før, legg denne opplæringen til side og bruk noen dager på å jobbe gjennom Microsofts C # Language Primer inntil du føler deg komfortabel med å bruke språket for enkle oppgaver.

Hvis du vil ha noe som er litt annerledes enn C# (men ikke nødvendigvis et språk du kan bruke i Unity), kan du ta en titt på vår guide til de seks enkleste programmeringsspråkene for nybegynnere.

Hvis du har programmert før på et imperativt eller objektorientert språk som C eller Java, kan du skumme primeren og gjøre deg kjent med hvordan C# skiller seg fra andre språk du har brukt tidligere. Uansett, ikke fortsett med opplæringen før du føler deg komfortabel med å løse enkle problemer med C# (for eksempel hvis jeg skulle be deg skrive et program som skriver ut de første hundre primtallene, bør du kunne skrive det programmet uten konsultere Google).

Det viktigste konseptet å forstå her er det objektorienterte paradigmet (forkortet som ÅPEN ). I objektorienterte språk er programmer delt inn i funksjonelle enheter som kalles Objekter . Hvert objekt har sine egne private variabler og funksjoner. Objektspesifikke funksjoner kalles metoder .

Ideen her er modularitet: ved å ha hvert objekt isolert og tvinge andre objekter til å samhandle med det gjennom metodene sine, kan du redusere antallet mulige utilsiktede interaksjoner - og i forlengelse av feil. Du kan også opprette objekter som du kan bruke igjen senere uten endringer. I Unity skal du bygge disse objektene og feste dem til spillenheter (hvis oppførsel de vil styre).

Objekter blir instantiert fra klasser : en klasse er bare en fil som beskriver definisjonen av objektet ditt. Så, hvis du vil ha en mook objekt som håndterer AI for en fiende i spillet ditt, vil du skrive en 'Mook' -klasse og deretter legge den filen til hver fiendtlig enhet. Når du kjører spillet ditt, vil hver fiende være utstyrt med en kopi av 'Mook' -objektet.

Å feste et nytt skript til et objekt ser slik ut:

Først, velg objektet og gå til Inspektør . Klikk på Legg til komponent knapp.

Gå til nytt manus , skriv inn navnet du vil ha, og klikk opprette og legge til .

Nå har du et nytt skript som du kan redigere ved å dobbeltklikke på det!

En klassefil ser omtrent slik ut:

using UnityEngine;
public class Mook : MonoBehaviour {
private float health;
void Start () {
health = 100;
}
void Update(){
if (health > 0) {
/* Search for player
if you encounter the player on the road, kill him
if you get shot, remove a random amount of health */
}
}
}

La oss bryte dette ned:

  • Bruke UnityEngine: Denne linjen forteller C# at vi vil bruke Unitys biblioteker, som lar oss koble til Unity -spillmotoren.
  • Offentlig klasse Mook: Mono Denne linjen erklærer klassen og navnet - mook .
  • Privat flytehelse: Dette erklærer en privat klassevariabel (som bare kan endres fra klassen). Variabelen er gitt en verdi i Start .
  • Ugyldig start (): Dette erklærer en metode som kalles Start . Start er en spesiell metode som bare kjøres en gang, når spillet starter.
  • Ugyldig oppdatering (): Oppdatering er en annen spesiell metode, som kjører på hver ramme. Det meste av spilllogikken din går her.
  • // hvis du møter spilleren på veien, drep ham: Denne linjen er en kommentar (enhver linje som begynner med en dobbel skråstrek ignoreres av C#). Kommentarer brukes til å minne deg selv på hva bestemte kodebiter gjør. I dette tilfellet blir denne kommentaren brukt til å stå for en mer komplisert kodeblokk som faktisk gjør det kommentaren beskriver.

Sammen med Start og Oppdater , kan du instantiere dine egne metoder med nesten hvilket som helst navn. Imidlertid vil metoder du oppretter ikke kjøre med mindre de blir kalt. La oss erklære en metode for en hypotetisk klasse kalt addTwoNumbers som legger to tall sammen:

public float addTwoNumbers(float a, float b) {
return a+b;
}

Dette erklærer en offentlig (tilgjengelig for andre objekter) metode som returnerer en flottør, kalt addTwoNumbers , som tar to flyter som input (kalt til og b ). Den returnerer deretter summen av de to verdiene som utgang.

Kaller denne metoden fra samme klasse (si fra innsiden Oppdater ) ser slik ut:

float result = addTwoNumbers(1, 2);

Å kalle metoden fra en annen klasse er lik:

addTwoNumbers instance;
float result = instance.addTwoNumbers(1, 2);

Igjen, dette skaper bare en forekomst av klassen vår, får tilgang til den riktige metoden og mater den med tallene vi vil legge til, og lagrer deretter resultatet i resultat . Enkel.

Hvis skriptet ditt er knyttet til et objekt som har spesielle egenskaper (som en partikkelemitter) som du ikke kan få tilgang til under det vanlige settet med GameObject -parametere, kan du velge å behandle det som en annen type spillenhet ved å bruke GetComponent metode.

Syntaksen for det ser slik ut:

GetComponent().Play();

Hvis noe av dette er ukjent for deg, gå tilbake og gå gjennom C# -primeren. Det vil spare deg for mye frustrasjon når vi fortsetter.

4. Grunnleggende om enhet

I denne delen skal vi jobbe oss gjennom de grunnleggende mekanikkene i Unity -motoren. Arbeidsflyten i Unity går omtrent slik:

  1. Opprett en enhet for å tjene en rolle i spillet (blank GameObjects kan brukes til abstrakte logiske oppgaver).
  2. Skriv eller finn en klassefil, og legg den til enheten som et skript (ved hjelp av Legg til komponent -knappen i inspektør utsikt.
  3. Løpe > test > feilsøking > gjenta til det fungerer og gå videre til neste element i spillet.

Unity kommer med en rekke grunnleggende visningsfaner som kan legges ut på forskjellige måter etter brukerens smak. De fem store er:

  1. Spill: viser en løpende forekomst av spillet som du kan samhandle med og teste.
  2. Scene: gir en statisk, redigerbar versjon av spillverden .
  3. Inspektør: lar deg endre individuelle enheter i spillverdenen ved å velge dem i redaktør kategorien.
  4. Prosjekt: lar deg bla gjennom prosjektets filer og dra modeller, materialer og andre ressurser inn i redaktør kategorien for å plassere dem i spillverdenen.
  5. Hierarki: denne kategorien viser alle objekter i verden, slik at du kan finne fjerne objekter i scenen og overordnede enheter til hverandre ved å klikke og dra.

Se diagrammet nedenfor for plasseringen av alle disse tingene:

4.1 Enhetsenheter

4.1.1 Mesh

Mesh er veien 3D geometri er representert i Enhet. Du kan enten bruke Unitys innebygde primitiv objekter (kuber, kuler, sylindere osv.), eller importer dine egne 3D -modeller fra en modelleringspakke som Blender eller Maya . Unity støtter en rekke 3D -formater, inkludert .fbx , og .3ds .

De grunnleggende verktøyene for manipulering av masker er knappene skalering, rotasjon og oversettelse i øvre venstre hjørne av grensesnittet. Disse knappene legger til kontrollikoner på modellene i redigeringsvisningen, som deretter kan brukes til å manipulere dem i verdensrommet. For å endre tekstur eller fysikkegenskaper til et objekt, velg dem og bruk inspektør visning for å analysere materiale og stiv kropp elementer.

4.1.2 GUI -elementer

Tradisjonelle GUI -sprites og tekst kan vises ved hjelp av GUI -tekst og GUI -tekstur GameObjects i redaktøren. En mer robust og realistisk måte å håndtere UI -elementer på er imidlertid å bruke 3D -tekst og Quad GameObjects (med gjennomsiktige teksturer og en ubelyst gjennomsiktig skyggelegging) for å plassere HUD -elementer i spillverdenen som enheter.

I hierarki visning, kan disse spillelementene dras inn på hovedkameraet for å gjøre dem til barn, og sikre at de beveger seg og roterer med kameraet.

GUI -elementer (tekst og teksturer) kan justeres i størrelse og skala ved hjelp av de relevante feltene i kategorien Inspektør.

4.1.3 Materialer

Materialer er kombinasjoner av teksturer og shaders, og kan dras direkte til spillobjekter fra prosjektfanen. Et stort antall shaders kommer med Unity Pro, og du kan justere teksturen som er festet til dem ved hjelp av fanen Inspektør for et objekt de er brukt på.

For å importere en tekstur, konverter den til en .jpg , .png , eller .bmp , og dra den inn i eiendeler mappen under Unity -prosjektkatalogen (som vises i Mine dokumenter som standard). Etter noen sekunder vil en lastelinje vises i redigeringsprogrammet. Når det er ferdig, vil du kunne finne bildet som en tekstur under prosjekt kategorien.

4.1.5 Lys

Lys er GameObjects som gir utstråling til verden. Hvis det ikke er noen lys i scenen din, tegnes alle polygoner på samme lysstyrkenivå, noe som gir verden et flatt, utvasket utseende.

Lys kan plasseres, roteres og ha flere interne egenskaper som du kan tilpasse. De intensitet glidebryteren styrer lysstyrken til lyset og område kontrollerer hvor raskt det forsvinner.

Retningslinjene i scenevisning viser deg maksimal rekkevidde for belysningen. Spill med begge innstillingene for å oppnå ønsket effekt. Du kan også justere fargen på lyset, mønsteret ( kjeks vises på overflaten som lyset pekes på, og hva slags bluss som vises på skjermen når du ser direkte på lyset. Informasjonskapselen kan brukes til å forfalske mer realistiske lysmønstre, lage dramatiske falske skygger og simulere projektorer.

De tre hovedtypene lys er få øye på , punkt , og retningsbestemt .

Spotlys ha en plassering i 3D -rom og projisere lys bare i én retning i en kjegle med variabel vinkel. Disse er gode for lommelykter, søkelys, og gir deg generelt mer presis kontroll over belysningen. Spotlys kan kaste skygger.

Punktlys ha en plassering i 3D -rom, og kaste lys jevnt i alle retninger. Punktlys kaster ikke skygger.

Retningslys Til slutt brukes de til å simulere sollys: de projiserer lys i en retning som fra uendelig langt unna. Retningslys påvirker alle objekter i scenen, og kan produsere skygger.

4.1.6 Partikkelsystemer

TIL Partikkelsystem er en GameObject som genererer og kontrollerer hundrevis eller tusenvis av partikler samtidig. Partikler er små, optimaliserte 2D -objekter som vises i 3D -rom. Partikkelsystemer bruker forenklet gjengivelse og fysikk, men kan vise tusenvis av enheter i sanntid uten å stamme, noe som gjør dem ideelle for røyk, brann, regn, gnister, magiske effekter og mer.

Det er mange parametere du kan justere for å oppnå disse effektene, og du kan få tilgang til dem ved å gyte et partikkelsystem under komponentredaktør > velge partikkelsystemet > åpne inspektørfanen . Du kan endre størrelse, hastighet, retning, rotasjon, farge og tekstur på hver partikkel, og angi at de fleste parametrene også skal endres over tid.

Under kollisjon attributt, hvis du aktiverer det og angir simuleringsområdet til verden du får partikler som vil kollidere med objekter i verden, som kan brukes til en rekke realistiske partikkeleffekter, inkludert regn, vann i bevegelse og gnister.

5. Eksempel: Grunnleggende elementer i et spill

For denne opplæringen skal vi lage et enkelt spill av Pong - noe vi har dekket flere ganger i DIY før:

  • Arduino Classic Pong
  • Arduino OLED Pong

I denne delen går vi over å arrangere kjerneelementene - skriptopplæringen kommer senere.

La oss først bryte ned spillet Pong i de grunnleggende komponentene. Først trenger vi to padler og en ball. Ballen flyr utenfor skjermen, så vi vil ha en mekanisme for å tilbakestille den. Vi vil også at teksten skal vise gjeldende poengsum, og for å vise deg alle kjerneelementene i Unity, vil vi ha en fancy partikkeleffekt når du treffer ballen. Hele spillet må være dramatisk opplyst.

Det brytes ned i et kuleobjekt (en kule), a gyter , to padle rekvisitter med partikkelavgivere vedlagt, a 3D-tekst enhet , og a spotlys . For denne opplæringen bruker vi standard fysikkmateriale sprette , med sprett kombinere satt til multiplisere . Slik ser oppsettet ut på ti skjermbilder:

Opprett først en terning prop for padlen.

Skaler det riktig, kopiere det , og sette en sfære mellom padlene for ballen.

Lag deretter en 3DText -objekt og skala og posisjon det riktig, endring av skriftstørrelse attributt for å få et mindre pikselert bilde.

Deretter lager du to partikkelsystemer , velg egenskapene du vil ha, og fest dem til padlene.

Deretter vil du posisjon og roter kameraet slik at den rammer inn scenen riktig. Mens kameraet er valgt, kan du se en liten forhåndsvisning av kameraets visning i nedre høyre hjørne.

Før vi er ferdige, må vi lage ytterligere to terninger for å være støtfangere for å forhindre at ballen hopper ut av spillområdet. Vi kan gjøre dem usynlige ved å fjerne merket for maskerender i fanen inspektør .

Hvis du treffer play, kan du nå se de grunnleggende elementene i spillet vårt lagt opp. De vil ikke gjøre noe ennå, men vi kommer til det!

Nå som vi har fått det oppsettet, skal vi snakke om hva som er involvert i scripting av disse elementene for å lage et spill.

6. Scripting i enhet

Når du har et skript knyttet til et objekt, kan du revidere det ved å dobbeltklikke på det i inspektør . Dette åpner MonoDevelop , standard utviklingsmiljø for Unity. I hovedsak er Monodevelop et tekstredigeringsprogram med funksjoner som er spesielt optimalisert for programmering.

Søkeord og kommentarer er uthevet i blå og grønn , og numeriske verdier og strenger vises i nett . Hvis du har brukt Formørkelse eller andre IDE -er, er MonoDevelop veldig likt. Du kan bygge skriptene dine inne i redaktøren, for å se etter syntaksfeil, slik:

Generelt, for å få skriptet ditt til å samhandle med Unity, må du referere til elementer som objektet som inneholder skriptet har (du kan se en liste over disse elementene under inspektør kategorien når det aktuelle objektet er valgt). Du kan deretter ringe til metoder eller angi variabler for hvert av disse elementene for å vedta endringene du ønsker.

Hvis du vil at et skript på et objekt skal påvirke egenskapene til et annet objekt, kan du lage et tomt GameObject variabel i skriptet ditt, og bruk inspektør å tilordne den til et annet objekt i scenen.

En liste over elementene et objekt kan ha er som følger (hentet fra inspektørvisningen til en av våre padler i eksemplet ovenfor):

  1. Forvandle
  2. Cube (Mesh Filter)
  3. Box Collider
  4. Mesh Renderer

Hver av disse aspektene av objektet kan påvirkes fra et manus. Deretter ser vi på nøyaktig hvordan.

6.1 Transform

Transformasjonsfunksjonene for et GameObject i Unity styrer de fysiske parameterne til objektet: its skala , det er posisjon , og dets orientering . Du kan få tilgang til dem fra et skript som dette:

transform.position = newPositionVector3;
transform.rotation = newRotationQuaternion;
transform.localScale = newScaleVector3;

I eksemplene ovenfor er de navngitte variablene av typene som er angitt i navnene. Det er noen viktige detaljer her: posisjon og skala lagres, som du forventer, som Vector3s . Du får tilgang til X , OG , og MED komponenter i hver (for eksempel transform.posisjon.y gir deg avstanden til et objekt over nullplanet).

Imidlertid for å unngå gimbal lås , rotasjoner håndteres som Kvarteringer (firekomponentvektorer). Fordi håndmanipulerende quaternions ikke er intuitive, kan du manipulere rotasjoner ved hjelp av Eulerian-vinkler ved å bruke Quaternion.Euler slik metode:

transform.rotation = Quaternion.Euler(pitch, yaw, roll);

Hvis du ønsker å flytte objekter jevnt fra ett sted til et annet, finner du Slerp metoden for quaternions og vector3s nyttig. Slerp tar inn tre argumenter - den nåværende tilstanden, den endelige tilstanden og endringens hastighet, og interpolerer jevnt mellom dem i den gitte hastigheten. Syntaksen ser slik ut:

transform.position = Vector3.Slerp(startPositionVector3, newDestinationVector3, 1);

6.2 Renderer

Gjengivelsesfunksjonene i Unity lar deg kontrollere måten overflatene på rekvisitter gjengis på skjermen. Du kan tildele teksturen på nytt, endre fargen og endre skyggelegging og synlighet av objektet. Syntaksen ser slik ut:

renderer.enabled = false;
renderer.material.color = new Color(0, 255, 0);
renderer.material.mainTexture = myTexture;
renderer.material.shader = newShader;

De fleste av disse har ganske klare funksjoner. Det første eksemplet gjør det aktuelle objektet usynlig: et nyttig triks i en rekke situasjoner. Det andre eksemplet tildeler et nytt RGB -farge (nemlig grønt) til objektet det gjelder. Den tredje tilordner den viktigste diffuse teksturen til en ny Texture -variabel. Det siste eksemplet endrer skyggelegging av objektets materiale til en nylig definert skyggevariabel.

6.3 Fysikk

Unity kommer med en integrert fysikkmotor - noe fysikk sandkassespill alle bruker. Dette lar deg tildele de fysiske egenskapene til objekter og la detaljene i deres simulering håndteres for deg. Generelt, i stedet for å prøve å implementere din egen fysikk ved hjelp av en lærebok og transformasjonssystemet, er det enklere og mer robust å bruke Unitys fysikkmotor i størst mulig grad.

Alle fysikkrekvisitter krever kolliderer . Selve selve simuleringen håndteres imidlertid av a stiv kropp , som kan legges til i inspektør utsikt. Stive legemer kan være kinematisk eller ikke -kinematisk .

Kinematisk fysikk rekvisitter kolliderer med (og effekt) ikke -kinematisk fysikk rekvisitter rundt dem, men er upåvirket av kollisjon selv. Statiske kinematiske rekvisitter er de ordspråklige, ubevegelige objektene, og bevegelige kinematiske objekter er den ordspråklige ustoppelige kraften (for posten, når de kolliderer, passerer de ganske enkelt gjennom hverandre).

Utover det kan du justere objektets vinkelmotstand (hvor mye energi det tar å snurre det), endre massen, diktere om det er påvirket av tyngdekraften eller ikke, og bruke krefter på det.

Eksempler:

rigidbody.angularDrag = 0.1f;
rigidbody.mass = 100;
rigidbody.isKinematic = false;
rigidbody.useGravity = true;
rigidbody.AddForce(transform.forward * 100);

Disse er alle ganske selvforklarende. Det eneste å merke seg her er bruken av forvandle. fremover . Vector3 har alle tre komponenter ( .framover , .opp , og .Ikke sant ) assosiert med dem, som kan nås og roteres med dem ( framover er retningen til den blå pilen i redaktøren). De forvandle. fremover søkeord er ganske enkelt fremovervektoren for det nåværende objektet med størrelse 1. Det kan multipliseres med en flottør for å skape mer kraft på objektet. Du kan også referere transform.up og transform.right , og nekte dem for å få sine reverser.

6.4 Kollisjon

Ofte, når du bygger et spill, vil du at en kollisjon skal resultere i en endring av tilstanden i koden din, utover bare fysikksimulering. For dette trenger du en kollisjonsdeteksjonsmetode .

Det er en viss mengde forarbeid som trengs for å oppdage kollisjoner i Unity. Først trenger minst ett av objektene i kollisjonen a ikke-kinematisk stiv kropp festet til den. Begge objektene må ha riktige kolliderere, satt til å være ikke-utløsere. Totalhastigheten til begge objektene må være lav nok til at de faktisk kolliderer, i stedet for bare å hoppe gjennom hverandre.

Hvis du har alt du har tatt vare på, kan du se etter kollisjon ved å plassere en spesiell metode for kollisjonsdeteksjon i et skript som er festet til objektet du vil kontrollere kollisjon med. Metoden vil se slik ut:

void OnCollisionEnter(Collision other) {
//do things here
}

Denne metoden kjøres automatisk i løpet av den første rammen som et annet objekt berører objektet ditt. Kollisjonsenheten annen er en referanse til objektet du treffer. Du kan for eksempel referere til dens gameobject , stiv kropp , og forvandle egenskaper for å manipulere det på forskjellige måter. Samtidig som OnCollisionEnter er sannsynligvis den vanligste funksjonen du vil bruke, kan du også bruke OnCollisionExit og OnCollisionStay (med ellers identisk syntaks og bruk), som aktiverer under den første rammen at du slutter å kollidere med et objekt og under hver ramme som du kolliderer med et objekt, henholdsvis.

Noen ganger kan det også være nyttig å gjøre det som heter raycasting . I raycasting er en uendelig tynn linje (a stråle ) blir kastet gjennom verden fra en eller annen opprinnelse, langs en eller annen vektor, og når den treffer noe, returneres posisjonen og andre detaljer om den første kollisjonen. Koden for en raycast ser slik ut:

RaycastHit hit;
if (Physics.Raycast(transform.position, -Vector3.up, out hit)) {
float distanceToGround = hit.distance;
}

Dette kaster en stråle fra posisjonen til det nåværende objektet langs -Vector3.up (rett ned), og kobler variabelen truffet til det første objektet det kolliderer med. Når strålen din har truffet noe, kan du få tilgang hit.distance for å finne ut hvor langt unna det er, eller hit.GameObject for å manipulere objektet du treffer.

Raycasts som dette kan brukes til skyttere for å bestemme hva pistolen pekte på, eller for å velge objekter når kameraet ser på dem, eller for visse stiler av bevegelsesmekaniker.

6.5 Tidskorreksjon

En viktig faktor å huske på når du manipulerer objekter på denne måten har å gjøre med framerate . Uansett hvor nøye du optimaliserer, vil framerates alltid variere, og du vil ikke at spillhastigheten skal variere tilsvarende. Hvis noen andre kjører spillet ditt på en raskere datamaskin enn du utviklet det på, vil du ikke at spillet skal kjøres med dobbel hastighet.

Måten du korrigerer for dette på er ved å multiplisere verdiene du bruker med tiden det tok å gjengi den siste rammen. Dette gjøres ved å bruke Time.deltaTime . Dette endrer effektivt hastigheten til en variabel du øker hver ramme fra endring per ramme til endring per sekund , og du bør sannsynligvis gjøre denne endringen til enhver verdi du øker eller reduserer hver ramme.

6.6 Lydkilder og lyttere

Nå som vi har dekket hvordan vi lager, gjengir og kontrollerer objekter, la oss snakke om den andre sansen som dataspill kan tjene: nemlig, lyd . Unity støtter to typer lyder: 2D og 3D lyder. 3D -lyder varierer volumet basert på avstand, og forvrenges når de beveger seg i forhold til kameraet; 2D -lyder gjør det ikke.

2D-lyder er passende for voice-overs og bakgrunnsmusikk, og 3D-lyder gjelder for lyder generert av hendelser i verden. For å endre om en lyd er 3D eller ikke, velg den i prosjekt visning, bytt til inspektør og velg det riktige alternativet fra rullegardinmenyen, og trykk deretter på importere på nytt knapp.

For å spille lyden, må du legge ved en lydkilde til en rekvisitt (rekvisitten du vil at lyden skal stamme fra, i tilfelle en 3D -lyd). Da må du åpne lydklipp feltet og velg lydfilen din.

hva er en smart tv og hva gjør den

Du kan bruke myAudioSource.Pause () og myAudioSource.Play () for å kontrollere disse lydfilene. Du kan justere nedfallsatferd, volum og dopplerforskyvning av lydene under inspektør kategorien for lydkilden.

6.7 Inngang

Et spill som ikke tar noen innspill fra brukeren er ikke mye av et spill. Det er mange forskjellige typer input du kan lese i, og nesten alle er tilgjengelige via Inngang og Nøkkelkode gjenstander. Noen eksempler på inndatasetninger (som har verdier evaluert for hver ramme) er nedenfor.

Vector3 mousePos = Input.mousePosition;
bool isLeftClicking = Input.GetMouseButton(0);
bool isPressingSpace = Input.GetKey(KeyCode.Space);

Funksjonene til disse linjene er stort sett selvforklarende. Ved å bruke disse tre typer inndata -referanser kan du rekonstruere kontrollskjemaene for de fleste moderne 3D -dataspill.

6.8 Feilsøking av et skript

La oss si at et skript ikke fungerer. Som den gode legen sier, kan det hende at det oppstår ringinger og henger med deg. Hvis det er direkte syntaksfeil med C#, vil spillet vanligvis nekte å kjøre når du trykker på play, og noen ganske nyttige feilmeldinger er gitt hvis du bygge skriptene fra redaktøren. Se nedenfor:

Disse feilene er vanligvis ikke de vanskeligste å fikse. Det som kan være mer problematisk er subtile semantiske feil, der du har lykkes med å skrive en fil full av gyldig C# - bare ikke en som gjør det du trodde den ville. Hvis du har en av disse feilene, og du har problemer med å spore den, er det noen få ting du kan prøve å forbedre situasjonen.

Den første er å stoppe utførelsen av spillet, og sjekke konsollen. Du kan sette spillet på pause ved å klikke på pause ikonet i den øvre midterste delen av editoren, og deretter velge konsoll fra bunnen av vindu menyen (eller trykke på Ctrl > Skifte > C ). Selv om det ikke er noen feil, kan advarsler fortsatt bidra til å gi noen ledetråder om hva som kan gå galt.

Hvis dette ikke fungerer, kan du også prøve å få en ide om tilstanden til skriptet ditt ved å skrive ut tilstanden til interne variabler for å bekrefte at programmet gjør det du tror det gjør. Du kan bruke Debug.Log (streng) å skrive ut innholdet i en streng til konsollen når programkjøringen treffer den linjen. Generelt, hvis du jobber bakover fra det du tror burde skje gjennom tingene som burde få det til å skje, vil du til slutt nå et punkt der feilsøkingsutskriftene dine ikke gjør det du forventer at de skal gjøre. Det er der feilen din er.

7. Eksempel: Scripting Pong

For å bygge Pong, la oss dele spillet ned i kjerneelementene: vi trenger en ball som ryker frem og tilbake mellom padlene i økende fart, vi trenger en resultattavle som vet når ballene har passert padlene, og vi trenger en mekanisme for starte ballen på nytt når det skjer. Et godt første skritt ville være å legge til en ikke-kinematisk stiv kropp til ballen, to kinematiske stive legemer til padlene, deaktivere tyngdekraften for dem alle, og tildele et passende fysisk materiale fra standardressursene ( sprette med sprett kombinere satt til multiplisere ).

Nedenfor kan du se manuset til ballen med forklarende kommentarer. Ballen må oppnå noen grunnleggende mål: den skal sprette i et komplisert mønster, alltid opprettholde bevegelse på begge akser, og den bør akselerere i et utfordrende, men ikke umulig tempo i horisontal retning.

BallHandler.cs

Deretter må vi script vår padle, som du kan se nedenfor. Padlen må bevege seg opp og ned som svar på tastetrykk (men ikke utenfor visse grenser). Det må også utløse partikkelsystemet når det kolliderer med noe.

PaddleHandler.cs

Deretter trenger vi fiendens AI: noe som vil få fiendens padle til å spore mot ballen med en fast hastighet. For det bruker vi Vector3.Slerp for maksimal enkelhet. Vi vil også like den samme partikkelatferden som vi ser på vår egen padle.

EnemyAI.cs

Til slutt trenger vi et manus for å oppdatere resultattavlen og tilbakestille ballen når den går utenfor banen.

ScoreboardUpdater.cs

Med disse skriptene vedlagt og referansene fylt ut, opplever vi gameplay når vi kjører vårt spill Pong!

Du kan Last ned Pong -demoen min , hvis du vil se alt jeg har skissert i aksjon. Den kjører på Windows-, Mac- og Linux -systemer.

8. Utforske dokumentasjonen / lære mer

Unity er en kompleks motor med mange flere funksjoner enn det som er mulig å dekke i en guide for denne stilen, og det er før du inkluderer den brede delen av (gratis og kommersielle) Unity -utvidelser som er tilgjengelige på internett. Denne guiden vil gi deg et sterkt utgangspunkt for å utvikle et spill, men selvopplæring er en viktig ferdighet i ethvert forsøk, og dobbelt så her.

En avgjørende ressurs her er Unity ScriptReference . ScriptReference er en søkbar database, tilgjengelig for både C# og Javascript, som har en liste over alle Unity -kommandoer og -funksjoner, med beskrivelser av funksjonene og korte eksempler på syntaks.

Hvis du har problemer med redaktøren og grensesnittet til Unity, eller bare liker videoopplæringsprogrammer, er det en lang liste med høy kvalitet Opplæringsvideoer for enhet tilgjengelig. Mer omfattende (men mindre bred) tekstopplæringer for Unity er også tilgjengelig fra CatLikeCoding.

Til slutt, hvis du har spørsmål som ligger utenfor omfanget av dokumentasjon eller opplæringsprogrammer, kan du stille spesifikke spørsmål på svar.Unity3d.com . Husk at svarene er gitt av frivillige, så respekter tiden deres og søk i databasen først for å sikre at spørsmålet ditt ikke allerede er besvart.

9. Bygg spillet ditt / kompiler til en frittstående applikasjon

Når du har bygget noe du er stolt av (eller du er ferdig med å klone vårt litt dodgy Pong -eksempel for trening), er det på tide å flytte spillet fra redaktøren og gjøre det til noe du kan legge ut på internett og tvinge venner og familie å leke. For å gjøre det må du bygge en frittstående applikasjon. Den gode nyheten er at i Unity er dette veldig, veldig enkelt. Det er imidlertid noen potensielle hikke du vil være forsiktig med.

For det første, vet at du bare kan bygge et feilfritt prosjekt. For det formål må du kontrollere at du har konsollen åpen mens du bygger: Det er noen feilbetingelser som spillet vil ignorere i redaktøren, men vil fortsatt avbryte et forsøk på å bygge. Dette dumper bare feilmeldinger til konsollen, uten synlige resultater på skjermen, noe som kan være frustrerende hvis du glemmer å sjekke. Når du har fått spillet til å kompilere feilfritt, kan du velge Bygg innstillinger under Fil menyen, eller trykk på Ctrl > Skifte

> B . Dette vil åpne en enkel dialog som lar deg bygge spillet ditt for flere plattformer.

Prosessen derfra er selvforklarende: velg alternativene dine og trykk bygge ; spillet vil be deg om en katalog å installere i, og vil plassere både den kjørbare og datakatalogen der. Disse to filene kan zippes sammen og distribueres (bare pass på at du ikke tar betalt for et spill som er bygd i Unity -demoen, da dette bryter vilkårene for bruk).

10. Avsluttende notater

Som med alle spillutviklingsverktøy er nøkkelen til suksess med Unity iterativ utvikling. Du må bygge inn håndterbare trinn - vær ambisiøs, for all del, men vær ambisiøs i små biter, og ordne disse bitene slik at selv om du ikke kommer i mål med din ultimate ambisjon, vil du i det minste ende opp med en sammenhengende produkt.

Få de mest avgjørende elementene først: ha en ide om tankene dine minimum levedyktig produkt , den enkleste, mest bare-tingen du muligens kan lage og fremdeles føle at du har oppnådd noe verdt. Kom deg til det minste levedyktige prosjektet før du går videre til større ambisjoner.

Denne opplæringen gir deg et sterkt utgangspunkt, men den beste måten å lære enhet er ved å bygge et spill. Begynn å bygge et spill, fyll hull i kunnskapen din når de kommer opp, og den gradvise kunnskapsflyten vil tære bort tingene du ikke vet overraskende raskt.

Hvis du har lest alt dette og er litt overveldet av kodingen som kreves med Unity, må du sjekke hvordan du gjør det lær spillutvikling med Unity Learn og les også vår guide om hvordan du lager videospill uten programmering.

Unity er et kraftig verktøy, og med litt leting kan du bygge imponerende prosjekter med det raskere enn du kanskje forventer. Gi oss beskjed om hva du bygde i kommentarene nedenfor - vi vil gjerne se!

Dele Dele kvitring E -post 3 måter å sjekke om en e -post er ekte eller falsk

Hvis du har mottatt en e -post som ser litt tvilsom ut, er det alltid best å sjekke ektheten. Her er tre måter å fortelle om en e -post er ekte.

Les neste
Relaterte temaer
  • Programmering
  • Programmering
  • Langform
  • Longform Guide
Om forfatteren Andre Infante(131 artikler publisert)

Andre, som er forfatter og journalist med base i sørvest, vil garantert forbli funksjonell opp til 50 grader Celcius, og er vanntett til en dybde på tolv fot.

More From Andre Infante

Abonner på vårt nyhetsbrev

Bli med i vårt nyhetsbrev for tekniske tips, anmeldelser, gratis ebøker og eksklusive tilbud!

Klikk her for å abonnere