Brugerdefinerede editorer

For at fremskynde programudviklingen kan du oprette brugerdefinerede editorer til de komponenter, du ofte bruger. Denne side viser dig, hvordan du opretter et simpelt script til at lave GameObjectsDet grundlæggende objekt i Unity-scener, som kan repræsentere figurer, rekvisitter, sceneri, kameraer, waypoints og meget mere. Et GameObject’s funktionalitet er defineret af de komponenter, der er knyttet til det. Mere info
Se i Ordliste altid se på et punkt.

  1. Opret et C#-script, og kald det “”LookAtPoint”.
  2. Åbn scriptet, og erstat dets indhold med nedenstående kode.
  3. Anknyt scriptet til et GameObject i din SceneEn Scene indeholder omgivelserne og menuerne i dit spil. Tænk på hver unik Scene-fil som en unik bane. I hver Scene placerer du dine miljøer, forhindringer og dekorationer og designer og opbygger i bund og grund dit spil i stykker. Mere info
    Se i ordliste.
//C# Example (LookAtPoint.cs)using UnityEngine;public class LookAtPoint : MonoBehaviour{ public Vector3 lookAtPoint = Vector3.zero; void Update() { transform.LookAt(lookAtPoint); }}

Når du går ind i afspilningstilstand, orienterer det GameObject, som du har knyttet scriptet til, sig nu mod de koordinater, du har indstillet til egenskaben “Look At Point”. Når du skriver Editor-scriptsEt stykke kode, der giver dig mulighed for at oprette dine egne komponenter, udløse spilbegivenheder, ændre komponentegenskaber over tid og reagere på brugerinput på den måde, du ønsker. Mere info
Se i ordliste, er det ofte nyttigt at få visse scripts til at blive udført i redigeringstilstand, mens dit program ikke kører. For at gøre dette skal du tilføje ExecuteInEditMode-attributten til klassen som her:

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

Nu, hvis du flytter GameObject i editoren eller ændrer værdierne for “Look At Point” i InspectorEt Unity-vindue, der viser oplysninger om det aktuelt valgte GameObject, aktiv eller projektindstillinger, så du kan inspicere og redigere værdierne. Mere info
Se i ordliste, GameObject opdaterer sin rotation, så det kigger på målpunktet i verdensrummet.

Makning af en brugerdefineret editor

Ovenstående demonstrerer, hvordan du kan få simple scripts til at køre under redigeringstid, men dette alene giver dig ikke mulighed for at oprette dine egne editor-værktøjer. Det næste skridt er at oprette en Custom Editor til det script, du lige har oprettet.

Når du opretter et script i Unity, arver det som standard fra MonoBehaviour, og er derfor en komponent, som du kan knytte til et GameObject. Når du placerer en komponent på et GameObject, viser inspektøren en standardgrænseflade, som du kan bruge til at se og redigere alle offentlige variabler, f.eks. et heltal, en float eller en streng.

Sådan ser Inspektøren for LookAtPoint-komponenten ud som standard:

En standardinspektør med et offentligt Vector3-felt

En brugerdefineret editor er et separat script, som erstatter dette standardlayout med de editor-kontroller, du vælger.

Sådan opretter du den brugerdefinerede editor til LookAtPoint-scriptet:

  1. Opret et nyt C#-script, og giv det navnet “LookAtPointEditor”.
  2. Åbn scriptet, og erstat dets indhold med nedenstående kode.
//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(); }}

Denne klasse skal arve fra Editor. CustomEditor-attributten oplyser Unity om, hvilken komponent den skal fungere som editor for. Attributten CanEditMultipleObjects fortæller Unity, at du kan vælge flere objekter med denne editor og ændre dem alle på samme tid.

Unity udfører koden i OnInspectorGUI den viser editoren i Inspektøren. Du kan sætte enhver GUI-kode ind her, og den fungerer på samme måde som OnGUI, men kører inde i inspektøren. Editor definerer den target-egenskab, som du kan bruge til at få adgang til det GameObject, som du inspicerer.

Sådan ser Inspector for LookAtPoint-komponenten ud med den nye editor:

Dette ligner meget (selvom “Script”-feltet nu ikke er til stede, fordi editor-scriptet ikke tilføjer nogen Inspector-kode for at vise det).

Men nu, hvor du har kontrol over, hvordan Inspektøren vises i et editorscript, kan du bruge hvilken som helst kode, du vil, til at lægge Inspektørfelterne ud, give brugeren mulighed for at justere værdierne og endda vise grafik eller andre visuelle elementer. Faktisk alle de Inspektorer, du ser i Unity Editor, herunder de mere komplekse Inspektorer som f.eks. terrænetLandskabet i din scene. Et Terrain GameObject tilføjer et stort fladt plan til din scene, og du kan bruge Terrænets inspektørvindue til at skabe et detaljeret landskab. Mere info
Se i Glossary system- og animationsimportindstillinger, er alle lavet ved hjælp af den samme API, som du har adgang til, når du opretter dine egne brugerdefinerede editorer.

Her er et simpelt eksempel, som udvider dit editor-script til at vise en meddelelse, der angiver, om målpunktet er over eller under GameObject:

//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)"); } }}

Sådan ser inspektøren for LookAtPoint-komponenten ud med meddelelsen, der viser, om målpunktet er over eller under GameObjectet.

Du har fuld adgang til alle IMGUI-kommandoer til at tegne enhver type grænseflade, herunder renderingProcessen med at tegne grafik til skærmen (eller til en rendertekstur). Som standard renderer hovedkameraet i Unity sin visning til skærmen. Mere info
Se i Ordliste Scener, der bruger et kameraEn komponent, der skaber et billede af et bestemt synspunkt i din scene. Outputtet bliver enten tegnet på skærmen eller optaget som en tekstur. Mere info
Se i ordliste inden for Editor-vinduer.

Scenevisningstilføjelser

Du kan tilføje ekstra kode til scenevisningenEn interaktiv visning af den verden, du er ved at skabe. Du bruger Scene View til at vælge og placere sceneri, figurer, kameraer, lys og alle andre typer spilobjekter. Mere info
Se i ordliste. For at gøre dette skal du implementere OnSceneGUI i din brugerdefinerede editor.

OnSceneGUI fungerer ligesom OnInspectorGUI, bortset fra at den kører i Scene view. For at hjælpe dig med at lave dine egne redigeringskontroller kan du bruge de funktioner, der er defineret i Handles-klassen. Alle funktioner deri er designet til at arbejde i 3D Scene-visninger.

//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(); } }}

Hvis du ønsker at tilføje 2D GUI-objekter (f.eks.: GUI eller EditorGUI), skal du indpakke dem i kald til Handles.BeginGUI() og Handles.EndGUI().

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.