Edytory niestandardowe

Aby przyspieszyć tworzenie aplikacji, utwórz edytory niestandardowe dla komponentów, których często używasz. Na tej stronie pokazano, jak utworzyć prosty skrypt do tworzenia obiektów GameObject – podstawowych obiektów w scenach Unity, które mogą reprezentować postacie, rekwizyty, scenerie, kamery, punkty orientacyjne i inne. Funkcjonalność GameObjecta jest definiowana przez dołączone do niego komponenty. Więcej informacji
Zobacz w Słowniczku zawsze patrz na punkt.

  1. Utwórz skrypt C# i nazwij go „”LookAtPoint”.
  2. Otwórz skrypt i zastąp jego zawartość poniższym kodem.
  3. Dołącz skrypt do obiektu GameObject w twojej ScenieScena zawiera środowiska i menu twojej gry. Pomyśl o każdym unikalnym pliku Sceny jak o unikalnym poziomie. W każdej Scenie umieszczasz środowiska, przeszkody i dekoracje, zasadniczo projektując i budując swoją grę w kawałkach. Więcej informacji
    Zobacz w Słowniczku.
//C# Example (LookAtPoint.cs)using UnityEngine;public class LookAtPoint : MonoBehaviour{ public Vector3 lookAtPoint = Vector3.zero; void Update() { transform.LookAt(lookAtPoint); }}

Po przejściu do trybu gry obiekt GameObject, do którego dołączyłeś skrypt, orientuje się teraz w kierunku współrzędnych ustawionych we właściwości „Look At Point”. Podczas pisania skryptów edytoraCzęść kodu, która pozwala tworzyć własne komponenty, wywoływać zdarzenia w grze, modyfikować właściwości komponentów w czasie i reagować na dane wejściowe użytkownika w dowolny sposób. Więcej informacji
Zobacz w słowniczku, często przydatne jest, aby pewne skrypty były wykonywane podczas trybu edycji, gdy aplikacja nie jest uruchomiona. Aby to zrobić, dodaj atrybut ExecuteInEditMode do klasy, jak poniżej:

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

Teraz, jeśli przesuniesz obiekt GameObject w Edytorze lub zmienisz wartości „Look At Point” w InspektorzeOkno Unity, które wyświetla informacje o aktualnie wybranym obiekcie GameObject, zasobie lub ustawieniach projektu, pozwalając na sprawdzenie i edycję wartości. Więcej informacji
Zobacz w słowniczku, GameObject aktualizuje swój obrót tak, aby patrzył na punkt docelowy w przestrzeni świata.

Utworzenie własnego edytora

Powyżej zademonstrowano, jak można uzyskać proste skrypty działające podczas edycji, jednak samo to nie pozwala na stworzenie własnych narzędzi edytora. Następnym krokiem jest stworzenie własnego edytora dla skryptu, który właśnie utworzyłeś.

Gdy tworzysz skrypt w Unity, domyślnie dziedziczy on po MonoBehaviour, a więc jest komponentem, który możesz dołączyć do obiektu GameObject. Kiedy umieścisz komponent na obiekcie GameObject, Inspektor wyświetli domyślny interfejs, którego możesz użyć do wyświetlenia i edycji każdej zmiennej publicznej, na przykład: liczby całkowitej, zmiennoprzecinkowej lub łańcuchowej.

Tak domyślnie wygląda inspektor dla komponentu LookAtPoint:

Domyślny inspektor z publicznym polem Vector3

Własny edytor jest oddzielnym skryptem, który zastępuje ten domyślny układ dowolnymi kontrolkami edytora, które wybierzesz.

Aby utworzyć niestandardowy edytor dla skryptu LookAtPoint:

  1. Utwórz nowy skrypt C# i nadaj mu nazwę „LookAtPointEditor”.
  2. Otwórz skrypt i zastąp jego zawartość poniższym kodem.
//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(); }}

Ta klasa musi dziedziczyć po klasie Editor. Atrybut CustomEditor informuje Unity, dla którego komponentu powinna pełnić rolę edytora. Atrybut CanEditMultipleObjects mówi Unity, że możesz wybrać wiele obiektów za pomocą tego edytora i zmienić je wszystkie w tym samym czasie.

Unity wykonuje kod w OnInspectorGUI to wyświetla edytor w Inspektorze. Możesz umieścić tutaj dowolny kod GUI i działa on w taki sam sposób jak OnGUI, ale działa wewnątrz Inspektora. Editor definiuje właściwość docelową, której możesz użyć, aby uzyskać dostęp do obiektu GameObject, który sprawdzasz.

Tak wygląda Inspektor dla komponentu LookAtPoint z nowym edytorem:

To wygląda bardzo podobnie (chociaż pole „Script” nie jest teraz obecne, ponieważ skrypt edytora nie dodaje żadnego kodu Inspektora, aby go wyświetlić).

Jednakże teraz, gdy masz kontrolę nad tym, jak Inspektor jest wyświetlany w skrypcie edytora, możesz użyć dowolnego kodu, aby rozłożyć pola Inspektora, umożliwić użytkownikowi dostosowanie wartości, a nawet wyświetlić grafikę lub inne elementy wizualne. W rzeczywistości wszystkie inspektory widoczne w edytorze Unity, w tym bardziej złożone inspektory, takie jak terenPejzaż w twojej scenie. Obiekt GameObject Terrain dodaje do twojej sceny dużą płaską płaszczyznę i możesz użyć okna inspektora Terrain, aby stworzyć szczegółowy krajobraz. Więcej informacji
Zobacz w Słowniczku ustawienia systemu i importu animacji, wszystkie są wykonane przy użyciu tego samego API, do którego masz dostęp podczas tworzenia własnych edytorów.

Tutaj jest prosty przykład, który rozszerza twój skrypt edytora, aby wyświetlić komunikat, który wskazuje, czy punkt docelowy znajduje się powyżej lub poniżej 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)"); } }}

Tak wygląda inspektor dla komponentu LookAtPoint z komunikatem pokazującym, czy punkt docelowy znajduje się powyżej lub poniżej GameObject.

Masz pełny dostęp do wszystkich poleceń IMGUI, aby narysować dowolny typ interfejsu, w tym renderowanieProces rysowania grafiki na ekran (lub do tekstury renderującej). Domyślnie, główna kamera w Unity renderuje swój widok na ekran. Więcej informacji
Zobacz w Słowniczku Sceny z użyciem kameryKomponent, który tworzy obraz określonego punktu widzenia w scenie. Wynik jest albo rysowany na ekranie, albo przechwytywany jako tekstura. Więcej informacji
Zobacz w Słowniczku w oknach edytora.

Dodatki do widoku sceny

Możesz dodać dodatkowy kod do widoku scenyInteraktywny widok na świat, który tworzysz. Używasz widoku sceny do wybierania i ustawiania scenerii, postaci, kamer, świateł i wszystkich innych typów obiektów gry. Więcej informacji
Zobacz w słowniczku. Aby to zrobić, zaimplementuj OnSceneGUI w swoim niestandardowym edytorze.

OnSceneGUI działa tak samo jak OnInspectorGUI, z wyjątkiem tego, że działa w widoku Sceny. Aby ułatwić sobie tworzenie własnych kontrolek edycji, możesz skorzystać z funkcji zdefiniowanych w klasie Handles. Wszystkie znajdujące się tam funkcje są przeznaczone do pracy w widokach Sceny 3D.

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

Jeśli chcesz dodać obiekty GUI 2D (na przykład: GUI lub EditorGUI), musisz zawinąć je w wywołania Handles.BeginGUI() i Handles.EndGUI().

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.