Menu
CoddyTech

Obracaj się płynnie

Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 45 z 71.

Ustawienie transform.rotation bezpośrednio na nową rotację obraca obiekt w jednej klatce. Quaternion.RotateTowards(current, goal, maxDegrees) zwraca current obrócone w stronę goal o maksymalnie maxDegrees i nigdy nie przekracza celu. Gdy krokiem jest turnSpeed * Time.deltaTime, obiekt obraca się ze stałą szybkością i zatrzymuje dokładnie na celu, tak jak MoveTowards w przypadku pozycji. Ten słonecznik podąża za słońcem z szybkością 30 stopni na sekundę:

public Transform sun;
public float turnSpeed = 30f;

void Update()
{
    Quaternion goal = Quaternion.LookRotation(sun.position - transform.position);
    transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);
}

Słonecznik potrzebuje 3 sekund, by obrócić się do słońca oddalonego o 90 stopni — po 30 stopni na sekundę. Obraca się krótszą drogą, a cel jest wyznaczany ponownie w każdej klatce, dzięki czemu podąża za poruszającym się słońcem.

Quaternion.Slerp(a, b, t) to rotacja znajdująca się w ułamku drogi t od a do b, tak jak Vector3.Lerp wyznacza punkt między punktami. Zapisane w Update() jako Slerp(transform.rotation, goal, 5f * Time.deltaTime), obraca o część pozostałego kąta w każdej klatce: na początku szybko, a w pobliżu celu coraz wolniej; nigdy ze stałą szybkością i nigdy nie docierając do celu. Takie płynne zwalnianie sprawdza się przy obracaniu kamery lub głowy. Gdy szybkość obrotu jest regułą gry, na przykład armata obraca się o 60 stopni na sekundę, użyj RotateTowards.

challenge icon

Wyzwanie

Średni

Spraw, by sowa płynnie obracała się w kierunku wskazywanym przez każdą strzałkę.

  1. Dodaj Quaternion goal; i ustaw ją na transform.rotation w Start().
  2. Po Input.GetKeyDown dla każdej strzałki ustaw goal, na przykład goal = Quaternion.LookRotation(Vector3.right);: góra +z, prawo +x, dół -z, lewo -x.
  3. W każdej klatce ustaw transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);.

Naciśnij „Graj” i naciskaj strzałki. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

using UnityEngine;

public class Owl : MonoBehaviour
{
    public float turnSpeed = 180f;

    void Update()
    {
        // Góra, prawo, dół, lewo: obracaj się w kierunku +z, +x, -z, -x z prędkością turnSpeed stopni na sekundę.
    }
}

Wszystkie lekcje w sekcji Fizyka i rozgrywka

Poćwicz samodzielnie: Edytor online Unity