Spingere gli oggetti
Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 40 di 56.
Un CharacterController non spinge mai nulla: se lo fai camminare contro una cassa con un Rigidbody, si ferma come davanti a un muro. Invece, Unity chiama OnControllerColliderHit(ControllerColliderHit hit) sugli script del controller per ogni collider toccato da un Move, pavimento incluso, e lo script decide cosa succede. hit.collider è ciò che è stato toccato, hit.moveDirection la direzione del Move che lo ha toccato e hit.normal la direzione verso cui è rivolta la sua superficie nel punto di contatto. Questo è lo script di spinta di Unity:
public float pushPower = 2f;
void OnControllerColliderHit(ControllerColliderHit hit)
{
Rigidbody body = hit.collider.attachedRigidbody;
if (body == null || body.isKinematic) return; // niente da spingere
if (hit.moveDirection.y < -0.3f) return; // si trova sotto i nostri piedi
Vector3 pushDir = new Vector3(hit.moveDirection.x, 0f, hit.moveDirection.z);
body.linearVelocity = pushDir * pushPower;
}Ogni return ha una ragione. Il pavimento e le pareti non hanno un Rigidbody, quindi body è null per loro e vengono toccati in quasi ogni Move. Un corpo cinematico si muove solo quando è il suo script a muoverlo, quindi una velocità non ha alcun effetto su di esso. Un Move diretto ripidamente verso il basso ha toccato qualcosa sotto i piedi, e la cassa su cui si trova il giocatore non dovrebbe essere spinta.
La direzione della spinta mantiene solo x e z, così una cassa scivola sul terreno invece di essere spinta contro di esso. Impostare linearVelocity, invece di aggiungere una forza, fa muovere una cassa leggera e una pesante alla stessa velocità; body.AddForce(pushDir * pushPower, ForceMode.Impulse) spingerebbe meno quella pesante.
Sfida
MedioCalcia le palle nel cortile. Il Player cammina con un CharacterController (Walker.cs, già pronto). Scrivi Kicker.cs, anch’esso sul Player. Nell’Inspector imposta kickPower (6) e lift (4).
- Quando il player cammina contro un corpo che può essere spinto, imposta la sua
linearVelocitynella direzione del movimento, orizzontale lungo il terreno, moltiplicata perkickPower, piùliftverso l’alto, così la palla vola in avanti e verso l’alto. - Il terreno e il palo non hanno un Rigidbody: ignorali senza generare errori.
- Una palla sotto i piedi del player non viene calciata.
Premi Play e calcia la palla rossa, poi premi Check.
Provalo tu
using UnityEngine;
public class Kicker : MonoBehaviour
{
public float kickPower = 6f;
public float lift = 4f;
// Calcia le palle contro cui il giocatore va a sbattere
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Creare veri giochi
1Testo sullo schermo
Canvas e testoMostra il punteggioFormattare i numeriUn timer per il conto alla rovesciaRiepilogo: tachimetro4Scene e livelli
Caricare una scenaRiavviare il livelloLivello successivoMantenere i dati tra le sceneRiepilogo: selezione del livello10Progetto: Platform 3D
Il percorsoPiattaforme mobili2Pulsanti e schermate
Pulsanti e onClickLambdaCollegare nell'InspectorPannelli attivi e disattiviBarre della saluteRiepilogo: negozio degli upgrade5Salvare con PlayerPrefs
Salvare un numeroCaricare con un valore predefinitoPunteggio massimoSalvare le impostazioniRiepilogo: monete in banca8Controller del personaggio
CharacterController.MoveGravità manualeSaltoSpingere gli oggettiMuoviti dove guardiRiepilogo: doppio salto3Il gestore del gioco
Uno script gestisce il giocoIl SingletonStati di giocoSelezionare lo statoRiepilogo: gestore del round6Progetto: Corsa infinita
Tre corsieOstacoli in arrivo9Il nuovo sistema di input
Due sistemi di inputTastiera e mousePremuto in questo frameAzioni di inputRiepilogo: cambio di input