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.
Sfida
FacileFai compilare lo script della slitta in modo che rimanga sul pavimento e tra le pareti.
- Sostituisci le due righe che impostano
transform.position.ye.xcon una copia:Vector3 p = transform.position;. - Imposta
p.y = Mathf.Max(p.y, 0.5f);ep.x = Mathf.Clamp(p.x, -4f, 4f);, poitransform.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
1Nozioni di base di C# in Unity
Ciao, UnityVariabiliI numeri decimali richiedono una fTesto nella ConsoleVariabili che ricordanoIf ed ElseConfrontare i numeriRipasso: il collezionista di monete7Cicli e metodi
Ripeti con forCicli annidatiScrivere un metodoMetodi che restituiscono valoriArrayRiepilogo: scala10Trovare gli oggetti
Trovare per nomeTagTrovare per tipoI riferimenti battono la ricercaIl null di UnityRipasso: la moneta più vicina13Progetto: Schiva i blocchi
Il corridoreBlocchi dal cielo2Fallo muovere
Posiziona il cuboMuovilo a ogni frameRuotalo ogni secondoGuidalo con i tastiRiepilogo: guida il cubo5Vettori
Somma di vettoriDirezioniSpazio locale e spazio mondoVelocità diagonaleDistanza tra gli oggettiVector3 è una structRiepilogo: pilota di droni8GameObject e componenti
Riferimenti nell'InspectorOttenere un componenteComponenti mancantiAggiungere un componenteRequireComponentMostrare e nascondereRiepilogo: interruttore della luce3L’Inspector
Campi dell’InspectorSerializeFieldNumeri decimali e MathfAttributi dell’InspectorRiepilogo: ascensore6Trasformazioni e gerarchia
Genitori e figliIssare la bandieraScalaOsservare gli oggettiMuoversi verso un puntoRiepilogo: Luna in orbita9Progetto: Acchiappa la stella
Il raccoglitoreUna stella cadente12Il ciclo di vita dello script
Awake e StartUpdate e LateUpdateOnEnable e OnDisableL'ordine del ciclo di vitaRiepilogo: Lifecycle LoggerEsercitati da solo: Playground Unity