Menu
CoddyTech

Vector3 est une struct

Fait partie de la section Les bases du scripting dans Unity du Journey Unity de Coddy. Leçon 22 sur 67.

Vector3 est une struct, un type qui n’a pas été abordé dans le parcours C#. Une struct est une valeur, comme un int : la lui affecter en crée une copie complète. Après Vector3 b = a; b.x = 9;, a.x reste inchangé, car b est une copie distincte. (Une classe fonctionne à l’inverse : deux variables peuvent faire référence à un même objet partagé.)

transform.position est une propriété, et sa lecture vous donne une copie de la position. Ainsi, transform.position.x = 0; modifierait une copie qui serait aussitôt abandonnée, et C# refuse de compiler cette instruction : error CS1612: Cannot modify the return value of 'Transform.position' because it is not a variable. Pour corriger cela, copiez la position, modifiez la copie, puis réaffectez-la. Ce runner revient sur la voie du milieu lorsque vous appuyez sur Space :

if (Input.GetKeyDown(KeyCode.Space))
{
    Vector3 p = transform.position;   // copier
    p.x = 0;                          // modifier la copie
    transform.position = p;           // la réaffecter
}

Omettez la dernière ligne et le code compile, mais rien ne bouge : seule la copie a été modifiée. transform.localScale et les autres propriétés Vector3 fonctionnent de la même manière.

challenge icon

Défi

Facile

La luge tombe à une vitesse de fall unités par seconde, et les flèches la font glisser le long de l’axe x. Deux lignes doivent la maintenir au sol (y ne descend jamais en dessous de 0.5) et entre les murs (x de -4 à 4), mais le script ne compile pas.

Appuie sur Play pour voir les erreurs. Corrige les deux lignes en travaillant sur une copie de la position, tout en conservant leur fonction, puis appuie sur Check.

Essayez vous-même

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;

        // Maintenir la luge au sol et entre les murs.
        transform.position.y = Mathf.Max(transform.position.y, 0.5f);
        transform.position.x = Mathf.Clamp(transform.position.x, -4f, 4f);
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Les bases du scripting dans Unity