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!’