Menu
CoddyTech

Vector3 è una struct

Fa parte della sezione Fondamenti di scripting in Unity del percorso Unity di Coddy. Lezione 22 di 67.

Vector3 è una struct, un tipo che il percorso di C# non ha trattato. Una struct è un valore, come un int: assegnarla ne copia l'intero contenuto. 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# rifiuta di compilare il codice: 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 riassegnarla. Questo runner torna alla corsia centrale quando premi Space:

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

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

La slitta cade a fall unità al secondo e le frecce la fanno scivolare lungo x. Due righe dovrebbero mantenerla sul pavimento (y mai inferiore a 0.5) e tra le pareti (x da -4 a 4), ma lo script non viene compilato.

Premi Play per vedere gli errori. Correggi le due righe lavorando su una copia della posizione, mantenendo ciò che fanno, poi premi Check.

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);
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fondamenti di scripting in Unity