Hur man kodar en fysikbaserad karaktärskontroller i Unity3D

Hur man kodar en fysikbaserad karaktärskontroller i Unity3D
Läsare som du hjälper till att stödja MUO. När du gör ett köp med hjälp av länkar på vår webbplats kan vi tjäna en affiliate-provision. Läs mer.

En karaktärskontroller kan hjälpa dig att implementera enkel rörelsefysik i ditt spel.





Du kan närma dig Unity3D karaktärskontroller från flera vinklar. Om du använder ett bibliotek med kraftfulla klasser och funktioner kan skapa en fysikbaserad karaktärskontroller vara ett roligt ställe att börja din spelutveckling.





Steg 1: Skapa en scen med spelare och terrängobjekt

  enhet karaktärskontroller 3d utrymme

När Unity är öppen och du har skapat ett nytt projekt kan du börja med att lägga till ett par objekt till din scen. Du kan skapa dessa objekt i vilken ordning du vill, men var noga med att se till att du använder rätt inställningar. Även om det här projektet är grundläggande, är det ett bra sätt att komma igång med Unity .





Ett 3D-planobjekt för terräng

Det första objektet att lägga till din scen är ett plan. Högerklicka inuti hierarkirutan, håll muspekaren över 3D-objekt och välj Plan från listan. Du kan justera storleken på planet för att ge ett större testområde, men du behöver inte göra något mer åt det.

En kubobjektspelaremodell

Därefter är det dags att lägga till en kub till scenen för att fungera som en spelarmodell. Högerklicka inuti hierarkirutan, håll muspekaren över 3D-objekt och välj Kub från rullgardinsmenyn. Placera den nya kuben så att den sitter ovanför planet du också har lagt till. Du måste också lägga till en rigidbody-komponent för att göra kuben till ett fysikobjekt.



Välj kuben och gå till Inspektören. Klicka på Lägg till komponent längst ned i rutan, sök efter rigidbody och välj Stelkropp från listan när den dyker upp. Kryssa för Använd Gravity kryssa i rutan och lämna resten av inställningarna som de är.

Du kan hitta gratis Unity-tillgångar online för att piffa upp ditt projekt.





En tredjepersonskamera

Din scen borde redan ha en kamera som du kan använda som din tredjepersonskamera. Placera kameran så att den sitter i en bekväm tredjepersonsposition ovanför din kub. Gå till hierarkirutan innan du drar och släpper kameran på kuben för att skapa en förälder-barn-relation. Kameran kommer automatiskt att följa din kub när detta är gjort.

Ett snabbt test

Även om din scen inte har någon kod ännu, kan du testa det arbete du har gjort hittills. Klicka på Spela knappen längst upp på skärmen för att ladda ditt spel. Du bör se kuben falla och landa ovanpå planet, och kameran ska följa kuben när den faller.





Steg 2: Konfigurera en C#-fil

Nu är det dags att skapa en C#-fil så att du kan börja programmera någon rörelse. Gå till avsnittet Projekt, högerklicka, håll muspekaren över Skapa och välj Mapp från listan. Namnge mappen Scripts eller något liknande.

Navigera i din nya mapp och upprepa processen, men välj C# Script från listan. Du kan ge den här filen vilket namn som helst, men detta kommer också att vara namnet på huvudfunktionen i den. Se till att ditt nya C# ser ut så här.

 using System.Collections; 
using System.Collections.Generic;
using UnityEngine;

public class Character_Control: MonoBehaviour {
    void Start() {
    }

    void Update() {
    }
}

Steg 3: Använd C# för att skapa rörelser framåt och bakåt med hastighet

Innan du lägger till funktionerna i din skriptfil, deklarera några offentliga variabler. Först ut är en Rigidbody för att lagra spelarmodellen. Deklarera också en flöte för att hålla koll på rörelsehastigheten. Dessa variabler går i huvudklassen, utanför alla funktioner.

 public Rigidbody rigidbody; 
public float speed;

Därefter är det dags att lägga till en enda kodrad till Start-funktionen. Detta använder en GetComponent-deklaration för att tilldela kubens rigidbody-komponent till rigidbody-variabeln du skapade.

 void Start() { 
    rigidbody = GetComponent < Rigidbody > ();
}

Nu kan du lägga till lite kod som får din spelarmodell i rörelse. Denna kod är trevlig och enkel; du behöver bara två if-satser, ett för framåtrörelse och ett för att gå bakåt. Du kan använda Input.GetKey för att avgöra när en tangent trycks ned. I det här fallet letar du efter tryck på tangenterna W och S.

Att trycka på någon av dessa tangenter lägger till en kraft till kubens rigidbody med rigidbody.AddForce. Du kan beräkna riktningen och hastigheten för den adderade kraften genom att multiplicera dess Z-axelposition (transform.forward) med hastighetsvariabeln. Det finns ingen transform.backward-klass för dig att använda för bakåtrörelse, men detta kan uppnås genom att multiplicera transform.forward med -1.

 if (Input.GetKey("w")) { 
    rigidbody.AddForce(transform.forward * speed);
}

if (Input.GetKey("s")) {
    rigidbody.AddForce((transform.forward * -1) * speed);
}

Spara C#-filen och navigera tillbaka till Unity. Hitta skriptet i projektrutan och dra och släpp det på teckenmodellen Cube i hierarkin för att tilldela skriptet till det objektet. När du väljer kuben bör du se skriptet som en komponent i inspektörsrutan. Klicka inuti variabelrutan för rigidbody och välj din kubs rigidbody.

Du kan nu använda Play-knappen för att starta spelet och testa din kod. Men vänta! Det finns ett problem; din kub kommer att rulla i stället för att gå rakt fram. Gå tillbaka till kubens inspektör, hitta Rigidbody-komponenten och kryssa i rutorna till Freeze Rotation på X- och Z-axeln innan du startar spelet igen. Nu borde det fungera.

Steg 4: Använd C# för att skapa vänster- och högersvängning med vridmoment

Till skillnad från att röra sig bakåt och framåt kräver det en kraft som kallas vridmoment för att vrida din Cube-spelare. Du behöver en annan variabel för detta: en publik float för att tilldela ett vridmomentvärde.

 public float torque;

Koden för att svänga vänster och höger i det här skriptet är mycket lik den som används för att flytta framåt och bakåt också. Det är en om uttalande för varje riktning som letar efter tryck på antingen D-tangenten (högersväng) eller A-tangenten (vänstersväng).

Det första steget i varje if-sats är att bestämma riktningen för svängen med hjälp av metoden Input.GetAxis och tilldela resultatet till en flytvariabel. Efter detta, använd rigidbody.AddTorque för att applicera rotationskraft på kubkaraktärsmodellen genom att multiplicera kubens vridmoment, vridning och Z-axel.

 if (Input.GetKey("d")) { 
    float turn = Input.GetAxis("Horizontal");
    rigidbody.AddTorque(transform.up * torque * turn);
}

if (Input.GetKey("a")) {
    float turn = Input.GetAxis("Horizontal");
    rigidbody.AddTorque(transform.up * torque * turn);
}

Spara din kod och gå tillbaka till Unity för att testa den. Du kan justera hastigheten och upprampningstiden för din spelarmodells rotation genom att välja kuben och redigera den stela kroppens massa-, drag- och vridmomentvariabler i ditt skript. Detta exempelprojekt avgör 1 massa, 1 drag och 2 vridmoment.

Steg 5: Använd C# för att programmera hoppning

Som det sista elementet i denna Unity-karaktärkontroller är det dags att skapa ditt hopp. Att skapa ett hopp är mer komplext än de andra grundläggande kontrollerna du har arbetat med, med tanke på att ett hopp måste ha en begränsad höjd. Börja med att lägga till en privat boolesk variabel för att spåra om spelaren hoppar eller inte.

 private bool isJumping = false;

Denna variabel kommer inte att göra någonting utan ett uttalande för att testa den. I det här fallet kommer en grundläggande if-sats för att kontrollera om variabeln är falsk göra susen. Att lägga till samma villkor till den andra rörelsen om uttalanden kommer att stoppa spelaren från att röra sig under hopp.

 if (!isJumping) { 
}

Att lägga till samma villkor till den andra rörelsen om uttalanden kommer att stoppa spelaren från att röra sig under hopp.

 if (Input.GetKey("w") && !isJumping) { 
    rigidbody.AddForce(transform.forward * speed);
}

Inom !isJumping if-satsen behöver du en annan if-sats, denna gång för att leta efter en knapptryckning på hoppknappen. Att ställa in isJumping-variabeln till true är det första du ska göra i denna if-sats, följt av att göra en rigidbody.angularVelocity-deklaration för att ta bort de krafter som för närvarande appliceras på kuben.

bärbar dator laddas inte när den är inkopplad

Nu kan du använda rigidbody.AddForce-deklarationen för att lägga till kraft till kuben på dess Z-axel, vilket skapar den uppåtgående rörelsen av ett hopp. Slutligen är det dags att använda en anropsdeklaration för att anropa en annan funktion efter 0,8 sekunder.

 if (!isJumping) { 
    if (Input.GetKeyDown("space")) {
        isJumping = true;
        rigidbody.AddForce(transform.up * speed * 120);
        rigidbody.angularVelocity = Vector3.zero;
        Invoke("Move_Setter", 0.8 f);
    }
}

Den här funktionen ställer tillbaka variabeln isJumping till false så att rörelse/hoppning är möjlig igen, och fördröjningen på 0,8 sekunder stoppar den från att triggas för tidigt.

 void Move_Setter() { 
    isJumping = false;
}

Steg 6: Testa din teckenkontrollerkod

Spara din fil och gå tillbaka till Unity för att testa koden du har skrivit. Som de flesta kompilatorer ger Unity information om fel och andra problem med din kod för att göra det lättare att se vad du kan behöva ändra. Du kan se hela koden för detta projekt på vår GitHub sida.

Skapa Unity Character Controllers

Du kan välja mellan en mängd olika tillvägagångssätt när du skapar en karaktärskontroller i Unity. Att använda fysik är ett alternativ, men du kan också använda det inbyggda karaktärskontrollsystemet om du vill.

Att utforska olika alternativ som detta är ett bra sätt att lära sig om verktyg som Unity.