Fehlende Komponenten
Teil des Abschnitts Unity-Scripting: Grundlagen der Unity-Journey von Coddy. Lektion 45 von 85.
Wenn sich die angeforderte Komponente nicht am Objekt befindet, hält dich GetComponent nicht davon ab. Im Editor gibt es einen Platzhalter zurück, der mit null gleichwertig ist, und Unity löst eine Ausnahme aus, sobald dein Code ihn zum ersten Mal verwendet. Dieser Ball sollte hüpfen, wenn die Leertaste gedrückt wird, aber niemand hat ihm ein Rigidbody hinzugefügt:
Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * 300f);
}
}Beim Drücken der Leertaste wird MissingComponentException: There is no 'Rigidbody' attached to the "Ball" game object, but a script is trying to access it. ausgegeben. Die Meldung nennt den fehlenden Typ und das Objekt. Füge die Komponente entweder im Inspector hinzu oder frage vorher nach, wenn dem Objekt die Komponente absichtlich fehlen kann. TryGetComponent(out rb) gibt true zurück und weist rb einen Wert zu, wenn die Komponente vorhanden ist, und gibt false ohne Fehler zurück, wenn sie fehlt (out ermöglicht es der Methode, über die Variable einen Wert zurückzugeben):
bool canHop;
void Start()
{
canHop = TryGetComponent(out rb);
}Update() bringt den Ball dann nur mit if (canHop) zum Hüpfen. Außerhalb des Editors, in einem erstellten Spiel, gibt GetComponent stattdessen ein einfaches null zurück. Derselbe Fehler zeigt sich dort also als NullReferenceException.
Aufgabe
MittelLamp2 hat kein Light: Lass Space es überspringen und zeige an, dass die Lampe kaputt ist.
- Ersetze in
Start()dieGetComponent-Zeile durchhasBulb = TryGetComponent(out bulb);und füge ein Feldbool hasBulb;hinzu. - Färbe die Lampe, wenn
hasBulbfalse ist:GetComponent<Renderer>().material.color = Color.gray;. - Schalte in
Update()das Licht nur ein, wennhasBulbtrue ist.
Drücke „Spielen“ und drücke Space: Die intakten Lampen schalten sich um, ohne dass ein Fehler auftritt. Drücke dann „Prüfen“.
Probier es selbst
using UnityEngine;
public class LampSwitch : MonoBehaviour
{
Light bulb;
void Start()
{
bulb = GetComponent<Light>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
bulb.enabled = !bulb.enabled;
}
}
}
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