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.
Aufgabe
EinfachSorge dafür, dass das Skript des Schlittens kompiliert, damit er auf dem Boden und zwischen den Wänden bleibt.
- Ersetze die beiden Zeilen, die
transform.position.yund.xfestlegen, durch eine Kopie:Vector3 p = transform.position;. - Setze
p.y = Mathf.Max(p.y, 0.5f);undp.x = Mathf.Clamp(p.x, -4f, 4f);, danntransform.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
1C#-Grundlagen in Unity
Hallo, UnityVariablenDezimalzahlen brauchen ein fText in der KonsoleVariablen, die sich etwas merkenIf und ElseZahlen vergleichenRückblick: Münzsammler7Schleifen und Methoden
Wiederholen mit forSchleifen in SchleifenEine Methode schreibenMethoden mit RückgabewertArraysRückblick: Treppe10Dinge finden
Nach Namen suchenTagsNach Typ suchenReferenzen schlagen SuchenUnitys NullRückblick: nächste Münze13Projekt: Weiche den Blöcken aus
Der LäuferBlöcke vom Himmel2Bring es in Bewegung
Platziere den WürfelBewege ihn in jedem FrameDrehe ihn jede SekundeSteuere mit den TastenRückblick: Fahre den Würfel5Vektoren
Vektoren addierenRichtungenLokaler und globaler RaumDiagonale GeschwindigkeitAbstand zwischen ObjektenVector3 ist eine StrukturRückblick: Drohnenpilot8GameObjects und Komponenten
Referenzen im InspectorEine Komponente abrufenFehlende KomponentenEine Komponente hinzufügenRequireComponentEin- und AusblendenRückblick: Lichtschalter11Prefabs und Erzeugen von Instanzen
Prefabs und InstantiateNach Zeitintervall erzeugenIn einem Raster erzeugenListen von ObjektenDas Neueste zurücknehmenZerstörenZufälliges ErzeugenRückblick: Feuerwerk14Abschließende Herausforderungen
MünzmagnetDie Straße überquerenStraßenverkehrTurmbauerLanden oder verfehlen3Der Inspector
Inspector-FelderSerializeFieldFließkommazahlen und MathfInspector-AttributeRückblick: Aufzug6Transformationen und Hierarchie
Eltern und KinderHisse die FlaggeSkalierungDinge anschauenAuf einen Punkt zubewegenRückblick: Mond in Umlaufbahn9Projekt: Fang den Stern
Der FängerEin fallender Stern12Der Lebenszyklus eines Skripts
Awake und StartUpdate und LateUpdateOnEnable und OnDisableDie Reihenfolge im LebenszyklusRückblick: Lifecycle LoggerÜbe selbstständig: Unity-Playground