Spingere gli oggetti
Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 41 di 60.
Un CharacterController non spinge mai niente: se lo fai camminare contro una cassa con un Rigidbody, si ferma come davanti a un muro. Invece, Unity chiama OnControllerColliderHit(ControllerColliderHit hit) negli script del controller per ogni collider toccato da un Move, pavimento compreso, e lo script decide cosa succede. hit.collider è ciò che è stato toccato, hit.moveDirection è la direzione del Move che l'ha toccato e hit.normal è la direzione verso cui è rivolta la sua superficie nel punto di contatto. Questo è lo script di Unity per spingere gli oggetti:
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; // è 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 i muri non hanno un Rigidbody, quindi body è null per loro e vengono toccati in quasi ogni Move. Un corpo cinematico si muove solo quando lo sposta il suo script, quindi una velocità non ha alcun effetto su di esso. Un Move diretto nettamente verso il basso ha toccato qualcosa sotto i piedi, e la cassa su cui si trova il personaggio non dovrebbe essere spinta.
La direzione della spinta mantiene solo x e z, così la 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
MedioFai in modo che il giocatore calci le palle contro cui cammina.
- In
Kicker.cs, scrivivoid OnControllerColliderHit(ControllerColliderHit hit)e ottieniRigidbody body = hit.collider.attachedRigidbody;. - Usa
returnquandobodyè null o cinematico, oppure quandohit.moveDirection.y < -0.3f(una palla sotto i piedi). - Imposta
body.linearVelocitysulla direzione di camminata con y pari a 0, moltiplicata perkickPower, piùVector3.up * lift.
Premi «Gioca» e cammina contro la palla rossa: volerà in avanti e verso l'alto. Poi premi «Verifica».
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
}
Tutte le lezioni di Creare veri giochi
1Testo sullo schermo
Canvas e testoMostra il punteggioFormattare i numeriUn timer per il conto alla rovesciaRiepilogo: tachimetro2Pulsanti 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: Runner infinito
Tre corsieOstacoli in arrivo9Il nuovo sistema di input
Due sistemi di inputTastiera e mousePremuto in questo frameAzioni di inputRiepilogo: cambio di inputEsercitati da solo: Playground Unity