Menu
CoddyTech

Vector3 to struktura

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

Vector3 to struktura, rodzaj typu, z którym jeszcze się nie spotkałeś. Struktura jest wartością, taką jak int: przypisanie jej kopiuje całą wartość. 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ą odwoływać się do jednego współdzielonego obiektu.)

transform.position jest właściwością, a jej odczyt przekazuje ci kopię pozycji. Dlatego transform.position.x = 0; zmieniłoby kopię, która natychmiast zostałaby odrzucona, a C# odmawia kompilacji takiego kodu: error CS1612: Cannot modify the return value of 'Transform.position' because it is not a variable. Rozwiązaniem jest skopiowanie pozycji, zmienienie 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;   // skopiuj
    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

Popraw skrypt sań, aby się kompilował i utrzymywał sanie na podłodze oraz między ścianami.

  1. Zastąp dwa wiersze ustawiające transform.position.y i .x kopią: Vector3 p = transform.position;.
  2. Ustaw p.y = Mathf.Max(p.y, 0.5f); i p.x = Mathf.Clamp(p.x, -4f, 4f);, a następnie transform.position = p;.

Naciśnij „Graj”: sanie lądują na podłodze, a ściany je zatrzymują. Następnie naciśnij „Sprawdź”.

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

Wszystkie lekcje w sekcji Podstawy skryptów w Unity

Poćwicz samodzielnie: Edytor online Unity