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.
Sfida
MedioFai ruotare dolcemente il gufo nella direzione indicata da ciascuna freccia.
- Aggiungi
Quaternion goal;e assegnaglitransform.rotationinStart(). - Quando viene premuto ciascun tasto freccia con
Input.GetKeyDown, impostagoal, ad esempiogoal = Quaternion.LookRotation(Vector3.right);: su +z, destra +x, giù -z, sinistra -x. - 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
1Corpo rigido
Gravità e massaSpingi con AddForceSalta con un impulsoFixedUpdate per la fisicaVelocitàCorpi cinematiciRiepilogo: piattaforma di lancio4Coroutine
InvokeInvokeRepeating, CancelInvokeLa tua prima coroutineCicli nelle coroutineInterrompere le coroutineRiepilogo: conto alla rovescia7Rotazione
Angoli di EuleroQuaternioniGuarda nella direzione in cui ti muoviRuota in modo fluidoRiepilogo: Torretta10Progetto: Fuga dall'arena
L'arenaCacciatori2Collisioni
OnCollisionEnterCosa ho colpito?Rompersi all'impattoRestare a terraRimbalzo e attritoForme dei ColliderRiepilogo: muro distruttibile5Progetto: Corsa alle monete
La palla rotolanteMonete da raccogliereEsercitati da solo: Playground Unity