Показать сообщение отдельно
Старый 16.01.2011, 17:33   #3
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Расширение редактора Unity

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

Сейчас я хочу рассказать о том, как создавать собственные окна на основе реализации простой функции 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(sourcetypeof(Transform));
        
GUILayout.EndHorizontal();

        
// поле для указания цели
        
GUILayout.BeginHorizontal();
        
GUILayout.Label("Target:"GUILayout.Width(120));
        
target = (Transform)EditorGUILayout.ObjectField(targettypeof(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);

    }

Результаты.
Состав проекта:


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


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


Вот в принципе и все, о чем хотел рассказать. Удачи!
(Offline)
 
Ответить с цитированием
Эти 6 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
Amatsu (21.11.2011), Fatalix3d (23.02.2011), Harter (15.01.2012), Illidan (19.01.2011), maxturbo (09.03.2011), Nuprahtor (16.01.2011)