Menu
CoddyTech

Vector3 jest strukturą

Część sekcji Podstawy skryptów w Unity ścieżki Unity w Coddy. Lekcja 22 z 67.

Vector3 to struct, rodzaj typu, którego nie omawiano na ścieżce C#. Struktura jest wartością, taką jak int: przypisanie jej kopiuje całą jej zawartość. Po wykonaniu Vector3 b = a; b.x = 9; wartość a.x pozostaje niezmieniona, ponieważ b jest osobną kopią. (Klasa działa odwrotnie: dwie zmienne mogą wskazywać ten sam obiekt.)

transform.position jest właściwością, a jej odczyt zwraca kopię pozycji. Dlatego transform.position.x = 0; zmieniłoby kopię, która natychmiast zostałaby odrzucona, a C# nie pozwala skompilować takiego kodu: error CS1612: Cannot modify the return value of 'Transform.position' because it is not a variable. Rozwiązaniem jest skopiowanie pozycji, zmiana kopii i przypisanie jej z powrotem. Ten runner wraca na środkowy pas po naciśnięciu spacji:

if (Input.GetKeyDown(KeyCode.Space))
{
    Vector3 p = transform.position;   // kopia
    p.x = 0;                          // zmień kopię
    transform.position = p;           // przypisz ją z powrotem
}

Pomiń ostatnią linię, a kod się skompiluje, ale nic się nie poruszy: zmieniła się tylko kopia. transform.localScale i pozostałe właściwości Vector3 działają tak samo.

challenge icon

Wyzwanie

Łatwy

Sanki opada z prędkością fall jednostek na sekundę, a strzałki przesuwają ją wzdłuż osi x. Dwie linie powinny utrzymywać ją na podłożu (y nie może być mniejsze niż 0.5) i między ścianami (x od -4 do 4), ale skrypt się nie kompiluje.

Naciśnij Play, aby zobaczyć błędy. Popraw te dwie linie, pracując na kopii pozycji i zachowując ich działanie, a następnie naciśnij Check.

Spróbuj swoich sił

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;

        // Utrzymuj sanki na podłodze i między ścianami.
        transform.position.y = Mathf.Max(transform.position.y, 0.5f);
        transform.position.x = Mathf.Clamp(transform.position.x, -4f, 4f);
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy skryptów w Unity