Menu
CoddyTech

Vector3 ist ein Struct

Teil des Abschnitts Grundlagen des Scripting in Unity der Unity-Journey von Coddy. Lektion 22 von 67.

Vector3 ist ein struct, eine Art von Typ, die in der C#-Reise nicht behandelt wurde. Ein Struct ist ein Wert wie ein 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 gemeinsam genutzte Objekt verweisen.)

transform.position ist eine Eigenschaft, und beim Lesen erhältst du eine Kopie der Position. transform.position.x = 0; würde also 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;   // kopieren
    p.x = 0;                          // die Kopie ändern
    transform.position = p;           // wieder zuweisen
}

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

challenge icon

Aufgabe

Einfach

Der Schlitten fällt mit fall Einheiten pro Sekunde, und die Pfeiltasten bewegen ihn entlang der x-Achse. Zwei Zeilen sollen ihn auf dem Boden halten (y niemals unter 0.5) und zwischen den Wänden (x von -4 bis 4), aber das Skript lässt sich nicht kompilieren.

Drücke Play, um die Fehler zu sehen. Korrigiere die beiden Zeilen, indem du mit einer Kopie der Position arbeitest und ihre Wirkung beibehältst, und drücke dann Check.

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);
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Grundlagen des Scripting in Unity