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.
Aufgabe
EinfachDer 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);
}
}
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
1Dein erstes Skript
Hallo, UnityPlatziere den WürfelBewege dich in jedem FrameDrehe dich jede SekundeSteuere mit den TastenRückblick: Steuere den Würfel4Vektoren
Vektoren addierenRichtungenLokaler und globaler RaumDiagonale GeschwindigkeitAbstand zwischen ObjektenVector3 ist ein StructRückblick: Drohnenpilot7Projekt: Fang den Stern
Der FängerEin fallender Stern10Der Lebenszyklus eines Skripts
Awake und StartUpdate und LateUpdateOnEnable und OnDisableDie Reihenfolge im LebenszyklusRückblick: Lifecycle Logger5Transformationen und Hierarchie
Eltern und KinderSkalierungDinge ansehenAuf einen Punkt zubewegenRückblick: Umlaufender Mond8Dinge finden
Nach Namen findenTagsNach Typ findenReferenzen schlagen FindUnitys NullRückblick: Nächste Münze11Projekt: Weiche den Blöcken aus
Der LäuferFallende Blöcke6GameObjects und Komponenten
Referenzen im InspectorEine Komponente abrufenFehlende KomponentenEine Komponente hinzufügenRequireComponentEin- und AusblendenRückblick: Lichtschalter