Статьи:Расширение редактора (Часть 2)

Материал из Blitz3D to Unity3D Wiki Project
Перейти к: навигация, поиск

Продолжаем расширять редактор.

Сейчас я хочу рассказать о том, как создавать собственные окна на основе реализации простой функции LookAt.

Я честно говоря не знаю, есть ли такая нативная функция (сочетание клавиш). Но на ее примере очень легко продемонстрировать то, как можно расширять редактор своими утилитами.

Итак что мы должны сделать, чтобы создать собственное окошко:

  1. Создать класс унаследованный от класса EditorWindow, который находится в пространстве имен UnityEditor.
  2. Добавить статический метод создания окна.
  3. Пометить этот метод атрибутом MenuItem, чтобы зарегистрировать его в контекстном меню редактора.
  4. Реализовать у класса метод OnGUI, выполняющий отрисовку содержимого.
  5. Не забыть положить свой созданный класс в папку с названием Editor, т.к. это расширение редактора.


Итак реализация:

LookAtWindow.cs

using UnityEngine;
using UnityEditor;

public class LookAtWindow : EditorWindow
{

    // Регистрируем пункт меню и функцию, выполняющую открытие окна
    [MenuItem("Window/Look At Window")]
    public static void CreateWindow()
    {
        LookAtWindow window = GetWindow<LookAtWindow>();
        window.title = "Look At Window";
    }

    // объект для поворота
    public Transform source;
    // цель
    public Transform target;

    // Функция отрисовки окна
    public void OnGUI()
    {
        // поле для указания исходного объекта
        GUILayout.BeginHorizontal();
        GUILayout.Label("Source:", GUILayout.Width(120));
        source = (Transform)EditorGUILayout.ObjectField(source, typeof(Transform));
        GUILayout.EndHorizontal();

        // поле для указания цели
        GUILayout.BeginHorizontal();
        GUILayout.Label("Target:", GUILayout.Width(120));
        target = (Transform)EditorGUILayout.ObjectField(target, typeof(Transform));
        GUILayout.EndHorizontal();

        // запоминаем текущий цвет GUI для восстановления
        Color oldColor = GUI.color;

        // проверяем наричие объекта для поворота и цели
        bool flag = false;
        if (source == null || target == null)
        {
            GUI.color = Color.red;
            GUILayout.Label("Selcect Source and Target!");
            flag = true;
            GUI.color = oldColor;
        }

        // если цель является объектом
        if ((source == target) && !flag)
        {
            GUI.color = Color.red;
            GUILayout.Label("Source equals Target!");
            GUI.color = oldColor;
        }

        // Делаем кнопку неактивной если не выполняется условие
        GUI.enabled = !flag && (source != target);

        // свободное место
        GUILayout.FlexibleSpace();

        // кнопка, выполняющая действие
        if (GUILayout.Button("Look At"))
        {
            source.LookAt(target);
        }

        // снова активируем GUI
        GUI.enabled = true;
        GUILayout.Space(8);

    }
}

Результаты.

Состав проекта:

6ecbca55faac1ce5f10db0ce84313c49.png

Контекстное меню:

87e56471ce8267b9db63772e2c715a0e.png

Само окно встроенное в оболочку:

b5aafa6cc7a0e1c406ac46621561cb9d.png

Вот в принципе и все, о чем хотел рассказать. Удачи!