Unity3D Tredjepersonskameraer

Kameraet er en av de viktigste elementene i et 3D-spill. Det fungerer som spillerens øyne, slik at de ser spillverdenen fra forskjellige synspunkter. I Unity3D fungerer et 3D-kamera som et filmkamera. Det kan pannes, vippes og zoomes til rammescener. Denne opplæringen vil lære deg hvordan du oppretter flere tredemanns kameraperspektiv.

For inspirasjon, eller å bruke et utgangspunkt for ditt eget arbeid, ta en titt på noen av de mest populære 3D-modellene på Envato Market. Eller få en en-mot-en hjelp ved å velge en av 3D-design og modelleringstjenester på Envato Studio.


Prosjektoppsett

Vi trenger et enkelt prosjekt for å teste kameraskriptene våre. Vi trenger en scene med et bakkeplan som har en tekstur på den. Dette gjør det enkelt å se hvordan hvert kamera beveger seg og reagerer på spillerinnganger. Når vi er ferdige, skal det se slik ut:

Følg disse trinnene for å konfigurere prosjektet:

  1. Klikk på Fil> Nytt prosjekt
  2. Navngi prosjektmappen din 3. Personkameraer
  3. Klikk på Opprett
  4. Klikk GameObject> Opprett annet> Retningslys
  5. Klikk GameObject> Opprett annet> Plan
  6. I inspektøren finner du Transform-komponenten og endrer posisjonen X til 0, Y til -0,5 og Z til 0 slik at den sitter under kuben
  7. Last ned grid.png
  8. Dra grid.png til prosjektpanelet
  9. Dra gridtekstur fra prosjektpanelet til flyet i hierarkipanelet
  10. Velg hovedkameraet og flytt og roter det til en posisjon over og bak kuben
  11. Lagre scenen din (Fil> Lagre scene) og gi den navnet Hoved

Lag en spiller

Alle kameraene vi skal lage vil trenge et mål: noe å se på eller følge. Så la oss lage en grunnleggende spiller vi kan flytte rundt med piltastene.

  1. Klikk GameObject> Opprett annet> Cube
  2. Gi nytt navn til spilleren
  3. I inspektøren må du kontrollere at X-, Y- og Z-koordinatene er satt til null slik at vi er sikre på at spilleren er i sentrum av 3D-verdenen
  4. Klikk på Assets> Create> C # Script
  5. Gi beskjed til spilleren
  6. Dra Player-skriptet fra prosjektpanelet til spilleren i hierarkipanelet

I spiller-skriptet legger du til to offentlige egenskaper for bevegelsen og svinghastigheten. Deretter legger du til følgende kode i din Update () -metode:

offentlig klassespiller: MonoBehaviour public float movementSpeed ​​= 10; offentlig float turningSpeed ​​= 60; ugyldig oppdatering () float horizontal = Input.GetAxis ("Horizontal") * turningSpeed ​​* Time.deltaTime; transform.Rotate (0, horizontal, 0); float vertikal = Input.GetAxis ("Vertikal") * bevegelseshastighet * Time.deltaTime; transform.Translate (0, 0, vertikal); 

Dette gir spillerens kontroller ligner på en tank. Den horisontale aksen (venstre eller høyre tastene) setter spilleren rundt, mens den vertikale aksen (opp eller ned-tastene) flytter spilleren fremover og bakover.


Se på kameraet

Dette er det mest grunnleggende tredje person kameraet. Den sitter fast i 3D-verdenen og sporer målet som et tårn.

  1. Klikk på Assets> Create> C # Script
  2. Gi beskjed til LookAtCamera
  3. Dra LookAtCamera-skriptet fra prosjektpanelet til hovedkameraet i hierarkipanelet

I LookAtCamera-skriptet må du opprette en offentlig attributt for kameraets mål øverst i klassen. Offentlige attributter blir eksponert i inspektøren og vil tillate oss å tildele spilleren som kameraets mål:

offentlig klasse LookAtCamera: MonoBehaviour public GameObject mål;

Deretter må vi fortelle kameraets transformasjon for å se målobjektet. Heldigvis har transformasjonsobjekter en praktisk LookAt () -metode vi kan bruke til å gjøre nettopp det. Vi kan gjøre dette i Update () -metoden, men i stedet lager vi en LateUpdate () -metode. Som en tommelfingerregel, bør du alltid bruke LateUpdate () i stedet for Update () -metoden i alle kameraskript. LateUpdate () skjer etter at Update () er ferdig, så spillerskriptet har en sjanse til å fullføre beregningen av spillerens posisjon før kameraet beregner posisjonen. Dette gir en jevnere kamerabevegelse:

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

Det endelige skriptet skal se ut som:

offentlig klasse LookAtCamera: MonoBehaviour public GameObject mål; void LateUpdate () transform.LookAt (target.transform); 

Hvis du prøver å kjøre spillet nå, får du feil som klager over UnassignedReferenceException. For å forhindre dette drar du spilleren fra hierarkipanelet og slipper det på skriptets målområde i inspektøren. Kameraet har nå et gyldig mål å se på.


The Dungeon Crawler Camera

Dette er typen kamera du vanligvis finner i spill som Diablo, også kjent som et "dungeon crawler" -spill. Kameraet sitter over spilleren og beveger seg i forhold til tegnet, men roterer aldri.

  1. Klikk på Assets> Create> C # Script
  2. Navngi skriptet DungeonCamera
  3. Dra DungeonCamera-skriptet fra prosjektpanelet til hovedkameraet i hierarkipanelet

I DungeonCamera-skriptet trenger vi nok en gang å opprette en offentlig attributt for kameraets mål. Vi må også opprette en variabel for å lagre forskyvningen mellom kameraet og dets mål. Forskjellen er representert som en Vector3 og vil bli brukt til å opprettholde den relative avstanden når spilleren beveger seg rundt. Du kan merke at vi ikke gir offsetverdien når vi først erklærer det. Dette skyldes at vi beregner verdien første gang skriptet kjøres. Vi kan bruke Start () -metoden til å gjøre dette:

offentlig klasse DungeonCamera: MonoBehaviour public GameObject mål; Vector3 offset; void Start () offset = transform.position - target.transform.position; 

I hver ramme må vi oppdatere kameraets posisjon basert på spillerens posisjon ved å bruke forskyvningen. Som vanlig bør dette gjøres i LateUpdate () metoden:

void LateUpdate () Vector3 ønsketPosisjon = target.transform.position + offset; tranform.position = ønsketposisjon; 

Dra spilleren fra hierarkipanelet til skriptets målrettingsområde i inspektøren.

Valgfrie forbedringer

Du kan merke at kameraets bevegelse er litt stiv. Det ville være fint å dempe bevegelsen litt, slik at det tar litt tid å fange opp til spilleren. Vi kan gjøre dette ved hjelp av Vector3.Lerp () -metoden. Lerp interpolerer lineært mellom to punkter, noe som betyr at det overgår jevnt fra ett punkt til et annet i en rett linje.

For å kontrollere hvor mye demping er påført, kan vi opprette et annet offentlig attributt som kalles, noe annet demping!

offentlig flytdemping = 1;

De to punktene vi kan leppe mellom er den nåværende posisjonen til kameraet med demping påsatt, og ønsket posisjon uten demping.

void LateUpdate () Vector3 ønsketPosisjon = target.transform.position + offset; Vector3 posisjon = Vector3.Lerp (transform.position, ønsketPosition, Time.deltaTime * demping); transform.position = posisjon;

Til slutt vil vi at kameraet skal fortsette å se på spilleren:

transform.LookAt (target.transform.position);

Det endelige skriptet ser slik ut:

offentlig klasse DungeonCamera: MonoBehaviour public GameObject mål; offentlig flytdemping = 1; Vector3 offset; void Start () offset = transform.position - target.transform.position;  void LateUpdate () Vector3 ønsketPosisjon = target.transform.position + offset; Vector3 posisjon = Vector3.Lerp (transform.position, ønsketPosition, Time.deltaTime * demping); transform.position = posisjon; transform.LookAt (target.transform.position); 

Følg kameraet

Denne typen kamera er ofte brukt i plattformspill som Mario Galaxy. Kameraet sitter bak og over spilleren og roterer rundt tegnet mens de vender.

  1. Klikk på Assets> Create> C # Script
  2. Navngi skriptet FollowCamera
  3. Dra FollowCamera-skriptet fra prosjektpanelet til hovedkameraet i hierarkipanelet

I likhet med Dungeon Crawler-kameraet, vil Follow-kameraet trenge en offentlig attributt for et mål, samt en kompensasjon. Forskjellen skal settes i Start () -metoden:

offentlig klasse FollowCamera: MonoBehaviour public GameObject mål; Vector3 offset; void Start () offset = target.transform.position - transform.position; 

For å orientere kameraet bak målet må vi først få vinkelen til målet og gjøre det til en rotasjon i LateUpdate () -metoden:

void LateUpdate () float desiredAngle = target.transform.eulerAngles.y; Quaternion rotasjon = Quaternion.Euler (0, ønsketAngle, 0);

Vi kan da multiplisere forskyvningen med rotasjonen for å orientere offseten det samme som målet. Vi trekker deretter resultatet fra målets posisjon.

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

For å fortsette å se på spilleren:

transform.LookAt (target.transform);

Dra spilleren fra hierarkipanelet til skriptets målrettingsområde i inspektøren.

Valgfrie forbedringer

Den samme dempingsbevegelsen vi brukte på Dungeon-kameraet, kan påføres Følg kameraet. Først legger vi til et dempingsattributt for å gjøre det lettere å justere dempingen:

offentlig flytdemping = 1;

I stedet for å leppe mellom to punkter som vi gjorde med Dungeon-kameraet, ler vi mellom vinkelen på kameraet og vinkelen på målet. Så, i stedet for Vector3.Lerp (), bruker vi Mathf.LerpAngle () -metoden. Vi erstatter den opprinnelige vinkelen med:

float currentAngle = transform.eulerAngles.y; float ønsketAngle = target.transform.eulerAngles.y; flytevinkel = Mathf.LerpAngle (currentAngle, ønsketAngle, Time.deltaTime * demping); Quaternion rotasjon = Quaternion.Euler (0, vinkel, 0);

Det endelige skriptet skal se ut som:

offentlig klasse FollowCamera: MonoBehaviour public GameObject mål; offentlig flytdemping = 1; Vector3 offset; void Start () offset = target.transform.position - transform.position;  void LateUpdate () float currentAngle = transform.eulerAngles.y; float ønsketAngle = target.transform.eulerAngles.y; flytevinkel = Mathf.LerpAngle (currentAngle, ønsketAngle, Time.deltaTime * demping); Quaternion rotasjon = Quaternion.Euler (0, vinkel, 0); transform.position = target.transform.position - (rotasjon * offset); transform.LookAt (target.transform); 

Musens målkamera

Denne typen kamera ligner på Følg kameraet, bortsett fra at rotasjonen styres av musen, som deretter peker tegnet i hvilken retning kameraet står overfor.

  1. Klikk på Assets> Create> C # Script
  2. Navngi skriptet DungeonCamera
  3. Dra DungeonCamera-skriptet fra prosjektpanelet til hovedkameraet i hierarkipanelet

Like Follow-kameraet, vil Mouse Aim-kameraet trenge en offentlig attributt for en mål- og rotasjonshastighet, så vel som en kompensasjon. Forskjellen skal settes i Start () -metoden:

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

Vi kan få tilgang til den horisontale aksen til musen (aka: Mouse X) og bruke den til å rotere målet.

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

Vi orienterer deretter offset i samme retning og trekker den fra målets posisjon for å holde kameraet bak målet.

float ønsketAngle = target.transform.eulerAngles.y; Quaternion rotasjon = Quaternion.Euler (0, ønsketAngle, 0); transform.position = target.transform.position - (rotasjon * offset); transform.LookAt (target.transform);

Dra spilleren fra hierarkipanelet til skriptets målrettingsområde i inspektøren.

I motsetning til de andre skriptene, kommer vi ikke til å legge til noen demping for kameraets bevegelse. På grunn av musens presise natur kan det ofte føre til bevegelsessykdom.

Det endelige skriptet skal se slik ut:

offentlig klasse 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") * rotateSpeed; target.transform.Rotate (0, horizontal, 0); float ønsketAngle = target.transform.eulerAngles.y; Quaternion rotasjon = Quaternion.Euler (0, ønsketAngle, 0); transform.position = target.transform.position - (rotasjon * offset); transform.LookAt (target.transform); 

Siste tanker

Mer enn ett kameraskript kan brukes på et enkelt kamera samtidig. For å bytte mellom de forskjellige skriptene, aktiver scriptet du vil ha ved å sjekke det og fjerne merket for alle de andre. Dette kan være nyttig for å bytte til en annen kamerastil for å etablere bilder eller klippe scener.

Enheten kommer også med flere kameraskript du kan bruke rett ut av boksen. Skriptene er godt dokumentert, lett å tilpasse og gir gode guider for å bygge og forbedre dine egne kameraskript.

  1. Klikk på Assets> Import Package> Scripts
  2. Fjern merket for alt bortsett fra kameraskript

Konklusjon

Enhet gjør det enkelt å bygge et bredt utvalg av kameraer for alle typer spill. Med bare noen få linjer med kode er det viktigste elementet i spillet ditt klart å gå. Mens noen kan finne matte litt skremmende, gir Unity så mange nyttige bekvemmelighetsfunksjoner at de fleste av de store beregningene allerede er gjort for deg.

Klikk her for å laste ned hele Unity-prosjektet.