Unity3D Tredje personkameror

Kameran är en av de viktigaste elementen i ett 3D-spel. Det fungerar som spelarens ögon, så att de ser spelvärlden från olika synvinklar. I Unity3D fungerar en 3D-kamera precis som en filmkamera. Det kan pannas, lutas och zoomas till bildscener. Denna handledning kommer att lära dig hur man skapar flera tredjepersons kameraperspektiv.

För inspiration, eller för att använda en utgångspunkt för ditt eget arbete, ta en titt på några av de mest populära 3D-modellerna på Envato Market. Eller få en en-mot-hjälp genom att välja en av 3D-design och modelleringstjänster på Envato Studio.


Projektinställningar

Vi behöver ett enkelt projekt för att testa våra kameraskript. Vi behöver en scen med ett markplan som har en textur på den. Detta gör det enkelt att se hur varje kamera rör sig och reagerar på spelarens ingångar. När vi är färdiga ska det se ut så här:

Följ dessa steg för att ställa in projektet:

  1. Klicka på Arkiv> Nytt projekt
  2. Namn din projektmapp 3: e personkameror
  3. Klicka på Skapa
  4. Klicka på GameObject> Skapa annat> Riktigt ljus
  5. Klicka på GameObject> Skapa annat> Plan
  6. I inspektören hittar du transformationskomponenten och ändrar positionen X till 0, Y till -0,5 och Z till 0 så att den kommer att sitta under kuben
  7. Hämta grid.png
  8. Dra grid.png till projektpanelen
  9. Dra rutnättexten från projektpanelen till planen i hierarkipanelen
  10. Välj huvudkamera och flytta och rotera den till en position ovanför och bakom kuben
  11. Spara ditt motiv (Arkiv> Spara scen) och namnge det Huvudsaklig

Skapa en spelare

Alla kameror vi ska skapa behöver ett mål: något att titta på eller följa. Så, låt oss skapa en grundläggande spelare som vi kan flytta runt med piltangenterna.

  1. Klicka på GameObject> Skapa annat> Cube
  2. Byt namn på den Player
  3. Kontrollera i inspektören att dess X-, Y- och Z-koordinater är inställda på noll så vi är säkra på att spelaren är i mitten av 3D-världen
  4. Klicka på Tillgångar> Skapa> C # Script
  5. Namn skript Player
  6. Dra Player-skriptet från projektpanelen till spelaren i hierarkipanelen

I spelschriptet lägger du till två offentliga egenskaper för rörelsen och varvtalet. Lägg sedan till följande kod i din Update () -metod:

allmän klass spelare: MonoBehaviour public float movementSpeed ​​= 10; offentlig float turningSpeed ​​= 60; void Update () float horizontal = Input.GetAxis ("Horizontal") * turningSpeed ​​* Time.deltaTime; transform.Rotera (0, horisontell, 0); float vertical = Input.GetAxis ("Vertikal") * motionSpeed ​​* Time.deltaTime; transform.Translate (0, 0, vertikal); 

Detta ger spelaren kontroller som liknar en tank. Den horisontella axeln (vänster eller höger knapp) vrider spelaren runt, medan den vertikala axeln (upp eller ned-tangenterna) flyttar spelaren framåt och bakåt.


Titta på kameran

Detta är den mest grundläggande 3: e personen kameran. Den sitter fast i 3D-världen och spårar sitt mål som en torn.

  1. Klicka på Tillgångar> Skapa> C # Script
  2. Namn manuset LookAtCamera
  3. Dra LookAtCamera-skriptet från projektpanelen till huvudkameran i hierarkipanelen

I LookAtCamera-skriptet skapar du ett offentligt attribut för vår kameras mål högst upp i klassen. Offentliga attribut exponeras i inspektören och tillåter oss att tilldela spelaren som kamerans mål:

offentlig klass LookAtCamera: MonoBehaviour public GameObject target;

Därefter måste vi berätta för kamerans transformation att vi tittar på målobjektet. Lyckligtvis har transformationsobjekt en bekväm LookAt () -metod som vi kan använda för att göra just det. Vi kan göra detta i Update () -metoden, men istället skapar vi en LateUpdate () -metod. Som en tumregel bör du alltid använda LateUpdate () istället för Metoden Update () i alla kameraskript. LateUpdate () händer efter att Update () har slutförts, så spelarens skript har en chans att slutföra beräkning av spelarens position innan kameran beräknar sin position. Detta resulterar i mjukare kamera rörelse:

ogiltig LateUpdate () transform.LookAt (target.transform); 

Slutskriptet ska se ut som:

offentlig klass LookAtCamera: MonoBehaviour public GameObject target; ogiltig LateUpdate () transform.LookAt (target.transform); 

Om du försöker springa spelet nu får du fel som klagar på UnassignedReferenceException. För att förhindra detta drar du spelaren från hierarkipanelen och släpper den på skriptets målegenskap i inspektören. Kameran har nu ett giltigt mål att titta på.


Dungeon Crawler Camera

Det här är den typ av kamera som du normalt hittar i spel som Diablo, även känt som ett "Dungeon Crawler" -spel. Kameran sitter ovanför spelaren och rör sig i förhållande till tecknet men roterar aldrig.

  1. Klicka på Tillgångar> Skapa> C # Script
  2. Namn manuset DungeonCamera
  3. Dra DungeonCamera-skriptet från projektpanelen till huvudkameran i hierarkipanelen

I DungeonCamera-skriptet behöver vi återigen skapa ett offentligt attribut för kamerans mål. Vi måste också skapa en variabel för att lagra offset mellan kameran och dess mål. Förskjutningen representeras som en Vector3 och kommer att användas för att behålla det relativa avståndet när spelaren rör sig runt. Du kanske märker att vi inte ger offset ett värde när vi förstklarerar det. Detta beror på att vi ska beräkna värdet första gången skriptet körs. Vi kan använda Start () -metoden för att göra detta:

allmän klass DungeonCamera: MonoBehaviour public GameObject mål; Vector3 offset; void Start () offset = transform.position - target.transform.position; 

I varje ram behöver vi uppdatera kamerans position baserat på spelarens position genom att använda förskjutningen. Som vanligt bör detta göras i LateUpdate () -metoden:

void LateUpdate () Vector3 desiredPosition = target.transform.position + offset; tranform.position = önskad position; 

Dra Spelaren från hierarkipanelen till Skriptets Target-egenskap i inspektören.

Valfria förbättringar

Du kanske märker att kamerans rörelse är lite styv. Det skulle vara trevligt att dämpa rörelsen något så att det tar lite tid att komma till spelaren. Vi kan göra detta med metoden Vector3.Lerp (). Lerp interpolerar linjärt mellan två punkter, vilket betyder att det smidigt övergår från en punkt till en annan i en rak linje.

För att kontrollera hur mycket dämpning som tillämpas kan vi skapa ett annat offentligt attribut som kallas, vad som annars dämpar!

offentlig flytdämpning = 1;

De två punkter som vi kan leka mellan är kamerans nuvarande läge med dämpning påsatt och önskad position utan dämpning.

void LateUpdate () Vector3 desiredPosition = target.transform.position + offset; Vector3 position = Vector3.Lerp (transform.position, desiredPosition, Time.deltaTime * dämpning); transform.position = position;

Slutligen vill vi att kameran ska fortsätta titta på spelaren:

transform.LookAt (target.transform.position);

Det sista skriptet ser ut så här:

allmän klass DungeonCamera: MonoBehaviour public GameObject mål; offentlig flytdämpning = 1; Vector3 offset; void Start () offset = transform.position - target.transform.position;  void LateUpdate () Vector3 desiredPosition = target.transform.position + offset; Vector3 position = Vector3.Lerp (transform.position, desiredPosition, Time.deltaTime * dämpning); transform.position = position; transform.LookAt (target.transform.position); 

Följ kameran

Denna typ av kamera används ofta i plattformsspel som Mario Galaxy. Kameran sitter bakom spelaren och roterar runt karaktären när de vänder.

  1. Klicka på Tillgångar> Skapa> C # Script
  2. Namn manuset FollowCamera
  3. Dra FollowCamera-skriptet från projektpanelen till huvudkameran i hierarkipanelen

Liksom Dungeon Crawler-kameran kommer Follow-kameran att behöva ett offentligt attribut för ett mål, samt en kompensation. Förskjutningen bör sättas i Start () -metoden:

offentlig klass FollowCamera: MonoBehaviour public GameObject target; Vector3 offset; void Start () offset = target.transform.position - transform.position; 

För att rikta kameran bakom målet måste vi först få vinkeln på målet och förvandla det till en rotation i LateUpdate () -metoden:

void LateUpdate () float desiredAngle = target.transform.eulerAngles.y; Quaternion rotation = Quaternion.Euler (0, önskadAngle, 0);

Vi kan sedan multiplicera förskjutningen med rotationen för att orientera förskjutningen samma som målet. Vi subtraherar sedan resultatet från målets position.

transform.position = target.transform.position - (rotation * offset);

För att fortsätta titta på spelaren:

transform.LookAt (target.transform);

Dra Spelaren från hierarkipanelen till Skriptets Target-egenskap i inspektören.

Valfria förbättringar

Samma dämpningsrörelse som vi tillämpade på Dungeon-kameran kan appliceras på Follow-kamera. Först lägger vi till ett dämpningsattribut som gör det lättare att justera dämpningen:

offentlig flytdämpning = 1;

I stället för att lerning mellan två punkter som vi gjorde med Dungeon-kameran, ler vi mellan kamerans vinkel och målets vinkel. Så, snarare än Vector3.Lerp (), använder vi Mathf.LerpAngle () -metoden. Vi ersätter den ursprungliga vinkelkoden med:

float currentAngle = transform.eulerAngles.y; float desiredAngle = target.transform.eulerAngles.y; float angle = Mathf.LerpAngle (currentAngle, desiredAngle, Time.deltaTime * dämpning); Quaternion rotation = Quaternion.Euler (0, vinkel, 0);

Slutskriptet ska se ut som:

offentlig klass FollowCamera: MonoBehaviour public GameObject target; offentlig flytdämpning = 1; Vector3 offset; void Start () offset = target.transform.position - transform.position;  void LateUpdate () float currentAngle = transform.eulerAngles.y; float desiredAngle = target.transform.eulerAngles.y; float angle = Mathf.LerpAngle (currentAngle, desiredAngle, Time.deltaTime * dämpning); Quaternion rotation = Quaternion.Euler (0, vinkel, 0); transform.position = target.transform.position - (rotation * offset); transform.LookAt (target.transform); 

Musens målkamera

Denna typ av kamera liknar Follow-kameran, förutom att rotationen styrs av musen, som sedan pekar på tecknet i vilken riktning kameran står inför.

  1. Klicka på Tillgångar> Skapa> C # Script
  2. Namn manuset DungeonCamera
  3. Dra DungeonCamera-skriptet från projektpanelen till huvudkameran i hierarkipanelen

Precis som Follow-kameraen, kommer Mouse Aim-kameran att behöva en allmän egenskap för en mål- och rotationshastighet, såväl som en kompensation. Förskjutningen bör sättas i Start () -metoden:

offentlig klass MouseAimCamera: MonoBehaviour public GameObject mål; offentlig float rotateSpeed ​​= 5; Vector3 offset; void Start () offset = target.transform.position - transform.position; 

Vi kan komma åt musens horisontella axelaxel (aka: Mouse X) och använda den för att rotera målet.

float horizontal = Input.GetAxis ("Mouse X") * roteraSpeed; target.transform.Rotate (0, horizontal, 0);

Vi orienterar sedan offset i samma riktning och subtraherar den från målets position för att hålla kameran bakom målet.

float desiredAngle = target.transform.eulerAngles.y; Quaternion rotation = Quaternion.Euler (0, önskadAngle, 0); transform.position = target.transform.position - (rotation * offset); transform.LookAt (target.transform);

Dra Spelaren från hierarkipanelen till Skriptets Target-egenskap i inspektören.

Till skillnad från andra skript kommer vi inte att lägga till någon dämpning till kamerans rörelse. På grund av musens exakta natur kan det ofta leda till rörelsesjuka.

Slutskriptet ska se ut så här:

offentlig klass MouseAimCamera: MonoBehaviour public GameObject mål; offentlig float rotateSpeed ​​= 5; Vector3 offset; void Start () offset = target.transform.position - transform.position;  void LateUpdate () float horizontal = Input.GetAxis ("Mouse X") * roteraSpeed; target.transform.Rotate (0, horizontal, 0); float desiredAngle = target.transform.eulerAngles.y; Quaternion rotation = Quaternion.Euler (0, önskadAngle, 0); transform.position = target.transform.position - (rotation * offset); transform.LookAt (target.transform); 

Slutgiltiga tankar

Mer än ett kameraskript kan appliceras på en enda kamera samtidigt. För att växla mellan olika skript, aktivera det skript du vill ha genom att markera det och avmarkera alla andra. Detta kan vara användbart för att byta till en annan kamerastil för att skapa bilder eller klippa scener.

Enheten kommer också med flera kameraskript du kan använda direkt ur lådan. Skripten är väl dokumenterade, enkla att anpassa och gör bra guider för att bygga och förbättra dina egna kameraskript.

  1. Klicka på Tillgångar> Importera paket> Skript
  2. Avmarkera allt utom kameraskript

Slutsats

Enhet gör det enkelt att bygga en mängd olika kameror för vilken typ av spel som helst. Med bara några rader av kod är det viktigaste elementet i ditt spel redo att gå. Medan vissa kan hitta matte lite skrämmande, ger Unity så många användbara bekvämlighetsfunktioner att de flesta av de tunga beräkningarna redan är gjorda för dig.

Klicka här för att ladda ner hela Unity-projektet.