Menu
CoddyTech

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.

challenge icon

Sfida

Medio

Fai in modo che il giocatore calci le palle contro cui cammina.

  1. In Kicker.cs, scrivi void OnControllerColliderHit(ControllerColliderHit hit) e ottieni Rigidbody body = hit.collider.attachedRigidbody;.
  2. Usa return quando body è null o cinematico, oppure quando hit.moveDirection.y < -0.3f (una palla sotto i piedi).
  3. Imposta body.linearVelocity sulla direzione di camminata con y pari a 0, moltiplicata per kickPower, 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

Esercitati da solo: Playground Unity