Menu
CoddyTech

Ruota in modo fluido

Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 45 di 71.

Impostare direttamente transform.rotation su una nuova rotazione fa ruotare un oggetto in un solo fotogramma. Quaternion.RotateTowards(current, goal, maxDegrees) restituisce current ruotato verso goal al massimo di maxDegrees, senza mai superare l'obiettivo. Usando turnSpeed * Time.deltaTime come passo, l'oggetto ruota a velocità costante e si ferma esattamente sull'obiettivo, proprio come fa MoveTowards per le posizioni. Questo girasole segue il sole a 30 gradi al secondo:

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);
}

Se il sole si trova a 90 gradi di distanza, il girasole impiega 3 secondi, ruotando di 30 gradi per volta. Ruota per la via più breve e l'obiettivo viene ricalcolato a ogni fotogramma, quindi segue anche un sole in movimento.

Quaternion.Slerp(a, b, t) è la rotazione che si trova a una frazione t del percorso da a a b, proprio come Vector3.Lerp fa per i punti. Scritta come Slerp(transform.rotation, goal, 5f * Time.deltaTime) in Update(), a ogni fotogramma ruota di una parte dell'angolo rimanente: rapidamente all'inizio, sempre più lentamente avvicinandosi all'obiettivo, mai a velocità fissa e senza mai raggiungerlo del tutto. Questa gradualità è adatta a una telecamera o a una testa che si gira. Quando la velocità di rotazione è una regola del gioco, come per un cannone che ruota di 60 gradi al secondo, usa RotateTowards.

challenge icon

Sfida

Medio

Fai ruotare dolcemente il gufo nella direzione indicata da ciascuna freccia.

  1. Aggiungi Quaternion goal; e assegnagli transform.rotation in Start().
  2. Quando viene premuto ciascun tasto freccia con Input.GetKeyDown, imposta goal, ad esempio goal = Quaternion.LookRotation(Vector3.right);: su +z, destra +x, giù -z, sinistra -x.
  3. A ogni fotogramma, imposta transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);.

Premi «Gioca» e tocca le frecce. Poi premi «Verifica».

Provalo tu

using UnityEngine;

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

    void Update()
    {
        // Su, destra, giù, sinistra: ruota per rivolgersi verso +z, +x, -z, -x a turnSpeed gradi al secondo.
    }
}

Tutte le lezioni di Fisica e gameplay

Esercitati da solo: Playground Unity