Menu
CoddyTech

Vector3 è una struct

Fa parte della sezione Fondamenti di scripting in Unity del percorso Unity di Coddy. Lezione 29 di 85.

Vector3 è una struct, un tipo che non hai ancora incontrato. Una struct è un valore, come un int: assegnandola, ne viene copiata l’intera struttura. Dopo Vector3 b = a; b.x = 9;, a.x rimane invariato, perché b è una copia separata. (Una classe funziona al contrario: due variabili possono fare riferimento allo stesso oggetto condiviso.)

transform.position è una proprietà e, quando la leggi, ti restituisce una copia della posizione. Quindi transform.position.x = 0; modificherebbe una copia che viene subito scartata e C# non permette di compilarla: error CS1612: Cannot modify the return value of 'Transform.position' because it is not a variable. La soluzione è copiare la posizione, modificare la copia e assegnarla di nuovo. Questo runner torna nella corsia centrale quando premi la barra spaziatrice:

if (Input.GetKeyDown(KeyCode.Space))
{
    Vector3 p = transform.position;   // copia
    p.x = 0;                          // modifica la copia
    transform.position = p;           // riassegnala
}

Se ometti l’ultima riga, il codice viene compilato, ma non si muove nulla: è cambiata solo la copia. transform.localScale e le altre proprietà Vector3 funzionano allo stesso modo.

challenge icon

Sfida

Facile

Fai compilare lo script della slitta in modo che rimanga sul pavimento e tra le pareti.

  1. Sostituisci le due righe che impostano transform.position.y e .x con una copia: Vector3 p = transform.position;.
  2. Imposta p.y = Mathf.Max(p.y, 0.5f); e p.x = Mathf.Clamp(p.x, -4f, 4f);, poi transform.position = p;.

Premi «Gioca»: la slitta atterra sul pavimento e le pareti la fermano. Poi premi «Verifica».

Provalo tu

using UnityEngine;

public class Sled : MonoBehaviour
{
    public float speed = 4f;
    public float fall = 3f;

    void Update()
    {
        float h = Input.GetAxisRaw("Horizontal");
        transform.position += new Vector3(h * speed, -fall, 0) * Time.deltaTime;

        // Mantieni la slitta sul pavimento e tra le pareti.
        transform.position.y = Mathf.Max(transform.position.y, 0.5f);
        transform.position.x = Mathf.Clamp(transform.position.x, -4f, 4f);
    }
}

Tutte le lezioni di Fondamenti di scripting in Unity

Esercitati da solo: Playground Unity