Unity Bootstrap Lezioni

Muovere personaggio e telecamera in Unity 3D

This is a preview lesson
Register or sign in to take this lesson.

Durante questo corso abbiamo già visto come scrivere alcuni semplici script. In questa lezione riprenderemo quanto appreso per creare due script per il nostro gioco: vedremo insieme come muovere un personaggio e la telecamera in Unity 3D

Muovere il giocatore

Come al solito, creiamo un nuovo script e chiamiamolo “PlayerController”. La prima cosa che faremo sarà dichiarare alcune variabili:

 public Rigidbody rigidB;
 public int speed = 10;
 public int coinsCollected = 0;

Le prime due variabili controlleranno rispettivamente un rigidbody e la velocità con cui la sfera si muoverà all’interno del nostro gioco, mentre la variabile consCollected servirà a tenere il conto delle monete raccolte dal giocatore (la utilizzeremo nelle prossime lezioni!).

Dentro la funzione Start() assegneremo il componente Rigidbody alla variabile rigidB:

rigidB = GetComponent<Rigidbody>();

E per finire, dentro la funzione Update() scriveremo la seguente serie di If statements:

if(Input.GetKey("w")){ 
    rigidB.AddForce(Vector3.forward * speed);
}
if(Input.GetKey("s")){
    rigidB.AddForce(Vector3.back * speed);
}
if(Input.GetKey("d")){
    rigidB.AddForce(Vector3.right *speed);
}
if(Input.GetKey("a")){
    rigidB.AddForce(Vector3.left *speed);
}

che controlleranno la forza applicata alla nostra palla. Insomma, fino ad ora, nulla di nuovo sotto il sole!

Ecco il nostro codice completo :

using UnityEngine;
using System.Collections;
public class PlayerController : MonoBehaviour {
    public Rigidbody rigidB;
    public int speed = 10;
    public int coinsCollected = 0;
    // Use this for initialization
    void Start () {
        rigidB = GetComponent<Rigidbody>();
    }
    
    // Update is called once per frame
    void Update () {
        if(Input.GetKey("w")){
            rigidB.AddForce(Vector3.forward * speed);
        }
        if(Input.GetKey("s")){
            rigidB.AddForce(Vector3.back * speed);
        }
        if(Input.GetKey("d")){
            rigidB.AddForce(Vector3.right *speed);
        }
        if(Input.GetKey("a")){
            rigidB.AddForce(Vector3.left *speed);
        }
    }

}

Effettuiamo una build del nostro script in MonoDevelop (tramite il pulsante F8 o l’apposito menù a tendina “Build>Build All”) e torniamo in Unity. Entrando in Play Mode potrai finalmente muovere il protagonista del nostro gioco!

Gif8

Inseguire il giocatore con la telecamera

Adesso che la nostra palla può muoversi, dobbiamo fare in modo che la telecamera la segua.

Per far ciò, è necessario creare un nuovo script. Potresti pensare di inserire la telecamera come oggetto figlio della sfera, ma… non funzionerebbe! La telecamera infatti rimarrebbe ancorata alla palla, rotolando con essa. Provare per credere!

Selezioniamo quindi la nostra Main Camera e, ancora una volta, dall’inspector panel clicchiamo su “Add Component>New Script” e chiamiamo questo script “FollowPlayer”.

Ragioniamo per un attimo su cosa dovrà fare lo script: Egli dovrà muovere la telecamera mantenendo sempre la stessa distanza dal nostro protagonista! Quindi, il nostro script deve avere un riferimento alla sua posizione.

Creeremo due diverse variabili:

 public GameObject player;
 private Vector3 cameraLocation;

la variabile player sarà il riferimento alla nostra palla, mentre cameraLocation conterrà la posizione della telecamera rispetto al giocatore. Sotto la funzione start() andremo a scrivere:

cameraLocation = transform.position - player.transform.position;

che assegna alla variabile cameraLocation le attuali coordinate della telecamera, sottraendo ad esse le coordinate del personaggio.

Sotto la funzione Update(), andremo invece a scrivere  il seguente codice:

transform.position = player.transform.position + cameraLocation;

ciò vorra dire che, ad ogni frame del nostro gioco, lo script sposterà la telecamera al punto le cui coordinate sono la somma della posizione iniziale della telecamera rispetto al giocatore e dell’attuale posizione del “Player”!

in parole povere, la telecamera seguirà il player mantenendosi ad una distanza sempre uguale, cioè quella che aveva all’avvio del gioco.

Facciamo un esempio del funzionamento dello script in un grafico 2D (Il funzionamento nel nostro gioco in 3D sarà identico, ma con l’aggiunta dei calcoli relativi all’asse Z, cioè alla profondità).
Prima dell’avvio dello script, abbiamo l’oggetto Camera e l’oggetto Player, che per l’esempio posizioneremo rispettivamente nei punti X=2 Y=6 e X=6 Y=2.

graph1

Quando lo script verrà avviato, la funzione Start() assegnerà il parametro cameraLocation. Questo si otterrà sottraendo alla posizione della camera (nell’esempio X=2 e Y=6) la posizione del Player (cioè X=6 e Y=2).

Di conseguenza, i valori di cameraLocation saranno:
X= 2 – 6 = – 4
Y= 6 – 2 = 4

Questo vorrà dire che la telecamera avrà sempre posizione X=-4 e Y= 4 rispetto all’oggetto Player.

graph2

Fatto ciò, lo script passerà ad eseguire la funzione Update(), che ad ogni fotogramma del gioco non farà altro che sostituire la posizione della telecamera con la somma del parametro cameraLocation e dell’attuale posizione del giocatore. Ipotizziamo per esempio che l’oggetto Player, in preda alla forza  di gravità, cada fino a raggiungere la coordinata Y=1.

A questo punto la posizione della camera verrà aggiornata sommando il parametro cameraLocation (X=-4 e Y=4) e la nuova posizione del Player (cioè X=6 e Y=1).

Di conseguenza, la posizione della Camera diventerà:
X= – 4 + 6 = 2
Y= 4 + 1 = 5

graph3

Lo script finale sarà il seguente:

using UnityEngine;
using System.Collections;
public class FollowPlayer : MonoBehaviour {
 public GameObject player;
 private Vector3 cameraLocation;
 // Use this for initialization
 void Start () {
 cameraLocation = transform.position - player.transform.position;
 }
 
 // Update is called once per frame
 void Update () {
 transform.position = player.transform.position + cameraLocation;
 }
}

Salviamolo e andiamo a posizionare la nostra main camera in modo da avere una buona visuale sulla palla (Puoi assegnare alla telecamera la tua attuale visuale della scene view selezionando la telecamera e cliccando su “Game Object>Align with view” dal menù a tendina in alto).

Adesso, è necessario specificare quale sarà il Player che la nostra telecamera dovrà seguire: dall’inspector panel della telecamera, andiamo sotto il nostro Follow Player Script e, sotto la voce Player scegliamo “Sphere”.

Gif9

Come puoi vedere adesso la telecamera segue la palla in ogni suo movimento!

Per questa lezione è tutto, nella prossima creeremo delle monete da far raccogliere al nostro giocatore, con tanto di interfaccia grafica che possa contare le monete raccolte e mostrare un messaggio di Game Over!