Unity 6.3
0 онлайн 20 гостей 3 в системе
Вход

Создание пользовательских редакторов с помощью IMGUI

Примечание: Настоятельно рекомендуется использовать UI Toolkit для расширения Unity Editor, так как это более современное, гибкое и масштабируемое решение, чем IMGUI.

Чтобы ускорить разработку приложения, создайте пользовательские редакторы для часто используемых компонентов. На этой странице показано, как создать простой скрипт, чтобы GameObjects всегда смотрел на точку.

  1. Создайте скрипт C# и дайте ему имя “LookAtPoint”.
  2. Откройте скрипт и замените его содержимое на код, приведенный ниже.
  3. Прикрепите скрипт к GameObject в вашем Scene.
using UnityEngine;
public class LookAtPoint : MonoBehaviour
{
    public Vector3 lookAtPoint = Vector3.zero;

    void Update()
    {
        transform.LookAt(lookAtPoint);
    }
}

При входе в режим воспроизведения, GameObject При написании скриптов редактора, часто полезно сделать так, чтобы некоторые скрипты выполнялись в то время, как другие скрипты выполняются в другое время. Режим редактирования, пока ваше приложение не работает. Для этого добавьте ExecuteInEditMode атрибут к классу вот так:

using UnityEngine;
[ExecuteInEditMode]
public class LookAtPoint : MonoBehaviour
{
    public Vector3 lookAtPoint = Vector3.zero;

    void Update()
    {
        transform.LookAt(lookAtPoint);
    }
}

Теперь при перемещении GameObject в Editor или изменении значений Look At Point в Inspector GameObject обновляет свой поворот, чтобы смотреть на целевую точку в мировом пространстве.

Создание пользовательского редактора

Вышеописанное демонстрирует, как можно запустить простые скрипты во время редактирования, однако это само по себе не позволяет вам создавать собственные инструменты Редактора. Следующим шагом является создание Пользовательского Редактора для только что созданного скрипта.

Скрипт, созданный в Unity, по умолчанию наследует MonoBehaviour и потому является компонентом, который можно прикрепить к GameObject. Когда вы помещаете компонент на GameObject, Inspector показывает стандартный интерфейс, где можно просматривать и менять каждую открытую переменную — например, целое число, число с плавающей запятой или строку.

Вот как по умолчанию выглядит Inspector для компонента LookAtPoint:

A default Inspector with a public Vector3 field
Инспектор по умолчанию с открытым полем Vector3

Настраиваемый редактор — это отдельный скрипт, который заменяет эту раскладку по умолчанию любыми элементами управления редактора, которые вы выберете.

Чтобы создать пользовательский редактор для скрипта LookAtPoint:

  1. Создайте новый скрипт C# и назовите его “LookAtPointEditor”.
  2. Откройте скрипт и замените его содержимое на код, приведенный ниже.
using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(LookAtPoint))]
[CanEditMultipleObjects]
public class LookAtPointEditor : Editor 
{
    SerializedProperty lookAtPoint;
    
    void OnEnable()
    {
        lookAtPoint = serializedObject.FindProperty("lookAtPoint");
    }

    public override void OnInspectorGUI()
    {
        serializedObject.Update();
        EditorGUILayout.PropertyField(lookAtPoint);
        serializedObject.ApplyModifiedProperties();
    }
}

Этот класс должен наследоваться от Редактор. CustomEditor атрибут сообщает Unity, для какого компонента он должен действовать в качестве редактора. CanEditMultipleObjects атрибут сообщает Unity, что вы можете выбрать несколько объектов с помощью этого редактора и изменить их все одновременно.

Unity выполняет код в OnInspectorGUI и отображает редактор в Inspector. Вы можете вставить любой код GUI, и он работает так же, как и OnGUI, но выполняется внутри Inspector. Редактор определяет свойство target, которое вы можете использовать для доступа к GameObject, который вы проверяете.

Вот как выглядит Inspector для компонента LookAtPoint в новом редакторе:

Компонент Look At Point в новом редакторе
Компонент Look At Point в новом редакторе

Это выглядит очень похоже (хотя поле «Скрипт» теперь не присутствует, потому что скрипт редактора не добавляет никакого кода Inspector для его отображения).

Однако теперь, когда у вас есть контроль над тем, как Inspector отображается в скрипте Редактора, вы можете использовать любой код, который вам нравится, чтобы расположить поля Inspector, позволить пользователю настраивать значения и даже отображать графику или другие визуальные элементы. На самом деле, все инспекторы, которые вы видите в Unity Editor, включая более сложные инспекторы, такие как система местности и настройки импорта анимации, все сделаны с использованием того же API, к которому вы имеете доступ при создании своих собственных пользовательских редакторов.

Вот простой пример, который расширяет ваш скрипт редактора для отображения сообщения, указывающего, находится ли точка назначения выше или ниже GameObject:

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(LookAtPoint))]
[CanEditMultipleObjects]
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)");
        }
    }
}

Вот как выглядит Inspector для компонента LookAtPoint с сообщением, показывающим, находится ли цель выше или ниже GameObject.

Компонент в Inspector теперь включает информацию о расположении целей относительно GameObject
Компонент в Inspector теперь включает информацию о местоположении цели относительно GameObject

Вам доступны все команды IMGUI, позволяющие отрисовать интерфейс любого вида, включая рендеринг сцен камерой прямо в окнах редактора.

Scene Просмотр добавлений

Вы можете добавить дополнительный код к представлению Scene. Для этого реализуйте OnSceneGUI в вашем пользовательском редакторе.

OnSceneGUI работает точно так же, как OnInspectorGUI, за исключением того, что он запускается в представлении Scene. Чтобы помочь вам создать собственные элементы управления редактированием, вы можете использовать функции, определенные в Handles класс. Все его функции рассчитаны на работу в 3D-окнах Scene.

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(LookAtPoint))]
[CanEditMultipleObjects]
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();
        }
    }
}

Если вы хотите добавить объекты 2D GUI (например: GUI или EditorGUI), вам нужно обернуть их в вызовах Handles.BeginGUI() и Handles.EndGUI().