Programmering af et spil med enhed: En begyndervejledning

Programmering af et spil med enhed: En begyndervejledning
Denne vejledning kan downloades som en gratis PDF. Download denne fil nu . Du er velkommen til at kopiere og dele dette med dine venner og familie.

Et overraskende træk ved internetøkonomien er stigningen i indie -videospil. Når engang det eksklusive domæne for triple-A studios med tusinde mand, multi-million dollar, er der blevet udviklet en række værktøjssæt, der bringer moderne spiludviklingsressourcer i hænderne på enkeltpersoner eller små ad-hoc-samlinger af programmører og designere. Vi har tidligere diskuteret de bedste indiespil, så sørg for at tjekke dem ud for lidt inspiration til, hvad der kan opnås med værktøjer som Unity.





Disse indie-spiludviklingsteam har vist en smidighed og risikotolerance, der i mange tilfælde giver dem mulighed for at skubbe gameplay-innovation hurtigere end deres store budgetmodstande. En række chokerende succesrige indie -titler har haft premiere i de seneste år, herunder Minecraft , Limbo , og Super Meat Boy , og selvom du ikke behøver færdigheder til at lave spil som dette, kan du lave et spil ved hjælp af Buildbox.





I det hurtigt udviklende landskab med indiespiludvikling, Enhed er fremstået som noget af en de-facto-standard: dens lave omkostninger, brugervenlighed og brede funktionssæt gør det ideelt til hurtig spiludvikling. Enhed er så fleksibel, at du kan endda lav dine egne brugerdefinerede spilcontrollere med lidt DIY gør det!





Selv store studios som CCP (Developers of Eve Online ) bruge det til hurtigt at prototyper spilkoncepter. Unity leverer en 'game engine in a box' - en fysik- og gengivelsesmotor med kroge til flere scriptsprog, der kan tilpasses stort set enhver genre af videospil.

Selvom Unity leverer en visuel editor til at manipulere spilmiljøet, er Unity ikke et 'zero programmering' spilværktøj. Det kræver, at du programmerer for at producere resultater, men giver dig også et meget mere fleksibelt og kraftfuldt værktøj, end noget 'game maker' program muligvis kunne.



Enhed vil ikke gøre arbejdet for dig, men det reducerer adgangsbarrieren betydeligt. Startende helt fra bunden med C ++ og OpenGL, kan det tage dage at komme til det punkt, hvor der faktisk er noget, der gengives på skærmen. Ved hjælp af Unity tager det cirka ti sekunder. Enhed lægger de grundlæggende elementer i spilskabelse i hænderne på nybegyndere af programmerere på en hurtig, intuitiv måde.

I dag vil jeg guide dig gennem alt, hvad du har brug for at vide for at lave et spil i Unity, som er opdelt i ti hovedkapitler:





§1 - Versioner af enhed

§2 - Installation af enhed





§3 – En kort introduktion til det objektorienterede paradigme

§4 - Grundlæggende om enhed

§5 – Eksempel: Grundlæggende elementer i et spil

§6 – Scripting in Unity

§7 – Eksempel: Scripting Pong

§8 – Udforskning af dokumentationen / Lær mere

§9 – Opbygning af dit spil / kompilering til en selvstændig applikation

§10-Afsluttende noter

1. Versioner af enhed

Enhed findes i to grundlæggende varianter: pro -versionen og den gratis version. Der er en antal forskelle , men i store træk understøtter pro-versionen en række visuelle forbedringer (som bløde skygger i realtid og efterbehandling) og et stort antal relativt mindre funktioner, der er yderst nyttige til mere komplekse spil.

Når det er sagt, for de fleste relativt enkle spil, du måske vil bygge, er den gratis version af Unity helt tilstrækkelig. Vi vil nedbryde nøgleforskellene nedenfor mere detaljeret for dem, der er interesserede.

1.1 Prissætning

Den gratis version af Unity er naturligvis gratis. Der er dog et par begrænsninger: Den gratis version af Unity kan ikke licenseres til nogen virksomhed med en årlig indkomst på mere end $ 100.000 . Selvom sådanne organisationer ligger uden for denne vejledning, er det sandsynligvis klogt at springe til Pro -versionen, hvis du har mistanke om, at du kan blive en sådan organisation.

Pro -versionen af ​​Unity er $ 75 en måned, eller $ 1500 for en permanent licens, og har ingen grænser for, hvad du kan gøre med de spil, der er oprettet med det. Der er også en 30-dages gratis prøveversion til rådighed, som vi vil bruge til denne vejledning for at give dig et så komplet overblik over de tilgængelige funktioner som muligt. En etårig studielicens er også tilgængelig igennem Undersøgelse til $ 129 .

1.2 Egenskaber

Der er mange funktioner fraværende i den gratis version af Unity. De vigtigste forskelle er imidlertid som følger: Den gratis version af Unity mangler en række gengivelsesmuligheder, der giver mulighed for bedre udseende, hurtigere kørende spil (LOD-understøttelse, skærmplads efterbehandling, avancerede shaders, real-time soft skygger og udskudt gengivelse). Det mangler også det fulde mekanim animationssystem , og nogle AI -værktøjer.

Generelt for komplekse, store projekter eller projekter, hvor grafisk ydeevne er vigtig, er proversionen værd. Jeg bruger pro-versionen, fordi jeg udvikler virtual reality-spil til Oculus Rift, og understøttelse af skærmplads efterbehandling er nødvendig for korrekt interaktion med headsettet.

2. Installation af Unity

Enhed er ligetil at installere. Du kan downloade den eksekverbare fra unity3d.com/get-unity/download .

Når den er downloadet, skal du køre den og derefter følge installationsvejledningen. Når installationen er færdig, vises et vindue med titlen 'aktiver din Unity -licens'. Marker feltet 'aktiver en gratis 30-dages prøveversion af Unity Pro' og derefter 'OK'.

Tillykke! Du har nu en 30-dages prøveversion af Unity Pro. Når prøveperioden udløber, hvis du ikke vil købe pro -versionen, kan du skifte til gratisversionen og beholde dit eksisterende indhold.

kan jeg spille mine ps3 -spil på min ps4

3. En kort introduktion til det objektorienterede paradigme

Inden vi går i gang med Unity, er det vigtigt, at vi går lidt over det grundlæggende. Enhed understøtter begge dele C # og JavaScript til spilprogrammering ; vi arbejder med C# til denne vejledning.

For det første, hvis du aldrig har programmeret før, skal du lægge denne vejledning til side og bruge et par dage på at arbejde gennem Microsofts C # Language Primer indtil du føler dig tryg ved at bruge sproget til enkle opgaver.

Hvis du gerne vil have noget, der er lidt anderledes end C# (men ikke nødvendigvis et sprog, du kan bruge i Unity), så tag et kig på vores guide til de seks letteste programmeringssprog for begyndere.

Hvis du tidligere har programmeret i et imperativt eller objektorienteret sprog som C eller Java, skal du skumme primeren og gøre dig bekendt med, hvordan C# adskiller sig fra andre sprog, du tidligere har brugt. Uanset hvad, skal du ikke fortsætte med selvstudiet, før du føler dig tryg ved at løse simple problemer med C# (hvis jeg f.eks. Skulle bede dig om at skrive et program, der udskriver de første hundrede primtal, skulle du kunne skrive det program uden konsultere Google).

Det vigtigste begreb at forstå her er det objektorienterede paradigme (forkortet som ÅBEN ). I objektorienterede sprog er programmer opdelt i funktionelle enheder kaldet Objekter . Hvert objekt har sine egne private variabler og funktioner. Objektspecifikke funktioner kaldes metoder .

Ideen her er modularitet: ved at have hvert objekt isoleret og tvinge andre objekter til at interagere med det gennem dets metoder, kan du reducere antallet af mulige utilsigtede interaktioner - og i forlængelse heraf fejl. Du kan også oprette objekter, du senere kan genbruge uden ændringer. I Unity skal du bygge disse objekter og vedhæfte dem til spilenheder (hvis adfærd de vil styre).

Objekter instantieres fra klasser : en klasse er bare en fil, der beskriver definitionen af ​​dit objekt. Så hvis du vil have en mook objekt, der håndterer AI for en fjende i dit spil, ville du skrive en 'Mook' -klasse og derefter vedhæfte denne fil til enhver fjendtlig enhed. Når du kører dit spil, vil hver fjende blive udstyret med en kopi af objektet 'Mook'.

Vedhæftning af et nyt script til et objekt ser sådan ud:

Først, vælg objektet og gå til Inspektør . Klik på Tilføj komponent knap.

Gå til nyt script , indtast det ønskede navn, og klik på oprette og tilføje .

Nu har du et nyt script, som du kan redigere ved at dobbeltklikke på det!

En klassefil ser sådan ud:

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 */
}
}
}

Lad os bryde dette ned:

  • Brug af UnityEngine: Denne linje fortæller C#, at vi vil bruge Unitys biblioteker, som giver os mulighed for at oprette forbindelse til Unity -spilmotoren.
  • Public class Mook: MonoBehaviour: Denne linje angiver klassen og dens navn - mook .
  • Privat float sundhed: Dette erklærer en privat klassevariabel (som kun kan ændres inde fra klassen). Variablen får en værdi i Start .
  • Ugyldig start (): Dette erklærer en metode kaldet Start . Start er en særlig metode, der kun kører en gang, når spillet oprindeligt starter.
  • Ugyldig opdatering (): Opdatering er en anden særlig metode, der kører på alle rammer. Det meste af din spillogik vil gå her.
  • // hvis du støder på spilleren på vejen, dræb ham: Denne linje er en kommentar (enhver linje der starter med et dobbelt skråstreg ignoreres af C#). Kommentarer bruges til at minde dig selv om, hvad bestemte kodebiter gør. I dette tilfælde bruges denne kommentar til at stå for en mere kompliceret kodeblok, der faktisk gør, hvad kommentaren beskriver.

Sammen med Start og Opdatering , kan du instantiere dine egne metoder med næsten ethvert navn. De metoder, du opretter, kører dog ikke, medmindre de kaldes. Lad os erklære en metode til en hypotetisk klasse kaldet addTwoNumbers der tilføjer to tal sammen:

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

Dette erklærer en offentlig (tilgængelig for andre objekter) metode, der returnerer en float, kaldet addTwoNumbers , som tager to floats som input (kaldet til og b ). Det returnerer derefter summen af ​​de to værdier som dets output.

Opkald til denne metode inden for samme klasse (sig indefra Opdatering ) ser sådan ud:

float result = addTwoNumbers(1, 2);

At kalde metoden fra en anden klasse ligner:

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

Igen skaber dette bare en forekomst af vores klasse, får adgang til den relevante metode og fodrer den med de numre, vi vil tilføje, og gemmer derefter resultatet i resultat . Enkel.

Hvis dit script er knyttet til et objekt, der har særlige egenskaber (f.eks. En partikelemitter), som ikke kan tilgås under det normale sæt GameObject -parametre, kan du vælge at behandle det som en anden slags spilenhed ved hjælp af GetComponent metode.

Syntaksen for det ser sådan ud:

GetComponent().Play();

Hvis noget af dette er ukendt for dig, skal du gå tilbage og gennemgå C# -primeren. Det vil spare dig for en masse frustration, når vi fortsætter.

4. Grundlæggende om enhed

I dette afsnit vil vi arbejde os igennem den grundlæggende mekanik i Unity -motoren. Arbejdsgangen i Unity ser sådan ud:

  1. Opret en enhed for at tjene en rolle i spillet (blank GameObjects kan bruges til abstrakte logiske opgaver).
  2. Skriv eller find en klassefil, og tilføj den til objektet som et script (ved hjælp af Tilføj komponent knappen i inspektør udsigt.
  3. Løb > prøve > fejlfinde > gentage indtil det virker og gå videre til det næste element i spillet.

Enhed kommer med en række grundlæggende visningsfaner, der kan lægges på forskellige måder efter brugerens smag. De fem store er:

  1. Spil: viser en løbende forekomst af spillet, som du kan interagere med og teste.
  2. Scene: giver en statisk, redigerbar version af spilverden .
  3. Inspektør: giver dig mulighed for at ændre individuelle enheder i spilverdenen ved at vælge dem i redaktør fane.
  4. Projekt: giver dig mulighed for at gennemse projektets filer og trække modeller, materialer og andre ressourcer ind i redaktør fane for at placere dem i spilverdenen.
  5. Hierarki: denne fane viser alle objekter i verden, så du kan finde fjerne objekter i scenen og overordnede enheder til hinanden ved at klikke og trække.

Se diagrammet herunder for placeringen af ​​alle disse ting:

4.1 Enhedsenheder

4.1.1 Mesh

Mesh er vejen 3D geometri er repræsenteret i Enhed. Du kan enten bruge Unity's indbyggede primitiv objekter (terninger, kugler, cylindre osv.), eller importer dine egne 3D -modeller fra en modelleringspakke som Blender eller Maya . Unity understøtter en række forskellige 3D -formater, herunder .fbx , og .3ds .

De grundlæggende værktøjer til manipulation af masker er skalering, rotation og oversættelsesknapper i øverste venstre hjørne af grænsefladen. Disse knapper tilføjer kontrolikoner til modellerne i editorvisningen, som derefter kan bruges til at manipulere dem i rummet. Hvis du vil ændre tekstur eller fysiske egenskaber for et objekt, skal du markere dem og bruge inspektør visning for at analysere materiale og stiv krop elementer.

4.1.2 GUI -elementer

Traditionelle GUI -sprites og tekst kan vises ved hjælp af GUI -tekst og GUI -tekstur GameObjects i editoren. En mere robust og realistisk måde at håndtere UI -elementer på er imidlertid at bruge 3D tekst og Quad GameObjects (med gennemsigtige teksturer og en uoplyst gennemsigtig skygge) for at placere HUD -elementer i spilverdenen som enheder.

I hierarki visning, kan disse gameplay -elementer trækkes ind på hovedkameraet for at gøre dem til børn og sikre, at de bevæger sig og roterer med kameraet.

GUI -elementer (tekst og teksturer) kan få deres størrelse og skala justeret ved hjælp af de relevante felter på fanen Inspektør.

4.1.3 Materialer

Materialer er kombinationer af teksturer og shaders og kan trækkes direkte ind på spilobjekter fra projektfanen. Et stort antal shaders leveres med Unity Pro, og du kan justere den tekstur, der er knyttet til dem, ved hjælp af fanen Inspektør for et objekt, de er anvendt på.

Hvis du vil importere en tekstur, skal du konvertere den til en .jpg , .png , eller .bmp , og træk den ind i aktiver mappe under Unity -projektmappen (som vises i Mine dokumenter som standard). Efter et par sekunder vises en indlæsningslinje i editoren. Når det er færdigt, kan du finde billedet som en tekstur under projekt fane.

4.1.5 Lys

Lys er GameObjects som projekterer udstråling til verden. Hvis der ikke er lys i din scene, tegnes alle polygoner i samme lysstyrkeniveau, hvilket giver verden et fladt, udvasket look.

Lys kan placeres, roteres og have flere interne egenskaber, som du kan tilpasse. Det intensitet skyderen styrer lysets lysstyrke og rækkevidde styrer, hvor hurtigt det forsvinder.

Retningslinjerne i scenevisning vise dig belysningens maksimale område. Spil med begge indstillinger for at opnå den ønskede effekt. Du kan også justere farven på lyset, mønsteret ( cookie vises på overfladen, lyset peges på, og hvilken slags blussning der vises på skærmen, når man ser direkte på lyset. Cookien kan bruges til at forfalske mere realistiske lysmønstre, skabe dramatiske falske skygger og simulere projektorer.

De tre hovedtyper af lys er få øje på , punkt , og retningsbestemt .

Spotlys have en placering i 3D -rum og kun projektere lys i en retning i en kegle med variabel vinkel. Disse er gode til lommelygter, søgelys og giver dig generelt mere præcis kontrol over belysningen. Spotlys kan kaste skygger.

Punktlys have en placering i 3D -rum og kaste lys jævnt i alle retninger. Punktlys kaster ikke skygger.

Retningslys Endelig bruges de til at simulere sollys: de udsender lys i en retning, som om de var uendeligt langt væk. Retningslys påvirker alle objekter i scenen og kan producere skygger.

4.1.6 Partikelsystemer

TIL Partikelsystem er en GameObject der genererer og styrer hundredvis eller tusinder af partikler samtidigt. Partikler er små, optimerede 2D -objekter, der vises i 3D -rum. Partikelsystemer bruger forenklet gengivelse og fysik, men kan vise tusindvis af enheder i realtid uden at stamme, hvilket gør dem ideelle til røg, ild, regn, gnister, magiske effekter og mere.

Der er mange parametre, du kan justere for at opnå disse effekter, og du kan få adgang til dem ved at gyde et partikelsystem under komponent editor > valg af partikelsystem > åbner fanen Inspektør . Du kan ændre størrelse, hastighed, retning, rotation, farve og tekstur for hver partikel og også indstille de fleste af disse parametre til at ændre sig over tid.

Under kollision attribut, hvis du aktiverer det og indstiller simuleringsrummet til verden du får partikler, der vil kollidere med objekter i verden, som kan bruges til en række realistiske partikeleffekter, herunder regn, vand i bevægelse og gnister.

5. Eksempel: Grundlæggende elementer i et spil

Til denne vejledning skal vi lave et simpelt spil Pong - noget som vi har dækket flere gange i DIY før:

  • Arduino Classic Pong
  • Arduino OLED Pong

I dette afsnit går vi over til at arrangere kerneelementerne - scriptingvejledningen kommer senere.

Lad os først opdele Pong -spillet i dets grundlæggende komponenter. Først skal vi bruge to padle og en bold. Bolden flyver offscreen, så vi vil have en mekanisme til at nulstille den. Vi vil også have, at teksten viser den aktuelle score, og for at vise dig alle kerneelementerne i Unity vil vi have en smuk partikeleffekt, når du rammer bolden. Hele spillet skal være dramatisk oplyst.

Det bryder ned i et boldobjekt (en kugle), a gyde , to padle rekvisitter med partikeludsendere vedhæftet, a 3D-tekst enhed , og a spotlys . Til denne vejledning bruger vi det fysiske standardmateriale hoppe , med hoppe mejetærsker indstillet til formere sig . Sådan ser opsætningen ud på ti skærmbilleder:

Opret først en terning prop til padlen.

Skaler det passende, kopiere det , og sæt en kugle mellem padlerne til bolden.

Opret derefter en 3DText -objekt og vægt og position det korrekt, ændre skriftstørrelse attribut for at få et mindre pixeleret billede.

Opret derefter to partikelsystemer , vælg de egenskaber, du ønsker, og fastgør dem til padlerne.

Dernæst vil du gerne position og drej kameraet så det indrammer scenen korrekt. Mens kameraet er valgt, kan du se et lille eksempel på kameraets visning i nederste højre hjørne.

Inden vi er færdige, skal vi oprette to ekstra terninger for at være kofangere for at forhindre, at bolden hopper ud af spilleområdet. Vi kan gøre dem usynlige ved at fjerne markeringen i mesh renderer i fanen inspektør .

Hvis du rammer play, kan du nu se de grundlæggende elementer i vores spil lagt op. De vil ikke gøre noget endnu, men det kommer vi til!

Nu hvor vi har fået det setup, vil vi tale om, hvad der er involveret i scripting af disse elementer for at lave et spil.

6. Scripting i enhed

Når du har et script knyttet til et objekt, kan du revidere det ved at dobbeltklikke på det i inspektør . Dette åbner Monoudvikling , standardudviklingsmiljøet for Unity. I det væsentlige er Monodevelop en teksteditor med funktioner, der er specifikt optimeret til programmering.

Søgeord og kommentarer fremhæves i blå og grøn , og numeriske værdier og strenge vises i net . Hvis du har brugt Formørkelse eller andre IDE'er, MonoDevelop ligner meget. Du kan bygge dine scripts inde fra editoren for at kontrollere syntaksfejl, sådan:

For at få dit script til at interagere med Unity skal du generelt referere til elementer, som objektet, der indeholder scriptet, har (du kan se en liste over disse elementer under inspektør fane, når det relevante objekt er valgt). Du kan derefter kalde metoder eller indstille variabler for hvert af disse elementer for at vedtage de ønskede ændringer.

Hvis du vil have et script på et objekt til at påvirke egenskaberne for et andet objekt, kan du oprette et tomt GameObject variabel i dit script, og brug inspektør at tildele det til et andet objekt i scenen.

En liste over de elementer, et objekt kan have, er som følger (taget fra inspektørvisningen af ​​en af ​​vores padler i eksemplet ovenfor):

  1. Transform
  2. Terning (netfilter)
  3. Box Collider
  4. Mesh Renderer

Hvert af disse aspekter af objektet kan påvirkes inde fra et script. Dernæst ser vi på præcis hvordan.

6.1 Transform

Transformfunktionerne for et GameObject i Unity styrer objektets fysiske parametre: its vægt , dens position , ogdet er orientering . Du kan få adgang til dem fra et script som dette:

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

I eksemplerne ovenfor er de navngivne variabler af de typer, der er angivet i navnene. Der er et par vigtige detaljer her: position og skala lagres, som du ville forvente, som Vector3s . Du kan få adgang til x , OG , og MED komponenter i hver (f.eks. transformere.position.y giver dig afstanden af ​​et objekt over nulplanet).

Dog for at undgå kardanlås , rotationer håndteres som Kvartioner (firekomponentvektorer). Fordi håndmanipulerende kvaternioner ikke er intuitive, kan du manipulere rotationer ved hjælp af Eulerian-vinkler ved hjælp af Quaternion.Euler metode sådan:

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

Hvis du ønsker at flytte objekter jævnt fra et sted til et andet, finder du Slerp metode til kvaternioner og vector3'er nyttig. Slerp indtager tre argumenter - den nuværende tilstand, den endelige tilstand og ændringens hastighed og interpolerer problemfrit mellem dem ved den givne hastighed. Syntaksen ser sådan ud:

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

6.2 Renderer

Renderer-funktionerne i Unity giver dig mulighed for at styre måden, hvorpå rekvisitternes overflader gengives på skærmen. Du kan tildele tekstur, ændre farve og ændre skygge og synlighed af objektet. Syntaksen ser sådan ud:

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

De fleste af disse har ret klare funktioner. Det første eksempel gør det pågældende objekt usynligt: ​​et nyttigt trick i en række situationer. Det andet eksempel tildeler et nyt RGB farve (nemlig grøn) til det pågældende objekt. Den tredje tildeler den diffuse hovedtekstur til en ny Texture -variabel. Det sidste eksempel ændrer skyggen af ​​objektets materiale til en nyligt defineret skyggevariabel.

6.3 Fysik

Enhed leveres med en integreret fysikmotor - noget fysik sandkassespil alle bruger. Dette giver dig mulighed for at tildele objekters fysiske egenskaber og lade detaljerne i deres simulering håndteres for dig. Generelt er det i stedet for at forsøge at implementere din egen fysik ved hjælp af en lærebog og transformationssystemet enklere og mere robust at bruge Unitys fysikmotor i størst muligt omfang.

Alle fysiske rekvisitter kræver kolliderer . Selve selve simuleringen varetages imidlertid af en stiv krop , som kan tilføjes i inspektør udsigt. Stive legemer kan være kinematisk eller ikke -kinematisk .

Kinematisk fysik rekvisitter kolliderer med (og effekt) ikke -kinematisk fysik rekvisitter omkring dem, men er upåvirket af kollision selv. Statiske kinematiske rekvisitter er de ordsproglige, ubevægelige objekter, og bevægelige kinematiske objekter er den ordsproglige ustoppelige kraft (for posten, når de kolliderer, passerer de simpelthen gennem hinanden).

Udover det kan du justere objektets vinklet træk (hvor meget energi det tager at spinde det), ændre dets masse, diktere, om det er påvirket af tyngdekraften eller ikke, og anvende kræfter på det.

Eksempler:

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

Disse er alle ret selvforklarende. Det eneste at bemærke her er brugen af transformere. fremad . Vector3 har alle tre komponenter ( .frem , .op , og .ret ) forbundet med dem, som kan tilgås og roteres med dem ( frem er retningen for den blå pil i editoren). Det transformere. fremad nøgleord er simpelthen den fremadrettede vektor for det aktuelle objekt med størrelse 1. Det kan ganges med en float for at skabe mere kraft på objektet. Du kan også henvise transform.up og forvandle.højre , og nægter dem for at få deres omvendelser.

6.4 Kollision

Ofte, når du bygger et spil, vil du gerne have, at en kollision resulterer i en tilstandsændring i din kode, ud over bare fysiksimulering. Til dette skal du bruge en metode til påvisning af kollision .

Der er en vis mængde forarbejde nødvendigt for at opdage kollisioner i Unity. For det første har mindst et af objekterne i kollisionen brug for a ikke-kinematisk stiv krop knyttet til den. Begge objekter skal have korrekte kollider, indstillet til at være ikke-udløsere. Den samlede hastighed for begge objekter skal være lav nok til, at de rent faktisk kolliderer, i stedet for blot at springe igennem hinanden.

Hvis du har taget hånd om alt det, du kan kontrollere for kollision ved at placere en særlig kollisionsdetekteringsmetode i et script, der er knyttet til det objekt, du gerne vil kontrollere kollision med. Metoden vil se sådan ud:

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

Denne metode kører automatisk under den første ramme, som et andet objekt rører ved dit objekt. Kollisionsenheden Andet er en reference til det objekt, du rammer. Du kan f.eks. Referere til dens gameobject , stiv krop , og forvandle egenskaber til at manipulere det på forskellige måder. Mens OnCollisionEnter er sandsynligvis den mest almindelige funktion, du vil bruge, kan du også bruge OnCollisionExit og OnCollisionStay (med ellers identisk syntaks og brug), som aktiverer under den første ramme, at du holder op med at kollidere med et objekt og under hver ramme, som du kolliderer med et objekt, henholdsvis.

Nogle gange kan det også være nyttigt at gøre det, der hedder raycasting . Ved raycasting er en uendelig tynd linje (a stråle ) bliver kastet gennem verden fra en eller anden oprindelse, langs en eller anden vektor, og når den rammer noget, returneres positionen og andre detaljer ved den første kollision. Koden til et raycast ser sådan ud:

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

Dette kaster en stråle fra positionen af ​​det aktuelle objekt langs -Vector3.up (lige ned) og forbinder variablen ramt til det første objekt, det kolliderer med. Når din stråle har ramt noget, kan du få adgang hit.distance at bestemme, hvor langt væk det er, eller hit.GameObject at manipulere det objekt, du rammer.

Raycasts som denne kan bruges til skydespil til at bestemme, hvad pistolen pegede på, eller til at vælge objekter, når kameraet ser på dem, eller til bestemte stilarter af bevægelsesmekaniker.

6.5 Tidskorrektion

En vigtig faktor at huske på, når du manipulerer objekter på denne måde, har at gøre med framerate . Uanset hvor omhyggeligt du optimerer, vil framerates altid variere, og du vil ikke have, at din spilhastighed varierer tilsvarende. Hvis en anden kører dit spil på en hurtigere computer, end du har udviklet det på, vil du ikke have, at spillet skal køre med dobbelt hastighed.

Den måde, du korrigerer for dette på, er ved at gange de værdier, du bruger, med den tid det tog at gengive den sidste ramme. Dette gøres ved at bruge Time.deltaTime . Dette ændrer effektivt hastigheden på enhver variabel, du øger hvert billede fra ændring pr. ramme til ændring pr. sekund , og du bør sandsynligvis foretage denne ændring til enhver værdi, du øger eller reducerer hver ramme.

6.6 Lydkilder og lyttere

Nu hvor vi har dækket, hvordan man opretter, gengiver og styrer objekter, lad os tale om den anden mening, som computerspil kan tjene: nemlig, lyd . Unity understøtter to slags lyde: 2D og 3D lyde. 3D -lyde varierer deres volumen baseret på afstand og forvrænges, når de bevæger sig i forhold til kameraet; 2D -lyde gør det ikke.

2D-lyde er egnede til voice-overs og baggrundsmusik, og 3D-lyde gælder for lyde genereret af begivenheder i verden. For at ændre, om en lyd er 3D eller ej, skal du vælge den i projekt visning, skift til inspektør visning, og vælg den relevante indstilling i rullemenuen, og tryk derefter på genindføre knap.

For at kunne afspille lyden, skal du vedhæfte en lydkilde til en prop (den prop, du vil have lyden fra, i tilfælde af en 3D -lyd). Derefter skal du åbne lydklip feltet, og vælg din lydfil.

hvordan man ændrer youtube profilbillede

Du kan bruge myAudioSource.Pause () og myAudioSource.Play () for at styre disse lydfiler. Du kan justere nedfaldsadfærd, lydstyrke og dopplerforskydning af lydene under inspektør fane til lydkilden.

6.7 Indgang

Et spil, der ikke tager input fra brugeren, er ikke meget af et spil. Der er mange forskellige slags input, du kan læse i, og næsten alle er tilgængelige via Input og Nøgle kode genstande. Nogle prøveindgangssætninger (som har en værdi evalueret for hver ramme) er nedenfor.

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

Disse linjers funktioner er for det meste selvforklarende. Ved hjælp af disse tre slags inputreference kan du rekonstruere kontrolordningerne for de fleste moderne 3D -computerspil.

6.8 Debugging af et script

Lad os sige, at et script ikke virker. Som den gode læge siger, kan bangups og hangups ske for dig. Hvis der er direkte syntaksfejl med din C#, vil spillet generelt nægte at køre, når du rammer play, og der gives nogle ret nyttige fejlmeddelelser, hvis du bygge scripts inde fra editoren. Se nedenunder:

Disse fejl er typisk ikke de sværeste at rette. Hvad der kan være mere problematisk er subtile semantiske fejl, hvor du med succes har skrevet en fil fuld af gyldigt C# - bare ikke en, der gør, hvad du troede den ville. Hvis du har en af ​​disse fejl, og du har problemer med at spore den, er der et par ting, du kan prøve at forbedre situationen.

Den første er at stoppe udførelsen af ​​spillet og kontrollere konsollen. Du kan sætte spillet på pause ved at klikke på pause ikonet i den øverste midterste del af editoren, og derefter vælge konsol fra bunden af vindue menu (eller tryk på Ctrl > Flytte > C ). Selvom der ikke er fejl, kan advarsler stadig hjælpe med at give nogle spor om, hvad der kan gå galt.

Hvis dette ikke virker, kan du også prøve at få en ide om tilstanden af ​​dit script ved at udskrive tilstanden for interne variabler for at validere, at programmet gør, hvad du tror, ​​det gør. Du kan bruge Debug.Log (streng) at udskrive indholdet af en streng til konsollen, når programmets udførelse rammer den linje. Generelt, hvis du arbejder baglæns fra det, du tror skulle ske, gennem de ting, der skulle få det til at ske, vil du i sidste ende nå et punkt, hvor dine fejlfindingsudskrifter ikke gør, hvad du forventer, de skal gøre. Det er her din fejl er.

7. Eksempel: Scripting Pong

For at bygge Pong, lad os bryde spillet ned i dets kerneelementer: vi har brug for en bold, der ricochets frem og tilbage mellem padlerne med stigende hastighed, vi har brug for en resultattavle, der ved, hvornår boldene har passeret padlerne, og vi har brug for en mekanisme til genstarte bolden, når det sker. Et godt første skridt ville være at tilføje en ikke-kinematisk stiv krop til bolden, to kinematiske stive legemer til padlerne, deaktivere tyngdekraften for dem alle og tildele et passende fysisk materiale fra standardaktiverne ( hoppe med hoppe mejetærsker indstillet til formere sig ).

Nedenfor kan du se manuskriptet til bolden med forklarende kommentarer. Bolden skal nå nogle grundlæggende mål: Den skal hoppe i et kompliceret mønster og altid bevare bevægelse på begge akser, og den skal accelerere i et udfordrende, men ikke umuligt tempo i vandret retning.

BallHandler.cs

Dernæst skal vi script vores padle, som du kan se nedenfor. Padlen skal bevæge sig op og ned som reaktion på tastetryk (men ikke uden for bestemte grænser). Det skal også udløse partikelsystemet, når det kolliderer med noget.

PaddleHandler.cs

Dernæst har vi brug for fjendtlig AI: noget der får fjendens padle til at spore mod bolden med en fast hastighed. Til det vil vi bruge Vector3.Slerp for maksimal enkelhed. Vi vil også gerne have den samme partikeladfærd, som vi ser på vores egen padle.

EnemyAI.cs

Endelig har vi brug for et script til at opdatere resultattavlen og nulstille bolden, når den går ud af banen.

ScoreboardUpdater.cs

Med disse scripts vedhæftet og referencerne udfyldt, oplever vi gameplay, når vi kører vores spil Pong!

Du kan download min Pong -demo , hvis du gerne vil se alt, hvad jeg har skitseret i aktion. Det kører på Windows-, Mac- og Linux -systemer.

8. Udforskning af dokumentationen / Lær mere

Unity er en kompleks motor med mange flere funktioner, end der muligvis kunne dækkes i en guide til denne stil, og det er før du medtager den brede række af (gratis og kommercielle) Unity -udvidelser, der er tilgængelige på internettet. Denne guide vil give dig et stærkt udgangspunkt for at udvikle et spil, men selvuddannelse er en vigtig færdighed i enhver bestræbelse, og dobbelt så meget her.

En afgørende ressource her er Unity ScriptReference . ScriptReference er en søgbar database, tilgængelig for både C# og Javascript, som har en liste over alle Unity -kommandoer og -funktioner med beskrivelser af deres funktioner og korte eksempler på syntaks.

Hvis du har problemer med editoren og grænsefladen til Unity, eller bare kan lide videotutorials som et præferencespørgsmål, er der en lang liste over høj kvalitet Enhedsvideoundervisning ledig. Mere omfattende (men mindre bred) tekstvejledninger til Unity er også tilgængelige fra CatLikeCoding.

Endelig, hvis du har spørgsmål ud over omfanget af dokumentation eller selvstudier, kan du stille specifikke spørgsmål på svar.Unity3d.com . Husk, at svarene leveres af frivillige, så respekter deres tid, og søg først i databasen for at sikre, at dit spørgsmål ikke allerede er besvaret.

9. Opbygning af dit spil / kompilering til en selvstændig applikation

Når du har bygget noget, du er stolt af (eller du er færdig med at klone vores lidt dodgy Pong -eksempel til øvelse), er det tid til at flytte dit spil fra editoren og gøre det til noget, du kan lægge ud på internettet og tvinge dine venner og familie til at lege. For at gøre det skal du opbygge en selvstændig applikation. Den gode nyhed er, at det i Unity er meget, meget let. Der er dog et par potentielle hikke, som du vil være forsigtig med.

For det første skal du vide, at du kun kan bygge et fejlfrit projekt. Til det formål skal du sørge for at have konsollen åben, mens du bygger: Der er nogle fejlbetingelser, som spillet ignorerer i editoren, men stadig afbryder et forsøg på at bygge. Dette dumper kun fejlmeddelelser til konsollen uden synlige resultater på skærmen, hvilket kan være frustrerende, hvis du glemmer at kontrollere. Når du har fået dit spil til at kompilere fejlfrit, kan du dog vælge Byg indstillinger under Fil menuen, eller tryk på Ctrl > Flytte

> B . Dette åbner en simpel dialog, der giver dig mulighed for at bygge dit spil til flere platforme.

Processen derfra er selvforklarende: Vælg dine muligheder, og tryk på bygge ; spillet vil bede dig om et bibliotek at installere i, og vil placere både den eksekverbare og datakatalog der. Disse to filer kan zippes sammen og distribueres (bare sørg for, at du ikke opkræver betaling for et spil, der er bygget i Unity -demoen, da dette overtræder servicevilkårene).

10. Afsluttende noter

Som med ethvert spiludviklingsværktøj er nøglen til succes med Unity iterativ udvikling. Du skal bygge i overskuelige trin - være ambitiøs på alle måder, men vær ambitiøs i små bidder og ordne disse bidder, så selvom du ikke opfylder din ultimative ambition, vil du i det mindste ende med en sammenhængende produkt.

Få de mest afgørende elementer i først: har en idé i tankerne om din minimum levedygtigt produkt , den enkleste, mest bare-bone ting, du muligvis kunne oprette og stadig føle, at du havde opnået noget værd. Kom til det minimale levedygtige projekt, før du går videre til større ambitioner.

Denne vejledning giver dig et stærkt startsted, men den bedste måde at lære enhed er ved at bygge et spil. Start med at bygge et spil, udfyld huller i din viden, når de kommer op, og den gradvise videnstrøm vil slette de ting, du ikke ved overraskende hurtigt, væk.

Hvis du har læst alt dette og er lidt overvældet af den kodning, der kræves med Unity, skal du tjekke, hvordan du gør det lær spiludvikling med Unity Learn og læs også vores guide til, hvordan man laver videospil uden programmering.

Enhed er et kraftfuldt værktøj, og med lidt efterforskning kan du bygge imponerende projekter hurtigere, end du måske forventer. Fortæl os, hvad du har bygget i kommentarerne herunder - vi vil meget gerne se det!

Del Del Tweet E -mail 3 måder at kontrollere, om en e -mail er ægte eller falsk

Hvis du har modtaget en e -mail, der ser lidt tvivlsom ud, er det altid bedst at kontrollere dens ægthed. Her er tre måder at se, om en e -mail er ægte.

Læs Næste
Relaterede emner
  • Programmering
  • Programmering
  • Lang form
  • Longform Guide
Om forfatteren Andre Infante(131 artikler udgivet)

Andre, der er forfatter og journalist baseret i sydvest, vil garanteret forblive funktionel op til 50 grader Celcius og er vandtæt til en dybde på tolv fod.

Mere fra Andre Infante

Abonner på vores nyhedsbrev

Tilmeld dig vores nyhedsbrev for at få tekniske tips, anmeldelser, gratis e -bøger og eksklusive tilbud!

Klik her for at abonnere