Menu
CoddyTech

Vector3 é uma struct

Parte da seção Fundamentos de Scripting no Unity do Journey de Unity da Coddy. Lição 29 de 85.

Vector3 é uma struct, um tipo que você ainda não conheceu. Uma struct é um valor, como um int: atribuí-la copia o valor inteiro. 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 ao 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 é 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 personagem retorna à faixa do meio quando a tecla Espaço é pressionada:

if (Input.GetKeyDown(KeyCode.Space))
{
    Vector3 p = transform.position;   // copie
    p.x = 0;                          // altere a cópia
    transform.position = p;           // atribua-a 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

Faça o script do trenó compilar para que ele permaneça no chão e entre as paredes.

  1. Substitua as duas linhas que definem transform.position.y e .x por uma cópia: Vector3 p = transform.position;.
  2. Defina p.y = Mathf.Max(p.y, 0.5f); e p.x = Mathf.Clamp(p.x, -4f, 4f);, depois transform.position = p;.

Pressione “Jogar”: o trenó pousa no chão e as paredes o impedem de passar. Depois, pressione “Verificar”.

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);
    }
}

Todas as lições de Fundamentos de Scripting no Unity

Pratique por conta própria: Playground de Unity