Benutzerdefinierte Editoren

Um die Anwendungsentwicklung zu beschleunigen, erstellen Sie benutzerdefinierte Editoren für Komponenten, die Sie häufig verwenden. Diese Seite zeigt Ihnen, wie Sie ein einfaches Skript erstellen, um GameObjectsDas grundlegende Objekt in Unity-Szenen, das Charaktere, Requisiten, Landschaften, Kameras, Wegpunkte und mehr darstellen kann. Die Funktionalität eines GameObjects wird durch die ihm zugeordneten Components definiert. Weitere Informationen
Siehe im Glossar immer einen Punkt an.

  1. Erstelle ein C#-Skript und nenne es „LookAtPoint“.
  2. Öffne das Skript und ersetze seinen Inhalt durch den folgenden Code.
  3. Hänge das Skript an ein GameObject in deiner Szene anEine Szene enthält die Umgebungen und Menüs deines Spiels. Stellen Sie sich jede einzelne Scene-Datei als einen eigenen Level vor. In jeder Szene platzieren Sie Ihre Umgebungen, Hindernisse und Dekorationen und entwerfen und bauen so Ihr Spiel stückweise auf. Weitere Informationen
    Siehe im Glossar.
//C# Example (LookAtPoint.cs)using UnityEngine;public class LookAtPoint : MonoBehaviour{ public Vector3 lookAtPoint = Vector3.zero; void Update() { transform.LookAt(lookAtPoint); }}

Wenn Sie in den Spielmodus wechseln, orientiert sich das Spielobjekt, an das Sie das Skript angehängt haben, an den Koordinaten, die Sie für die Eigenschaft „Look At Point“ festgelegt haben. Beim Schreiben von Editor-SkriptenEin Stück Code, mit dem Sie Ihre eigenen Komponenten erstellen, Spielereignisse auslösen, Komponenteneigenschaften im Laufe der Zeit ändern und auf Benutzereingaben reagieren können, wie Sie wollen. Weitere Informationen
Siehe im Glossar, es ist oft nützlich, bestimmte Skripte im Bearbeitungsmodus auszuführen, während die Anwendung nicht läuft. Dazu fügen Sie der Klasse das Attribut ExecuteInEditMode hinzu, etwa so:

//C# Example (LookAtPoint.cs)using UnityEngine;public class LookAtPoint : MonoBehaviour{ public Vector3 lookAtPoint = Vector3.zero; void Update() { transform.LookAt(lookAtPoint); }}

Wenn Sie nun das GameObject im Editor verschieben oder die Werte von „Look At Point“ im InspectorEin Unity-Fenster, das Informationen über das aktuell ausgewählte GameObject, Asset oder die Projekteinstellungen anzeigt und Ihnen erlaubt, die Werte zu überprüfen und zu bearbeiten. Mehr Infos
Siehe im Glossar, das GameObject aktualisiert seine Rotation, so dass es den Zielpunkt im Weltraum anschaut.

Einen eigenen Editor erstellen

Das oben genannte Beispiel zeigt, wie man einfache Skripte während der Editierzeit laufen lassen kann, aber das allein erlaubt es nicht, eigene Editor-Tools zu erstellen. Der nächste Schritt besteht darin, einen benutzerdefinierten Editor für das soeben erstellte Skript zu erstellen.

Wenn Sie ein Skript in Unity erstellen, erbt es standardmäßig von MonoBehaviour und ist daher eine Komponente, die Sie an ein GameObject anhängen können. Wenn Sie eine Komponente an ein GameObject anhängen, zeigt der Inspector eine Standardschnittstelle an, mit der Sie jede öffentliche Variable anzeigen und bearbeiten können, z. B. einen Integer, einen Float oder einen String.

So sieht der Inspector für die LookAtPoint-Komponente standardmäßig aus:

Ein Standard-Inspector mit einem öffentlichen Vector3-Feld

Ein benutzerdefinierter Editor ist ein separates Skript, das dieses Standard-Layout durch beliebige Editor-Steuerelemente ersetzt, die Sie auswählen.

So erstellen Sie den benutzerdefinierten Editor für das LookAtPoint-Skript:

  1. Erstellen Sie ein neues C#-Skript und nennen Sie es „LookAtPointEditor“.
  2. Öffnen Sie das Skript und ersetzen Sie seinen Inhalt durch den folgenden Code.
//C# Example (LookAtPointEditor.cs)using UnityEngine;using UnityEditor;public class LookAtPointEditor : Editor { SerializedProperty lookAtPoint; void OnEnable() { lookAtPoint = serializedObject.FindProperty("lookAtPoint"); } public override void OnInspectorGUI() { serializedObject.Update(); EditorGUILayout.PropertyField(lookAtPoint); serializedObject.ApplyModifiedProperties(); }}

Diese Klasse muss von Editor erben. Das Attribut CustomEditor teilt Unity mit, für welche Komponente es als Editor fungieren soll. Das CanEditMultipleObjects-Attribut teilt Unity mit, dass man mit diesem Editor mehrere Objekte auswählen und sie alle gleichzeitig ändern kann.

Unity führt den Code in OnInspectorGUI aus und zeigt den Editor im Inspector an. Sie können hier jeden beliebigen GUI-Code einfügen und er funktioniert genauso wie OnGUI, wird aber innerhalb des Inspectors ausgeführt. Editor definiert die Zieleigenschaft, mit der man auf das zu inspizierende GameObject zugreifen kann.

So sieht der Inspector für die LookAtPoint-Komponente mit dem neuen Editor aus:

Dies sieht sehr ähnlich aus (obwohl das Feld „Script“ jetzt nicht vorhanden ist, weil das Editor-Skript keinen Inspector-Code hinzufügt, um es anzuzeigen).

Da Sie nun jedoch die Kontrolle darüber haben, wie der Inspektor in einem Editor-Skript angezeigt wird, können Sie jeden beliebigen Code verwenden, um die Felder des Inspektors anzuordnen, dem Benutzer die Anpassung der Werte zu ermöglichen und sogar Grafiken oder andere visuelle Elemente anzuzeigen. Tatsächlich werden alle Inspektoren, die Sie im Unity-Editor sehen, einschließlich der komplexeren Inspektoren wie dem TerrainDie Landschaft in Ihrer Szene. Ein Terrain GameObject fügt deiner Szene eine große flache Ebene hinzu und du kannst das Terrain Inspector Fenster benutzen, um eine detaillierte Landschaft zu erstellen. Weitere Informationen
Siehe im Glossar System- und Animationsimporteinstellungen, werden alle mit der gleichen API vorgenommen, auf die Sie Zugriff haben, wenn Sie Ihre eigenen benutzerdefinierten Editoren erstellen.

Hier ist ein einfaches Beispiel, das Ihr Editor-Skript erweitert, um eine Meldung anzuzeigen, die angibt, ob der Zielpunkt über oder unter dem GameObject liegt:

//C# Example (LookAtPointEditor.cs)using UnityEngine;using UnityEditor;public class LookAtPointEditor : Editor{ SerializedProperty lookAtPoint; void OnEnable() { lookAtPoint = serializedObject.FindProperty("lookAtPoint"); } public override void OnInspectorGUI() { serializedObject.Update(); EditorGUILayout.PropertyField(lookAtPoint); serializedObject.ApplyModifiedProperties(); if (lookAtPoint.vector3Value.y > (target as LookAtPoint).transform.position.y) { EditorGUILayout.LabelField("(Above this object)"); } if (lookAtPoint.vector3Value.y < (target as LookAtPoint).transform.position.y) { EditorGUILayout.LabelField("(Below this object)"); } }}

So sieht der Inspektor für die LookAtPoint-Komponente aus, mit der Meldung, die anzeigt, ob der Zielpunkt über oder unter dem GameObject liegt.

Sie haben vollen Zugriff auf alle IMGUI-Befehle, um jede Art von Oberfläche zu zeichnen, einschließlich RenderingDer Prozess des Zeichnens von Grafiken auf den Bildschirm (oder auf eine Rendertextur). Standardmäßig rendert die Hauptkamera in Unity ihre Ansicht auf den Bildschirm. Weitere Informationen
Siehe Glossar Szenen mit einer KameraEine Komponente, die ein Bild eines bestimmten Blickpunkts in Ihrer Szene erstellt. Die Ausgabe wird entweder auf den Bildschirm gezeichnet oder als Textur erfasst. Weitere Informationen
Siehe im Glossar innerhalb der Editor-Fenster.

Szenenansicht-Zusätze

Sie können der Szenenansicht zusätzlichen Code hinzufügenEine interaktive Ansicht der Welt, die Sie erstellen. Sie verwenden die Szenenansicht, um Kulissen, Charaktere, Kameras, Lichter und alle anderen Arten von Spielobjekten auszuwählen und zu positionieren. Mehr Infos
Siehe im Glossar. Um dies zu tun, implementieren Sie OnSceneGUI in Ihrem benutzerdefinierten Editor.

OnSceneGUI funktioniert genau wie OnInspectorGUI, außer dass es in der Szenenansicht läuft. Um Ihnen bei der Erstellung Ihrer eigenen Bearbeitungssteuerungen zu helfen, können Sie die in der Handles-Klasse definierten Funktionen verwenden. Alle darin enthaltenen Funktionen sind für die Arbeit in 3D-Szenenansichten konzipiert.

//C# Example (LookAtPointEditor.cs)using UnityEngine;using UnityEditor;public class LookAtPointEditor : Editor{ SerializedProperty lookAtPoint; void OnEnable() { lookAtPoint = serializedObject.FindProperty("lookAtPoint"); } public override void OnInspectorGUI() { serializedObject.Update(); EditorGUILayout.PropertyField(lookAtPoint); if (lookAtPoint.vector3Value.y > (target as LookAtPoint).transform.position.y) { EditorGUILayout.LabelField("(Above this object)"); } if (lookAtPoint.vector3Value.y < (target as LookAtPoint).transform.position.y) { EditorGUILayout.LabelField("(Below this object)"); } serializedObject.ApplyModifiedProperties(); } public void OnSceneGUI() { var t = (target as LookAtPoint); EditorGUI.BeginChangeCheck(); Vector3 pos = Handles.PositionHandle(t.lookAtPoint, Quaternion.identity); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(target, "Move point"); t.lookAtPoint = pos; t.Update(); } }}

Wenn Sie 2D-GUI-Objekte (z. B. GUI oder EditorGUI) hinzufügen möchten, müssen Sie diese in Aufrufe von Handles.BeginGUI() und Handles.EndGUI() verpacken.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.