Programmera ett spel med enhet: En nybörjarguide

Programmera ett spel med enhet: En nybörjarguide
Den här guiden finns att ladda ner som en gratis PDF. Ladda ner den här filen nu . Kopiera gärna och dela detta med dina vänner och familj.

Ett överraskande inslag i internetekonomin är ökningen av indiespel. När den exklusiva domänen för triple-A-studior med tusenman, flera miljoner dollar har ett antal verktygssatser utvecklats som ger moderna spelutvecklingsresurser i händerna på individer eller små ad-hoc-samlingar av programmerare och designers. Vi har tidigare diskuterat de bästa indiespelen, så se till att kolla in dem för lite inspiration om vad som kan uppnås med verktyg som Unity.





Dessa indie-spelutvecklingsteam har visat en smidighet och risktolerans som i många fall tillåter dem att driva spelinnovation snabbare än sina stora budgetmotståndare. Ett antal chockerande framgångsrika indietitlar har premiär de senaste åren, inklusive Minecraft , Limbo , och Super kött pojke , och även om du inte behöver färdigheter för att göra spel som detta, kan du göra ett spel med Buildbox.





I det snabbt utvecklande landskapet för indiespelutveckling, Enhet har framstått som något av en de facto-standard: dess låga kostnad, användarvänlighet och breda funktionsuppsättning gör den idealisk för snabb spelutveckling. Enhet är så flexibel att du kan till och med gör dina egna anpassade spelkontroller med lite DIY vet hur!





Även stora studior som CCP (Developers of Eve Online ) använda den för snabbt prototyperande spelkoncept. Unity tillhandahåller en 'spelmotor i en låda' - en fysik- och återgivningsmotor med krokar för flera skriptspråk, anpassningsbar till praktiskt taget alla genrer av videospel.

Även om Unity tillhandahåller en visuell redigerare för att manipulera spelmiljön, är Unity inte ett verktyg för att skapa spel för noll programmering. Det kräver att du programmerar för att producera resultat, men ger dig också ett mycket mer flexibelt och kraftfullt verktyg än något 'game maker' -program möjligen skulle kunna.



Enhet kommer inte att göra jobbet åt dig, men det sänker inträdesbarriären avsevärt. Börjar helt från början med C ++ och OpenGL, det kan ta dagar att komma till den punkt där det faktiskt finns något som återges på skärmen. Med Unity tar det ungefär tio sekunder. Unity lägger grundelementen i spelskapande i händerna på nybörjare på ett snabbt, intuitivt sätt.

Idag guidar jag dig genom allt du behöver veta för att göra ett spel i Unity, som är uppdelat i tio huvudkapitel:





§1 – Versioner av enhet

§2 – Installera enhet





§3 – En kort introduktion till det objektorienterade paradigmet

§4 – Enhetens grunder

§5 – Exempel: Grundläggande element i ett spel

§6 – Skript i enhet

§7 – Exempel: Scripting Pong

§8 – Utforska dokumentationen / lära sig mer

§9 – Bygga ditt spel / kompilera till en fristående applikation

§10-Avslutande anteckningar

1. Versioner av enhet

Enhet finns i två grundläggande smaker: pro -versionen och gratisversionen. Det är en antal skillnader , men i stort sett stöder pro-versionen ett antal visuella förbättringar (som mjuka skuggor i realtid och efterbehandling) och ett stort antal relativt mindre funktioner som är extremt hjälpsamma för mer komplexa spel.

Som sagt, för de flesta relativt enkla spel du kanske vill bygga är gratisversionen av Unity helt tillräcklig. Vi kommer att bryta ner de viktigaste skillnaderna nedan mer detaljerat för dem som är intresserade.

1.1 Prissättning

Den kostnadsfria versionen av Unity är naturligtvis gratis. Det finns dock några begränsningar: gratisversionen av Unity kan inte licensieras till något företag med en årsinkomst på mer än $ 100.000 . Även om sådana organisationer ligger utanför räckvidden för den här guiden, om du misstänker att du kan bli en sådan organisation, är det förmodligen klokt att springa till Pro -versionen.

Pro -versionen av Unity är $ 75 en månad, eller $ 1500 för en permanent licens, och har inga gränser för vad du kan göra med spelen som skapats med den. Det finns också en 30-dagars gratis provperiod som vi kommer att använda för den här guiden för att ge dig en så komplett överblick över tillgängliga funktioner som möjligt. En ettårig studentlicens är också tillgänglig via Studie för $ 129 .

1.2 Funktioner

Det finns många funktioner som saknas i gratisversionen av Unity. De viktigaste skillnaderna är dock följande: den fria versionen av Unity saknar ett antal återgivningsalternativ som möjliggör snyggare, snabbare spel (LOD-stöd, skärmutrymme efterbehandling, avancerade shaders, realtidsmjuka skuggor och uppskjuten återgivning). Det saknar också det fulla mekanim animationssystem och några AI -verktyg.

I allmänhet, för komplexa, storskaliga projekt eller projekt där grafisk prestanda är viktig, är proversionen värd. Jag använder pro-versionen, eftersom jag utvecklar virtual reality-spel för Oculus Rift, och stöd för skärmutrymme efter bearbetning är nödvändigt för att interagera korrekt med headsetet.

2. Installera Unity

Enhet är enkel att installera. Du kan ladda ner den körbara filen från unity3d.com/get-unity/download .

När du har laddat ner, kör det och följ sedan installationsanvisningarna. När installationen är klar visas ett fönster med titeln 'aktivera din Unity -licens'. Markera rutan 'aktivera en gratis 30-dagars testversion av Unity Pro' och sedan 'OK'.

Grattis! Du har nu en 30-dagars provversion av Unity Pro. När testperioden löper ut, om du inte vill köpa proversionen, kan du byta till gratisversionen och behålla ditt befintliga innehåll.

vilken typ av skruvmejsel till ps4

3. En kort introduktion till det objektorienterade paradigmet

Innan vi börjar med Unity är det viktigt att vi går igenom grunderna lite. Enhet stöder båda C # och JavaScript för spelprogrammering ; vi kommer att arbeta med C# för denna handledning.

För det första, om du aldrig har programmerat tidigare, lägg den här självstudien åt sidan och tillbringa några dagar med att arbeta genom Microsofts C # Language Primer tills du känner dig bekväm med att använda språket för enkla uppgifter.

Om du vill ha något som är lite annorlunda än C# (men inte nödvändigtvis ett språk du kan använda i Unity), ta en titt på vår guide till de sex enklaste programmeringsspråken för nybörjare.

Om du tidigare har programmerat på ett imperativt eller objektorienterat språk som C eller Java, skumma in primern och bekanta dig med hur C# skiljer sig från andra språk du har använt tidigare. Hur som helst, fortsätt inte med handledningen förrän du känner dig bekväm med att lösa enkla problem med C# (till exempel, om jag skulle be dig skriva ett program som skriver ut de första hundra primtalen, borde du kunna skriva det programmet utan konsultera Google).

Det viktigaste begreppet att förstå här är det objektorienterade paradigmet (förkortat som ÖPPEN ). I objektorienterade språk är program uppdelade i funktionella enheter som kallas Objekt . Varje objekt har sina egna privata variabler och funktioner. Objektspecifika funktioner kallas metoder .

Tanken här är modularitet: genom att ha varje objekt isolerat och tvinga andra objekt att interagera med det genom dess metoder kan du minska antalet möjliga oavsiktliga interaktioner - och, i förlängning, buggar. Du kan också skapa objekt som du kan återanvända senare utan ändringar. I Unity kommer du att bygga dessa objekt och fästa dem på spel enheter (vars beteende de kommer att styra).

Objekt instanseras från klasser : en klass är bara en fil som beskriver definitionen av ditt objekt. Så, om du vill ha en mook objekt som hanterar AI för en fiende i ditt spel, skulle du skriva en 'Mook' -klass och sedan bifoga den filen till varje fiendens enhet. När du kör ditt spel kommer varje fiende att utrustas med en kopia av 'Mook' -objektet.

Att bifoga ett nytt skript till ett objekt ser ut så här:

Först, markera objektet och gå till Inspektör . Klicka på Lägg till komponent knapp.

Gå till nytt manus , ange det namn du vill ha och klicka på skapa och lägga till .

Nu har du ett nytt skript som du kan redigera genom att dubbelklicka på det!

En klassfil ser ungefär ut så här:

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

Låt oss bryta ner det här:

  • Använda UnityEngine: Den här raden berättar för C# att vi vill använda Unitys bibliotek, som gör att vi kan ansluta till Unity -spelmotorn.
  • Public class Mook: MonoBehaviour: Denna rad deklarerar klassen och dess namn - mook .
  • Privat flottörhälsa: Detta deklarerar en privat klassvariabel (som bara kan ändras inifrån klassen). Variabeln ges ett värde i Start .
  • Ogiltig start (): Detta förklarar en metod som kallas Start . Start är en speciell metod som bara körs en gång när spelet startas.
  • Ogiltig uppdatering (): Uppdatering är en annan speciell metod som körs på varje bildruta. Det mesta av din spellogik går här.
  • // om du stöter på spelaren på vägen, döda honom: Den här raden är en kommentar (alla rader som börjar med ett snedstreck ignoreras av C#). Kommentarer används för att påminna dig själv om vad vissa bitar av kod gör. I det här fallet används denna kommentar för att stå för ett mer komplicerat kodblock som faktiskt gör vad kommentaren beskriver.

Tillsammans med Start och Uppdatering , du kan instansera dina egna metoder med nästan vilket namn som helst. Men metoder som du skapar körs inte om de inte kallas. Låt oss förklara en metod för en hypotetisk klass som kallas addTwoNumbers som lägger ihop två nummer:

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

Detta förklarar en offentlig (tillgänglig för andra objekt) metod som returnerar en flottör, kallad addTwoNumbers , som tar två flottörer som ingång (kallas till och b ). Den returnerar sedan summan av de två värdena som dess utgång.

Kallar denna metod från samma klass (säg, inifrån Uppdatering ) ser ut så här:

float result = addTwoNumbers(1, 2);

Att ringa metoden från en annan klass är liknande:

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

Återigen skapar detta bara en instans av vår klass, får tillgång till lämplig metod och matar den siffrorna vi vill lägga till och lagrar sedan resultatet i resultat . Enkel.

Om ditt skript är kopplat till ett objekt som har speciella egenskaper (som en partikelemitter) som inte kan nås under den normala uppsättningen GameObject -parametrar, kan du välja att behandla det som en annan typ av spelentitet med hjälp av GetComponent metod.

Syntaxen för det ser ut så här:

GetComponent().Play();

Om något av detta är okänt för dig, gå tillbaka och gå igenom C# -färgen. Det kommer att spara dig mycket frustration när vi fortsätter.

4. Enhetens grunder

I det här avsnittet kommer vi att arbeta oss igenom de grundläggande mekanikerna i Unity -motorn. Arbetsflödet i Unity går ungefär så här:

  1. Skapa en enhet för att spela en roll i spelet (blank GameObjects kan användas för abstrakta logiska uppgifter).
  2. Skriv eller hitta en klassfil och lägg till den i enheten som ett skript (med Lägg till komponent knappen i inspektör se.
  3. Springa > testa > felsöka > upprepa tills det fungerar och gå vidare till nästa element i spelet.

Enhet levereras med ett antal grundläggande vyflikar som kan läggas ut på olika sätt efter användarens smak. De fem stora är:

  1. Spel: visar en löpande instans av spelet som du kan interagera med och testa.
  2. Scen: ger en statisk, redigerbar version av spelvärld .
  3. Inspektör: låter dig ändra enskilda enheter i spelvärlden genom att välja dem i redaktör flik.
  4. Projekt: låter dig bläddra igenom projektets filer och dra modeller, material och andra resurser till redaktör flik för att placera dem i spelvärlden.
  5. Hierarki: denna flik visar alla objekt i världen, så att du kan hitta avlägsna objekt i scenen och överordnade enheter till varandra genom att klicka och dra.

Se diagrammet nedan för alla dessa saker:

4.1 Enhetsenheter

4.1.1 Mesh

Mesh är vägen 3D -geometri representeras i Enhet. Du kan antingen använda Unitys inbyggda primitiv objekt (kuber, sfärer, cylindrar, etc), eller importera dina egna 3D -modeller från ett modelleringspaket som Blandare eller Maya . Unity stöder en mängd olika 3D -format, inklusive .fbx , och .3ds .

De grundläggande verktygen för att manipulera maskor är skalning, rotation och översättningsknappar i det övre vänstra hörnet av gränssnittet. Dessa knappar lägger till kontrollikoner i modellerna i redigeringsvyn, som sedan kan användas för att manipulera dem i rymden. Om du vill ändra textur eller fysikegenskaper för ett objekt markerar du dem och använder inspektör vy för att analysera material och styv kropp element.

4.1.2 GUI -element

Traditionella GUI -sprites och text kan visas med GUI -text och den GUI -textur GameObjects i redigeraren. Ett mer robust och realistiskt sätt att hantera UI -element är dock att använda 3D -text och Quad GameObjects (med transparenta texturer och en obelyst transparent shader) för att placera HUD -element i spelvärlden som enheter.

I hierarki kan du dra dessa spelelement till huvudkameran för att göra dem till barn och se till att de rör sig och roterar med kameran.

GUI -element (text och texturer) kan justeras i storlek och skala med hjälp av relevanta fält på fliken Inspektör.

4.1.3 Material

Material är en kombination av texturer och skuggor och kan dras direkt till spelobjekt från projektfliken. Ett stort antal shaders levereras med Unity Pro, och du kan justera strukturen som är kopplad till dem med hjälp av fliken inspektör för ett objekt som de appliceras på.

Om du vill importera en textur konverterar du den till en .jpg , .png , eller .bmp och dra den in i tillgångar mapp under Unity -projektkatalogen (som visas i Mina dokument som standard). Efter några sekunder visas ett laddningsfält i redigeraren. När den är klar kan du hitta bilden som en textur under projekt flik.

4.1.5 Ljus

Ljus är GameObjects som strålar ut i världen. Om det inte finns några lampor i din scen ritas alla polygoner med samma ljusstyrka, vilket ger världen ett platt, uttvättat utseende.

Ljus kan placeras, roteras och ha flera interna egenskaper som du kan anpassa. De intensitet reglaget styr ljusets ljusstyrka och räckvidd styr hur snabbt det bleknar.

Riktlinjerna i scenvy visar det maximala belysningsområdet. Spela med båda inställningarna för att uppnå önskad effekt. Du kan också justera ljusets färg, mönstret ( kaka visas på ytan som ljuset riktas mot, och vilken typ av bloss som visas på skärmen när man tittar direkt på ljuset. Cookien kan användas för att förfalska mer realistiska ljusmönster, skapa dramatiska falska skuggor och simulera projektorer.

De tre huvudtyperna av ljus är fläck , punkt , och riktad .

Spotljus ha en plats i 3D -utrymme och projicera ljus endast i en riktning i en kon med variabel vinkel. Dessa är bra för ficklampor, söklampor och ger dig i allmänhet mer exakt kontroll över belysningen. Spotljus kan kasta skuggor.

Peklampor har en plats i 3D -utrymme och kastar ljus jämnt i alla riktningar. Punktljus kastar inte skuggor.

Riktningsbelysning äntligen används för att simulera solljus: de projicerar ljus i en riktning som från oändligt långt borta. Riktningsljus påverkar varje objekt i scenen och kan producera skuggor.

4.1.6 Partikelsystem

TILL Partikelsystem är en GameObject som genererar och kontrollerar hundratals eller tusentals partiklar samtidigt. Partiklar är små, optimerade 2D -objekt som visas i 3D -utrymme. Partikelsystem använder förenklad återgivning och fysik, men kan visa tusentals enheter i realtid utan stamning, vilket gör dem idealiska för rök, eld, regn, gnistor, magiska effekter och mer.

Det finns många parametrar som du kan justera för att uppnå dessa effekter, och du kan komma åt dem genom att leka ett partikelsystem under komponentredigerare > välja partikelsystemet > öppnar fliken inspektör . Du kan ändra storlek, hastighet, riktning, rotation, färg och struktur för varje partikel och ställa in de flesta av dessa parametrar för att också förändras över tid.

Under kollision attribut, om du aktiverar det och ställer in simuleringsutrymmet till värld du får partiklar som kommer att kollidera med föremål i världen, som kan användas för ett antal realistiska partikeleffekter, inklusive regn, rörligt vatten och gnistor.

5. Exempel: Grundläggande element i ett spel

För denna handledning kommer vi att göra ett enkelt spel av Pong - något som vi har täckt flera gånger i DIY tidigare:

  • Arduino Classic Pong
  • Arduino OLED Pong

I det här avsnittet går vi över att ordna kärnelementen - skriptstudien kommer senare.

Låt oss först dela upp Pong -spelet i dess grundläggande komponenter. Först behöver vi två paddlar och en boll. Bollen flyger utanför skärmen, så vi vill ha en mekanism för att återställa den. Vi vill också att texten ska visa den aktuella poängen, och för att visa dig alla kärnelementen i Unity vill vi ha en fin partikeleffekt när du slår bollen. Hela spelet måste lysa dramatiskt.

Det går sönder i ett bollobjekt (en sfär), a spawner , två paddelrekvisita med partikelavgivare bifogad, a 3D-text-enhet , och a strålkastarljus . För denna handledning kommer vi att använda det fysiska standardmaterialet studsa , med studsmaskin satt till multiplicera . Så här ser installationen ut på tio skärmdumpar:

Skapa först en kubstöd för paddeln.

Skala det på lämpligt sätt, kopiera det , och sätt en sfär mellan paddlarna för bollen.

Skapa sedan en 3DText -objekt och skala och placera det korrekt, ändra textstorlek attribut för att få en mindre pixelerad bild.

Skapa sedan två partikelsystem , välj de egenskaper du vill ha och fäst dem på paddlarna.

Därefter vill du position och vrid kameran så att det ramar in scenen korrekt. Medan kameran är vald kan du se en liten förhandsvisning av kamerans vy i nedre högra hörnet.

Innan vi avslutar måste vi skapa ytterligare två kuber för att vara stötfångare för att förhindra att bollen studsar ut ur spelområdet. Vi kan göra dem osynliga genom att avmarkera mesh renderer i fliken inspektör .

Om du slår play kan du nu se de grundläggande elementen i vårt spel. De kommer inte att göra någonting än, men vi kommer till det!

Nu när vi har den inställningen kommer vi att prata om vad som ingår i att skripta dessa element för att skapa ett spel.

6. Scripting i enhet

När du har ett skript bifogat ett objekt kan du ändra det genom att dubbelklicka på det i inspektör . Detta öppnar MonoDevelop , standardutvecklingsmiljön för Unity. I huvudsak är Monodevelop en textredigerare med funktioner specifikt optimerade för programmering.

Nyckelord och kommentarer markeras i blå och grön och numeriska värden och strängar visas i netto . Om du har använt Förmörkelse eller andra IDE: er, MonoDevelop är väldigt lika. Du kan bygga dina skript inifrån redigeraren, för att leta efter syntaxfel, så här:

I allmänhet måste du referera till element som objektet som innehåller skriptet har för att få ditt skript att interagera med Unity (du kan se en lista över dessa element under inspektör fliken när det relevanta objektet är markerat). Du kan sedan anropa metoder eller ställa in variabler för vart och ett av dessa element för att genomföra de ändringar du vill ha.

Om du vill att ett skript på ett objekt ska påverka egenskaperna hos ett annat objekt kan du skapa ett tomt GameObject variabel i ditt skript och använd inspektör att tilldela det till ett annat objekt i scenen.

En lista över elementen ett objekt kan ha är följande (hämtat från inspektörsvyen av en av våra paddlar i exemplet ovan):

  1. Omvandla
  2. Kub (nätfilter)
  3. Box Collider
  4. Mesh Renderer

Var och en av dessa aspekter av objektet kan påverkas inifrån ett manus. Därefter ska vi titta på exakt hur.

6.1 Transform

Transformfunktionerna för ett GameObject i Unity styr de fysiska parametrarna för objektet: its skala , dess placera , och dess orientering . Du kan komma åt dem från ett skript så här:

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

I exemplen ovan är de namngivna variablerna av de typer som anges i namnen. Det finns några viktiga detaljer här: position och skala lagras, som du kan förvänta dig, som Vector3s . Du kan komma åt X , OCH , och MED komponenter i varje (t.ex. transform.position.y ger dig avståndet för ett objekt över nollplanet).

Men för att undvika gimbal lås rotationer hanteras som Kvarternioner (fyrkomponentvektorer). Eftersom handmanipulerande kvaternioner är ointuitiva kan du manipulera rotationer med hjälp av euleriska vinklar med hjälp av Quaternion.Euler metod så här:

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

Om du vill flytta objekt smidigt från en plats till en annan hittar du Slerp metod för kvaternioner och vector3s till hjälp. Slerp tar in tre argument - det nuvarande tillståndet, det slutliga tillståndet och förändringens hastighet och interpolerar smidigt mellan dem vid den angivna hastigheten. Syntaxen ser ut så här:

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

6.2 Renderer

Renderingsfunktionerna i Unity låter dig styra hur rekvisitornas ytor återges på skärmen. Du kan tilldela texturen igen, ändra färg och ändra skuggning och synlighet av objektet. Syntaxen ser ut så här:

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

De flesta av dessa har ganska tydliga funktioner. Det första exemplet gör objektet i fråga osynlig: ett användbart trick i ett antal situationer. Det andra exemplet tilldelar ett nytt RGB -färg (nämligen grönt) till objektet i fråga. Den tredje tilldelar den diffusa huvudstrukturen till en ny Texture -variabel. Det sista exemplet ändrar skuggning av objektets material till en nydefinierad skuggvariabel.

6.3 Fysik

Enhet levereras med en integrerad fysikmotor - något som fysik sandlådespel alla använder. Detta låter dig tilldela objektens fysiska egenskaper och låta detaljerna i deras simulering hanteras åt dig. I allmänhet är det enklare och mer robust att använda Unitys fysikmotor i största möjliga utsträckning än att försöka implementera din egen fysik med hjälp av en lärobok och transformationssystemet.

Alla fysikrekvisita kräver kolliderare . Själva själva simuleringen hanteras dock av a styv kropp , som kan läggas till i inspektör se. Stela kroppar kan vara kinematisk eller icke -kinematisk .

Kinematisk fysik rekvisita kolliderar med (och effekt) icke -kinematiska fysik rekvisita runt dem, men påverkas inte av kollisionen själva. Statiska kinematiska rekvisita är de ordspråkliga orörliga föremålen och rörliga kinematiska objekt är den ordspråkliga ostoppbara kraften (för rekordet, när de kolliderar passerar de helt enkelt genom varandra).

Utöver det kan du justera objektets vinkelmotstånd (hur mycket energi det tar att snurra det), ändra dess massa, diktera om det påverkas av gravitationen eller inte och applicera krafter på det.

Exempel:

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

Dessa är alla ganska självförklarande. Det enda att notera här är användningen av förvandla. framåt . Vector3 har alla tre komponenter ( .fram , .upp , och .höger ) associerade med dem, som kan nås och roteras med dem ( fram- är riktningen för den blå pilen i redigeraren). De förvandla. framåt nyckelordet är helt enkelt framåtvektorn för det aktuella objektet med storlek 1. Det kan multipliceras med en flottör för att skapa mer kraft på objektet. Du kan också referera transform.up och förvandla. rätt och förneka dem för att få sina vändningar.

6.4 Kollision

Ofta när du bygger ett spel vill du att en kollision ska resultera i en förändring av tillståndet i din kod, utöver bara fysiksimulering. För detta behöver du en kollisionsdetekteringsmetod .

Det krävs en viss förberedelse för att upptäcka kollisioner i Unity. För det första behöver minst ett av föremålen i kollisionen a icke-kinematisk styv kropp fäst vid den. Båda objekten måste ha korrekta kolliderare, inställda på att vara icke-triggers. Den totala hastigheten för båda objekten måste vara tillräckligt låg för att de faktiskt ska kollidera, istället för att helt enkelt hoppa igenom varandra.

Om du har allt du har tagit hand om kan du kontrollera kollisionen genom att placera en speciell metod för kollisionsdetektering i ett skript som bifogas objektet du vill kontrollera kollision med. Metoden kommer att se ut så här:

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

Denna metod körs automatiskt under den första ramen som ett annat objekt vidrör ditt objekt. Kollisionsenheten Övrig är en referens till objektet som du träffar. Du kan till exempel referera till dess spelobjekt , styv kropp , och omvandla egenskaper för att manipulera det på olika sätt. Medan OnCollisionEnter är förmodligen den vanligaste funktionen du kommer att använda, kan du också använda OnCollisionExit och OnCollisionStay (med i övrigt identisk syntax och användning), som aktiverar under den första ramen att du slutar kollidera med ett objekt respektive under varje ram som du kolliderar med ett objekt.

Ibland kan det också vara användbart att göra det som kallas raycasting . I raycasting är en oändligt tunn linje (a stråle ) kastas genom världen från något ursprung, längs någon vektor, och, när det träffar något, returneras positionen och andra detaljer för den första kollisionen. Koden för en raycast ser ut så här:

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

Detta kastar en stråle från positionen för det aktuella objektet längs -Vector3.up (rakt ner) och länkar variabeln träffa till det första föremålet som det krockar med. När din stråle har träffat något kan du komma åt hit.distance för att avgöra hur långt bort det är, eller hit.GameObject för att manipulera objektet du träffar.

Raycasts som detta kan användas för skyttar för att avgöra vad pistolen pekade på, eller för att välja objekt när kameran tittar på dem, eller för vissa stilar av rörelsemekaniker.

6.5 Tidskorrigering

En viktig faktor att tänka på när du manipulerar objekt på detta sätt har att göra med framerate . Oavsett hur noggrant du optimerar, kommer framerates alltid att variera, och du vill inte att din spelhastighet ska variera därefter. Om någon annan kör ditt spel på en snabbare dator än du utvecklat det på, vill du inte att spelet ska köras med dubbel hastighet.

Sättet du korrigerar för detta är genom att multiplicera de värden du använder med den tid det tog att återge den sista ramen. Detta görs med hjälp av Time.deltaTime . Detta ändrar effektivt hastigheten för alla variabler du ökar varje bildruta från ändra per ram till förändring per sekund , och du bör förmodligen göra den här ändringen till vilket värde du ökar eller minskar varje bildruta.

6.6 Ljudkällor och lyssnare

Nu när vi har täckt hur man skapar, återger och kontrollerar objekt, låt oss prata om den andra känslan som datorspel kan tjäna: nämligen, ljud . Unity stöder två typer av ljud: 2D och 3D ljud. 3D -ljud varierar sin volym baserat på avstånd och förvrängs när de rör sig i förhållande till kameran; 2D -ljud gör det inte.

2D-ljud är lämpliga för voice-overs och bakgrundsmusik, och 3D-ljud gäller ljud som genereras av händelser i världen. För att ändra om ett ljud är 3D eller inte, välj det i projekt visa, växla till inspektör visa och välj lämpligt alternativ på rullgardinsmenyn och tryck sedan på återimportera knapp.

För att faktiskt spela ljudet måste du bifoga en ljudkälla till en rekvisita (den rekvisit du vill att ljudet ska härröra från, i fallet med ett 3D -ljud). Då måste du öppna ljudklipp fältet och välj din ljudfil.

inget ljud på datorn windows 10

Du kan använda myAudioSource.Pause () och myAudioSource.Play () för att styra dessa ljudfiler. Du kan justera falloff -beteenden, volymen och dopplerförskjutningen av ljuden under inspektör fliken för ljudkällan.

6.7 Ingång

Ett spel som inte tar någon input från användaren är inte mycket av ett spel. Det finns många olika typer av input du kan läsa in, och nästan alla är tillgängliga via Inmatning och Nyckelkod objekt. Några exempel på input -satser (som har värden som utvärderas varje ram) är nedan.

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

Funktionerna hos dessa rader är mestadels självförklarande. Med hjälp av dessa tre typer av inmatningsreferenser kan du rekonstruera styrscheman för de flesta moderna 3D -datorspel.

6.8 Felsöka ett skript

Låt oss säga att ett skript inte fungerar. Som den goda läkaren säger, kan det hända dig att det blir smällar och hangups. Om det finns direkta syntaxfel med din C#kommer spelet i allmänhet att vägra att köra när du slår play, och några ganska användbara felmeddelanden tillhandahålls om du bygga skripten inifrån redigeraren. Se nedan:

Dessa buggar är vanligtvis inte de svåraste att åtgärda. Vad som kan vara mer problematiskt är subtila semantiska fel, där du har lyckats skriva en fil full av giltigt C# - bara inte en som gör vad du trodde att den skulle göra. Om du har ett av dessa fel och du har problem med att spåra det finns det några saker du kan försöka förbättra situationen.

Den första är att pausa körningen av spelet och kontrollera konsolen. Du kan pausa spelet genom att klicka på paus ikonen i den övre mitten av redigeraren och sedan välja trösta från botten av fönster meny (eller tryck på Ctrl > Flytta > C ). Även om det inte finns några fel kan varningar fortfarande hjälpa till att ge några ledtrådar om vad som kan gå fel.

Om detta inte fungerar kan du också försöka få en uppfattning om läget för ditt manus genom att skriva ut tillståndet för interna variabler för att bekräfta att programmet gör vad du tror att det gör. Du kan använda Debug.Log (sträng) för att skriva ut innehållet i en sträng till konsolen när programkörningen träffar den raden. I allmänhet, om du arbetar baklänges från vad du tror borde hända genom de saker som borde få det att hända, så småningom kommer du att nå en punkt där dina felsökningsutskrifter inte gör vad du förväntar dig att de ska göra. Det är där ditt fel är.

7. Exempel: Scripting Pong

För att bygga Pong, låt oss bryta ner spelet i dess kärnelement: vi behöver en boll som ricochets fram och tillbaka mellan paddlarna med ökande hastighet, vi behöver en resultattavla som vet när bollarna har passerat paddlarna och vi behöver en mekanism för starta om bollen när det händer. Ett bra första steg skulle vara att lägga till en icke-kinematisk styv kropp till bollen, två kinematiska styva kroppar till paddlarna, inaktivera tyngdkraften för dem alla och tilldela ett lämpligt fysiskt material från standardtillgångarna ( studsa med studsmaskin satt till multiplicera ).

Nedan kan du se manuset för bollen med förklarande kommentarer. Bollen måste uppnå några grundläggande mål: den ska studsa i ett komplicerat mönster, alltid bibehålla rörelse på båda axlarna, och den ska accelerera i en utmanande men inte omöjlig takt i horisontell riktning.

BallHandler.cs

Därefter måste vi skripta vår paddel, som du kan se nedan. Paddeln måste flytta upp och ner som svar på knapptryckningar (men inte utanför vissa gränser). Det måste också trigga partikelsystemet när det kolliderar med något.

PaddleHandler.cs

Därefter behöver vi fiendens AI: något som får fiendens paddel att spåra mot bollen med en fast hastighet. För det kommer vi att använda Vector3.Slerp för maximal enkelhet. Vi skulle också vilja ha samma partikelbeteende som vi ser på vår egen paddel.

EnemyAI.cs

Slutligen behöver vi ett manus för att uppdatera resultattavlan och återställa bollen när den går utanför gränserna.

ScoreboardUpdater.cs

Med dessa skript bifogade och referenserna ifyllda, när vi kör vårt spel Pong, upplever vi spel!

Du kan ladda ner min Pong -demo , om du vill se allt jag har beskrivit i handling. Den körs på Windows-, Mac- och Linux -system.

8. Utforska dokumentationen / lära sig mer

Unity är en komplex motor med många fler funktioner än vad som skulle kunna täckas i en guide i den här stilen, och det är innan du inkluderar den breda delen av (gratis och kommersiella) Unity -tillägg som finns på internet. Denna guide kommer att ge dig en stark utgångspunkt för att utveckla ett spel, men självutbildning är en viktig färdighet i alla strävanden, och dubbelt så här.

En avgörande resurs här är Unity ScriptReference . ScriptReference är en sökbar databas, tillgänglig för både C# och Javascript, som har en lista över alla Unity -kommandon och funktioner, med beskrivningar av deras funktioner och korta exempel på syntax.

Om du har problem med redaktören och gränssnittet för Unity, eller bara gillar videohandledning som en preferensfråga, finns det en lång lista med högkvalitativa Enhetsvideohandledning tillgängliga. Mer omfattande (men mindre brett) textstudier för Unity är också tillgängliga från CatLikeCoding.

Slutligen, om du har frågor som ligger utanför omfattningen av dokumentation eller självstudier kan du ställa specifika frågor på svar.Unity3d.com . Kom ihåg att svar tillhandahålls av volontärer, så respektera deras tid och sök först i databasen för att se till att din fråga inte redan har besvarats.

9. Bygga ditt spel / kompilera till en fristående applikation

När du har byggt något du är stolt över (eller om du är klar med att klona vårt lite tvivelaktiga Pong -exempel för träning) är det dags att flytta ditt spel från redigeraren och göra det till något som du kan lägga ut på internet och tvinga fram dina vänner och familj att spela. För att göra det måste du bygga en fristående applikation. Den goda nyheten är att detta i Unity är väldigt, väldigt enkelt. Det finns dock några potentiella hicka som du vill vara försiktig med.

Till att börja med vet du att du bara kan bygga ett felfritt projekt. För detta ändamål, se till att du har konsolen öppen när du bygger: det finns några felvillkor som spelet kommer att ignorera i redigeraren, men kommer fortfarande att avbryta ett försök att bygga. Detta dumpar bara felmeddelanden till konsolen, utan synliga resultat på skärmen, vilket kan vara frustrerande om du glömmer att kontrollera. När du har fått ditt spel att kompilera felfritt kan du dock välja Skapa inställningar under Fil eller tryck på Ctrl > Flytta

> B . Detta kommer att ta upp en enkel dialog som låter dig bygga ditt spel för flera plattformar.

Processen därifrån är självförklarande: välj dina alternativ och slå bygga ; spelet kommer att be dig om en katalog att installera i och placerar både den körbara och datakatalogen där. Dessa två filer kan zippas ihop och distribueras (se bara till att du inte tar betalt för ett spel som är inbyggt i Unity -demon, eftersom detta bryter mot användarvillkoren).

10. Avslutande anteckningar

Som med alla spelutvecklingsverktyg är nyckeln till framgång med Unity iterativ utveckling. Du måste bygga in hanterbara steg - var ambitiös i alla fall, men var ambitiös i små bitar och ordna dessa bitar så att även om du inte uppfyller din ultimata ambition, kommer du åtminstone att sluta med en sammanhängande produkt.

Få de mest avgörande elementen först: ha en idé i åtanke om din minsta livskraftig produkt , det enklaste, mest nakna som du kan skapa och fortfarande känna att du uppnått något som är värt. Ta dig till det minsta livskraftiga projektet innan du går vidare till större ambitioner.

Denna handledning ger dig en stark utgångspunkt, men det bästa sättet att lära sig enhet är genom att bygga ett spel. Börja bygga ett spel, fyll i luckor i din kunskap när de kommer upp, och det gradvisa kunskapsflödet kommer att urholka bort saker du inte vet förvånansvärt snabbt.

Om du har läst allt detta och är lite överväldigad av kodningen som krävs med Unity, se till att kolla in hur lär dig spelutveckling med Unity Learn och läs också vår guide om hur man gör videospel utan programmering.

Enhet är ett kraftfullt verktyg, och med lite utforskning kan du bygga imponerande projekt snabbare än du kan förvänta dig. Låt oss veta vad du byggde i kommentarerna nedan - vi ser gärna!

Dela med sig Dela med sig Tweet E-post 3 sätt att kontrollera om ett e -postmeddelande är riktigt eller falskt

Om du har fått ett e -postmeddelande som ser lite tveksamt ut är det alltid bäst att kontrollera dess äkthet. Här är tre sätt att se om ett e -postmeddelande är sant.

Läs Nästa
Relaterade ämnen
  • Programmering
  • Programmering
  • Lång form
  • Longform Guide
Om författaren Andre Infante(131 artiklar publicerade)

En författare och journalist baserad i sydväst, Andre kommer garanterat att förbli funktionell upp till 50 grader Celcius och är vattentät till ett djup av tolv fot.

Mer från Andre Infante

Prenumerera på vårt nyhetsbrev

Gå med i vårt nyhetsbrev för tekniska tips, recensioner, gratis e -böcker och exklusiva erbjudanden!

Klicka här för att prenumerera