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.
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:
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.
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.
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.
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å.
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.
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.
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);
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.
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.
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);
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.
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);
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.
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.