Menu
CoddyTech

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.

challenge icon

Sfida

Medio

Calcia 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 linearVelocity nella direzione del movimento, orizzontale lungo il terreno, moltiplicata per kickPower, più lift verso 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
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Creare veri giochi