Anpassade redigerare

För att snabba upp programutvecklingen kan du skapa anpassade redigerare för komponenter som du ofta använder. Den här sidan visar hur du skapar ett enkelt skript för att göra GameObjectsDet grundläggande objektet i Unity-scener, som kan representera karaktärer, rekvisita, landskap, kameror, waypoints med mera. Ett GameObjects funktionalitet definieras av de komponenter som är kopplade till det. Mer information
Se i Ordlista alltid titta på en punkt.

  1. Skapa ett C#-skript och namnge det ””LookAtPoint””.
  2. Öppna skriptet och byt ut dess innehåll mot koden nedan.
  3. Fäst skriptet till ett GameObject i din SceneEn Scene innehåller miljöerna och menyerna i ditt spel. Tänk på varje unik Scene-fil som en unik nivå. I varje Scene placerar du dina miljöer, hinder och dekorationer, vilket i princip innebär att du utformar och bygger ditt spel i bitar. Mer information
    Se i Ordlista.
//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 in i spelläget orienterar sig det GameObject som du kopplade skriptet till nu mot de koordinater som du ställde in på egenskapen ”Look At Point”. När du skriver Editor-skriptEn del av koden som gör att du kan skapa egna komponenter, utlösa spelhändelser, ändra komponentegenskaper över tiden och reagera på användarinmatning på det sätt du vill. Mer information
Som du ser i Ordlista är det ofta användbart att få vissa skript att exekveras under redigeringsläget, medan programmet inte körs. För att göra detta lägger du till attributet ExecuteInEditMode till klassen, så här:

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

Nu om du flyttar GameObject i editorn eller ändrar värdena för ”Look At Point” i InspectorEtt Unity-fönster som visar information om det för tillfället valda GameObjectet, tillgången eller projektinställningarna, så att du kan inspektera och redigera värdena. Mer information
Se i ordlistan, GameObject uppdaterar sin rotation så att den tittar på målpunkten i världsrymden.

Makning av en egen Editor

Ovanstående visar hur du kan få enkla skript att köras under redigeringstid, men detta i sig självt gör det inte möjligt för dig att skapa dina egna Editor-verktyg. Nästa steg är att skapa en Custom Editor för det skript du just skapat.

När du skapar ett skript i Unity ärver det som standard från MonoBehaviour och är därför en komponent som du kan koppla till ett GameObject. När du placerar en komponent på en GameObject visar inspektören ett standardgränssnitt som du kan använda för att visa och redigera varje offentlig variabel, till exempel: ett heltal, en float eller en sträng.

Så här ser inspektorn för LookAtPoint-komponenten ut som standard:

En standardinspektor med ett offentligt Vector3-fält

En anpassad redigerare är ett separat skript som ersätter den här standardlayouten med de redigeringskontroller som du väljer.

För att skapa den anpassade editorn för skriptet LookAtPoint:

  1. Skapa ett nytt C#-skript och namnge det ”LookAtPointEditor”.
  2. Öppna skriptet och ersätt dess innehåll med koden nedan.
//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(); }}

Den här klassen måste ärva från Editor. Attributet CustomEditor informerar Unity om vilken komponent den ska fungera som redaktör för. Attributet CanEditMultipleObjects talar om för Unity att du kan välja flera objekt med den här editorn och ändra dem alla samtidigt.

Unity utför koden i OnInspectorGUI den visar editorn i inspektorn. Du kan lägga in vilken GUI-kod som helst här och den fungerar på samma sätt som OnGUI, men körs inne i inspektorn. Editor definierar den målegenskap som du kan använda för att få tillgång till det GameObject som du inspekterar.

Så här ser Inspector för LookAtPoint-komponenten ut med den nya editorn:

Det här ser väldigt likt ut (även om fältet ”Script” nu inte finns med, eftersom editor-skriptet inte lägger till någon Inspector-kod för att visa det).

Men nu när du har kontroll över hur inspektorn visas i ett redigeringsskript kan du använda vilken kod du vill för att lägga ut inspektorfälten, låta användaren justera värdena och till och med visa grafik eller andra visuella element. Faktum är att alla Inspectors som du ser i Unity Editor, inklusive de mer komplexa Inspectors som t.ex. terrainThe landscape i din scen. Ett Terrain GameObject lägger till ett stort platt plan i din scen och du kan använda Terrängens inspektionsfönster för att skapa ett detaljerat landskap. Mer information
Se i Ordlista system- och animationsimportinställningar, görs alla med samma API som du har tillgång till när du skapar dina egna anpassade redaktörer.

Här är ett enkelt exempel som utökar ditt redaktörsskript för att visa ett meddelande som indikerar om målpunkten är ovanför eller nedanför 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å här ser inspektorn för LookAtPoint-komponenten ut med meddelandet som visar om målpunkten är ovanför eller nedanför GameObject.

Du har full tillgång till alla IMGUI-kommandon för att rita alla typer av gränssnitt, inklusive renderingProcessen att rita grafik till skärmen (eller till en rendertextur). Som standard renderar huvudkameran i Unity sin vy till skärmen. Mer information
Se i Ordlista Scener som använder en kameraEn komponent som skapar en bild av en viss vypunkt i din scen. Utgången ritas antingen till skärmen eller fångas som en textur. Mer information
Se i Ordlista inom Editor-fönster.

Scenvyns tillägg

Du kan lägga till extra kod till scenvynEn interaktiv vy i den värld du skapar. Du använder scenvyn för att välja och placera landskap, karaktärer, kameror, ljus och alla andra typer av spelobjekt. Mer information
Se i ordlistan. För att göra detta implementerar du OnSceneGUI i din anpassade editor.

OnSceneGUI fungerar precis som OnInspectorGUI förutom att den körs i Scene view. För att hjälpa dig att skapa egna redigeringskontroller kan du använda de funktioner som definieras i klassen Handles. Alla funktioner där är utformade för att arbeta i 3D-scenevyer.

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

Om du vill lägga till 2D GUI-objekt (till exempel: GUI eller EditorGUI) måste du linda in dem i anrop till Handles.BeginGUI() och Handles.EndGUI().

Lämna ett svar

Din e-postadress kommer inte publiceras.