Unity 3D – PickUp – Collecting

Player Object

1. Create a Ball (Player) with:
– Sphere Collider -> uncheck ‘Is Trigger’ -> se fosse solo un trigger non colliderebbe più col piano e finirebbe per cadere
– Rigid Body -> check ‘Use Gravity’ -> altrimenti non riusciremo a limitarlo all’interno di una arena
– PlayerController.JS:

#pragma strict
 
function Start () {
count = 0;
SetCountText();   // Setup iniziale GUIText, vedi funzione a fine pagina
winText.text =""; // Testo 'Hai Vinto!' all'inizio è vuoto 
}

// Destroy object with tag = PickUp that enters the trigger START            
    function OnTriggerEnter (other : Collider) {
        if (other.gameObject.tag == "PickUp")
        {             
            other.gameObject.SetActive(false); // Disattivo così non viene contato una seconda volta
            count = count + 1; // incremento il valore di 1 ogni volta che raccolgo un oggetto
            SetCountText(); // aggiorno GUIText
            Destroy(other.gameObject);         // Distruggo per liberare delle risorse di sistema
        }
        }
// Destroy object with tag = PickUp that enters the trigge END

// Theese variables are public to make the code easy-reusable
// You can setup theese variables from Inspector
var speed : float;

private var count : int;
var countText : GUIText; // Setup inside Inspector
var winText : GUIText; // Setup inside Inspector

function FixedUpdate () {
     // Get User Input START
     var moveHorizontal : float= Input.GetAxis ("Horizontal");
     var moveVertical : float= Input.GetAxis ("Vertical");
     // Get User Input END

     var movement : Vector3= new Vector3 (moveHorizontal, 0.0f, moveVertical);
     rigidbody.AddForce (movement * speed * Time.deltaTime); // Time.deltaTime Use this function to make your game frame rate independent
}

// setup del contenuto del GUIText
function SetCountText()
{
    countText.text = "Count: " + count.ToString();
    // Se ho catturato un numero sufficiente di oggetti vinco
    if(count >= 3)
    {
    winText.text = "Hai Vinto!";
    }
}


PlayerController.js> Inspector> change ‘speed’ to 500

PlayerController.js> Inspector> DRAG AND DROP CountText (GUI TEXT) over ‘Count Text’ variable slot

PlayerController.js> Inspector> DRAG AND DROP WinText (GUI TEXT) over ‘Win Text’ variable slot

PickUp Object

2. Create a Cube (PickUp) as ‘Prefab’ to easy duplicate it, with:

SOLUZIONE 1: senza ‘Rigid Body’, lo considera un ‘Collider Statico’, come un muro, e quindi calcola e salva in cache la posizione una volta per tutte, questo ha senso per risparmiare calcoli in caso di un oggetto che non si muove. Se il nostro cubo ruota Unity salva in cache ogni volta la nuova posizione per ogni frame occupando risorse di sistema.
– Box Collider -> check ‘Is Trigger’ -> così non si effettuano calcoli fisici perchè il ‘Trigger’ rileva solo le collisioni senza causare reazioni fisiche

OPPURE

SOLUZIONE 2: applicando un ‘Rigid Body’, lo considera un Collider dinamico, e non salverà dati in cache, occupando meno risorse.
a. Rigid Body> Disabilitare ‘Use Gravity’ per non far cadere l’oggetto. L’oggetto risponde ancora alle sollecitazioni provenienti da altri Collider.
b. Rigid Body> Abilitare ‘Is Kinematic’ per non far calcolare a Unity le reazioni alle sollecitazioni provenienti da altri Collider e ottimizzare il consumo di CPU. Un oggetto ‘Is Kinematic’ può essere spostao utilizzando la funzione ‘Transform’. Questo setup è tipico delle piattaforme mobili di un videogioco ‘platform’.

INOLTRE DEVE AVERE

– Tag ‘PickUp’ -> per distinguere questo tipo di oggetto da tutti gli altri
– Rotator.JS -> per ruotare il cubo

#pragma strict

function Start () {

}

function Update () {
// Time.deltatime, use this function to make your game frame rate independent
transform.Rotate(new Vector3(15,30,45) * Time.deltaTime);
}

Display Text, Win Text

1. Create:

(parent)>DisplayText (EmptyObject)> Transform> Reset

– (child)> CountText (GUI TEXT)> | Transform X=0 Y=1 is Top Left of the Game Viewport
| GUI Text> Pixel Offset X=10 Y=-10

– (child)> WinText (GUI TEXT)> | Transform X=0.5 Y=0.75 is Top Left of the Game Viewport
| GUI Text> Pixel Offset: X=10 Y=-10, Anchor: middle center Alignement: center

Analisi finale

Gli oggetti taggati ‘PickUp’ sono bonus da raccogliere hanno:

– Collider, selezionare ‘Is Trigger’ per non rispondere alle collisioni fisiche

– Rigid Body
a. perchè sono oggetti in movimento e devono essere classificati da Unity come ‘Dynamic Colliders’ per evitare di registrare dati inutili in Cache
b. deselezionare ‘Use Gravity’ perchè non vogliamo che cadano
c. selezionare ‘Is Kinematic’ perchè non devono rispondere all’effetto di forze esterne, per muoverlo NON UTILIZZARE UNA FORZA, ma usare la funzione transform().

– uno script con funzione transform() per ruotare su se stessi all’infinito

L’oggetto ‘Player’, il giocatore controllato dall’utente ha:

– Collider, deselezionare ‘Is Trigger’ perchè deve rispondere a tutte le sollecitazioni fisiche, prima delle quali restare su piano dove si muove

– Rigid Bodi
a. è un ‘Dynamic Colliders’ perchè si muove
b. selezionare ‘Use Gravity’ perchè deve rotolare, cadere etc…
c. deselezionare ‘Is Kinematic’ perchè deve rispondere alle forze esterne, per muoverlo devo applicare una forza NON UTILIZZARE LA FUNZIONE transform().

– uno script ‘PlayerController’ che:
a. usando GetAxis() rileva l’input dell’utente e applica una forza rigidbody.AddForce() al player
b. rileva lo scontro tra player e tutti gli oggetti taggati ‘PickUp’
c. cancella gli oggetti, conta le collisioni, se il numero è sufficiente renderizza la scritta ‘Hai Vinto!’