Flytta och rotera

Time.deltaTime

Eftersom alla datorer Àr olika snabba sÄ blir det lite konstigt om man har t.ex. en fast förflyttning eller fast rotation per bildruta.

Time.deltaTime Àr en float som innehÄller tiden som gÄtt sedan föregÄende bildruta i sekunder.

Det gör att om man multiplicerar en hastighet med Time.deltaTime sÄ kommer det att bli en stor förflyttning om man har fÄ fps och en mindre förflyttning om man har hög fps.

Om hastigheten ska vara 2 rutor per sekund sÄ kommer objektet alltsÄ att röra sig 2 * 1/30 per bildruta pÄ en dator som har 30fps och 2 * 1/60 per bildruta pÄ en dator som har 60fps.

float speed = 2;
Vektor3 movement = Vektor3.right * speed * Time.deltaTime;

Position

transform.Translate()

En metod som tar emot en Vector3 och adderar den till den nuvarande positionen - samma sak som att addera sjÀlv alltsÄ, men via en metod.

Vektor3 movement = Vektor3.right * Time.deltaTime;
transform.Translate(movement);

transform.position

En Vektor3 som motsvarar objektets nuvarande x, y- och z-position i vÀrlden.

Vector3 newPosition = new Vector3(2f, 3.2f, 0f);
transform.position = newPosition;

OvanstÄende exempel skapar en ny vektor med x-vÀrde 2, y-vÀrde 3.2 och z-vÀrde 0. DÀrefter byts objektets nuvarande position ut mot den nya vektorn.

Vector3 movement = Vector3.right * Time.deltaTime;
transform.position += movement

OvanstÄende exempel skapar först en ny vektor som beskriver hur mycket objektet ska förflyttas, och sedan adderar den vektorn till transform.position sÄ att det nya vÀrdet som transform.position har Àr den nya positionen den ska ha.

Vector3.Lerp()

Lerp stÄr för "Linear interpolation". Förenklat kan man stoppa en "kÀllvektor" och en "mÄlvektor" och fÄ ut en vektor som ligger mellan kÀllan och mÄlet. Man anger ocksÄ en float som mÀter hur lÄngt lÀngsmed rutten frÄn kÀllan till mÄlet som den mellanliggande vektorn rört sig.

Detta brukar anvÀndas för att skapa "mjuka" rörelser och storleksförÀndringar.

Vector3 newPosition = Vector3.Lerp(transform.position, target.transform.position, 0.5f);
// newPosition ligger precis mellan transform.Position och target.transform.Position.

transform.position = newPosition;

Kör man ovanstĂ„ende kod i Update() sĂ„ kommer objektet att flytta sig halva vĂ€gen varje bildruta. Det kommer alltsĂ„ egentligen aldrig att komma fram


Float-vÀrdet behöver vara mellan 0 och 1, för 1 innebÀr "hela vÀgen".

Rotation

Man jobbar sÀllan direkt med Quaternions i Unity; man skapar Ätminstone sÀllan egna. IstÀllet anvÀnder man olika metoder för att generera eller förÀndra quaternions.

transform.Rotate()

Roterar objektet ett givet antal grader i x, y och z-led.

transform.Rotate(90, 0, 0);
transform.Rotate(new Vector3(90, 0, 0));

Eller ett visst antal grader runt en given axel

transform.Rotate(Vector3.up, 45);

transform.RotateAround()

Snurrar objektet ett givet antal grader runt en punkt och en axel som skÀr denna punkt.

Vector3 sunPosition = new Vector3(0, 10, 60);
transform.RotateAround(sunPosition, Vector3.up, 30);

transform.rotation

Om man fĂ„tt fram en quaternion eller vill anvĂ€nda en fĂ€rdig – t.ex. nollrotationen Quaternion.identity – sĂ„ an man Ă€ndra pĂ„ transform.rotation direkt.

transform.rotation = Quaternion.identity;

transform.LookAt()

AnvĂ€nds frĂ€mst i 3D – roterar objektet sĂ„ att dess interna "forward"-axel pekar mot en specifik position.

// roterar objektet sÄ dess forward pekar mot vÀrldens nollpunkt
transform.LookAt(Vector3.zero);

Motsvarigheten till LookAt() i 2d

Det finns ett lite "fuskigt" sÀtt att rotera ett objekt i 2d sÄ att det pekar mot ett annat objekt i scenen.

transform.right = target.position - transform.position;

Last updated