Menu
CoddyTech

Vector3 é uma struct

Parte da seção Noções básicas de scripting no Unity do Journey de Unity da Coddy. Lição 22 de 67.

Vector3 é uma struct, um tipo que não foi abordado na jornada de C#. Uma struct é um valor, como um int: ao atribuí-la, você copia tudo. Depois de Vector3 b = a; b.x = 9;, a.x permanece inalterado, porque b é uma cópia separada. (Uma classe funciona de outra forma: duas variáveis podem se referir a um mesmo objeto compartilhado.)

transform.position é uma propriedade, e lê-la fornece uma cópia da posição. Portanto, transform.position.x = 0; alteraria uma cópia que seria descartada imediatamente, e o C# se recusa a compilá-la: error CS1612: Cannot modify the return value of 'Transform.position' because it is not a variable. A solução é copiar a posição, alterar a cópia e atribuí-la de volta. Este corredor retorna à faixa do meio quando a tecla Espaço é pressionada:

if (Input.GetKeyDown(KeyCode.Space))
{
    Vector3 p = transform.position;   // copia
    p.x = 0;                          // altera a cópia
    transform.position = p;           // atribui a cópia de volta
}

Se você omitir a última linha, o código compila, mas nada se move: apenas a cópia foi alterada. transform.localScale e as outras propriedades Vector3 funcionam da mesma maneira.

challenge icon

Desafio

Fácil

O trenó cai a fall unidades por segundo, e as setas o deslizam ao longo de x. Duas linhas devem mantê-lo no chão (y nunca abaixo de 0.5) e entre as paredes (x de -4 a 4), mas o script não compila.

Pressione Play para ver os erros. Corrija as duas linhas trabalhando em uma cópia da posição, mantendo o que elas fazem, depois pressione Check.

Experimente você mesmo

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;

        // Mantenha o trenó no chão e entre as paredes.
        transform.position.y = Mathf.Max(transform.position.y, 0.5f);
        transform.position.x = Mathf.Clamp(transform.position.x, -4f, 4f);
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Noções básicas de scripting no Unity