Menu
CoddyTech

Vector3 ist eine Struktur

Teil des Abschnitts Unity-Scripting: Grundlagen der Unity-Journey von Coddy. Lektion 29 von 85.

Vector3 ist ein struct, eine Art von Typ, die du noch nicht kennengelernt hast. Ein struct ist ein Wert wie int: Bei einer Zuweisung wird der gesamte Wert kopiert. Nach Vector3 b = a; b.x = 9; bleibt a.x unverändert, weil b eine separate Kopie ist. (Bei einer Klasse ist es umgekehrt: Zwei Variablen können auf dasselbe gemeinsame Objekt verweisen.)

transform.position ist eine Eigenschaft, und beim Auslesen erhältst du eine Kopie der Position. Daher würde transform.position.x = 0; eine Kopie ändern, die sofort verworfen wird, und C# verweigert die Kompilierung: error CS1612: Cannot modify the return value of 'Transform.position' because it is not a variable. Die Lösung besteht darin, die Position zu kopieren, die Kopie zu ändern und sie wieder zuzuweisen. Dieser Runner kehrt in die mittlere Spur zurück, wenn die Leertaste gedrückt wird:

if (Input.GetKeyDown(KeyCode.Space))
{
    Vector3 p = transform.position;   // Kopie erstellen
    p.x = 0;                          // die Kopie ändern
    transform.position = p;           // die Kopie zurückzuweisen
}

Lässt du die letzte Zeile weg, wird der Code kompiliert, aber nichts bewegt sich: Nur die Kopie wurde geändert. transform.localScale und die anderen Vector3-Eigenschaften funktionieren genauso.

challenge icon

Aufgabe

Einfach

Sorge dafür, dass das Skript des Schlittens kompiliert, damit er auf dem Boden und zwischen den Wänden bleibt.

  1. Ersetze die beiden Zeilen, die transform.position.y und .x festlegen, durch eine Kopie: Vector3 p = transform.position;.
  2. Setze p.y = Mathf.Max(p.y, 0.5f); und p.x = Mathf.Clamp(p.x, -4f, 4f);, dann transform.position = p;.

Drücke „Spielen“: Der Schlitten landet auf dem Boden und die Wände halten ihn auf. Drücke danach „Prüfen“.

Probier es selbst

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;

        // Halte den Schlitten auf dem Boden und zwischen den Wänden.
        transform.position.y = Mathf.Max(transform.position.y, 0.5f);
        transform.position.x = Mathf.Clamp(transform.position.x, -4f, 4f);
    }
}

Alle Lektionen in Unity-Scripting: Grundlagen

Übe selbstständig: Unity-Playground