Автор Тема: Unity3d Editor - Делаем свои расширения и инструменты  (Прочитано 12554 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Август 02, 2014, 20:30:58 pm
Прочитано 12554 раз

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Расширение Unity3d Editor
(доработки, кастомизация, свои окна, плагины, инструменты, вспомогательные утилиты, и так далее.)

Полезные ссылки по теме:
Building a Custom Inspector (Unity3d.com)
Кастомные редакторы (Custom Editors)
http://habrahabr.ru/post/122197
Создание своих собственных инструментов для редактора Unity3d
http://forum.boolean.name/showthread.php?t=14066
Написание расширений для редактора Unity3D
Unity Pro Tip: Use custom made assets as configuration files
Game Development
PropertyDrawer (Unity3d.com)
CustomPropertyDrawer in C#
Unity: make your lists functional with ReorderableList

Unity. Editor variables visualization:
<a href="http://www.youtube.com/watch?v=HshLKcZi2c0" target="_blank">http://www.youtube.com/watch?v=HshLKcZi2c0</a>

Создание своей вкладки - редактора в Unity3D
<a href="http://www.youtube.com/watch?v=l7vzREDzTMU" target="_blank">http://www.youtube.com/watch?v=l7vzREDzTMU</a>
« Последнее редактирование: Апрель 28, 2015, 05:53:18 am от Mimi Neko »

Август 02, 2014, 20:59:35 pm
Ответ #1

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Unity3d Editor - Кастомизация вкладки своего компонента (скрипта) в инспекторе

Итак, у нас есть на сцене любой гейм-объект, и на нём висит любой скрипт.
В данном случае, на нём висит скрипт  Test.cs
Если выбрать этот гейм-объект, то в панели редактора сбоку, в свойствах этого гейм-объекта, видна вкладка этого компонента.
Допустим, нам понадобилось, чтобы в этой вкладке компонента Test, была кнопка самого редактора.

Для этого, нужно создать класс кастомизации вкладки инспектора, для этого компонента.
В корне ассета создаём папку Editor (в ней будут работать скрипты и классы редактора)
И создаём там следующий класс:

Класс кастомизации инспектора, для компонента test
TestCustomize.cs:
using UnityEditor;
using UnityEngine;

[CustomEditor (typeof(Test))] //Сообщаем редактору, что это класс для кастомизации вкладки инспектора, компонента "Test"
class TestCustomize : Editor{ //Наследуем наш класс кастомизации, от редактора Юнити

public override void OnInspectorGUI(){ //Сообщаем редактору, что этот инспектор заменит прежний (встроеный)

if(GUILayout.Button("Наша кнопка")){

Debug.Log(1);
}
}
}

 - Всё! Теперь в редакторе появится кнопка, и она будет работать!
Дальше можно использовать её, по своим надобностям.


Однако, всё что было в этой вкладке инспектора компонента раньше - пропало.
Всё дело в том, что мы полностью заменили прежнее содержимое вкладки инспектора компонента на новое,
с помощью override

А чтобы просто добавить нашу кнопку, к уже имеющемуся во вкладке содержимому, нужно применить этот метод:
DrawDefaultInspector(); //отрисовка содержимого инспектора по умолчанию

Вот так:

Класс кастомизации инспектора, для компонента test
TestCustomize.cs:
using UnityEditor;
using UnityEngine;

[CustomEditor (typeof(Test))] //Сообщаем редактору, что это класс для кастомизации вкладки инспектора, компонента "Test"
class TestCustomize : Editor{ //Наследуем наш класс кастомизации, от редактора Юнити

public override void OnInspectorGUI(){ //Сообщаем редактору, что этот инспектор заменит прежний (встроеный)
DrawDefaultInspector();//отрисовка содержимого инспектора по умолчанию

if(GUILayout.Button("Наша кнопка")){

Debug.Log(1);
}
}
}
« Последнее редактирование: Август 03, 2014, 04:10:37 am от Mimi Neko »

Август 02, 2014, 22:09:11 pm
Ответ #2

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Unity3d Editor - Отступы по вертикали в инспекторе

Минимальный отступ (стандартный):
EditorGUILayout.Space();

Нулевой отступ:
GUILayout.Space(0);

Отступ на 10 пикселов:
GUILayout.Space(10);


Пример:

using UnityEditor;
using UnityEngine;

[CustomEditor (typeof(Test))] //Сообщаем редактору, что это класс для кастомизации вкладки инспектора, компонента "Test"
class TestCustomize : Editor{ //Наследуем наш класс кастомизации, от редактора Юнити

public override void OnInspectorGUI(){ //Сообщаем редактору, что этот инспектор заменит прежний (встроеный)
DrawDefaultInspector();//отрисовка содержимого инспектора по умолчанию

                            EditorGUILayout.Space();
if(GUILayout.Button("Наша кнопка")){

Debug.Log(1);
}
                            GUILayout.Space(5);
if(GUILayout.Button("Наша кнопка 2")){

Debug.Log(2);
}
}
}


« Последнее редактирование: Август 03, 2014, 00:12:04 am от Mimi Neko »

Август 02, 2014, 23:14:14 pm
Ответ #3

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Unity3d Editor - Делаем своё Pop-Up окно в редакторе

Класс кастомизации инспектора, для компонента test
TestCustomize.cs:
using UnityEditor;
using UnityEngine;

[CustomEditor (typeof(Test))]
class TestCustomize : Editor{

public override void OnInspectorGUI(){
DrawDefaultInspector();//отрисовка содержимого инспектора по умолчанию

if(GUILayout.Button("Окно", GUILayout.Width(50))){ //Кнопка шириной 50 пикселей

                                          //создаём окно, с содержимым из класса MyWindow
MyWindow window = (MyWindow)EditorWindow.GetWindow(typeof(MyWindow));
}
}
}

Класс окна MyWindow
MyWindow.cs:
using UnityEditor;
using UnityEngine;

class MyWindow : EditorWindow {

string myString = "Hello World";
bool groupEnabled;
bool myBool = true;
float myFloat = 1.23f;

void OnGUI () {
GUILayout.Label ("Base Settings", EditorStyles.boldLabel); //Подпись к полю ввода текста
myString = EditorGUILayout.TextField ("Text Field", myString); //Поле ввода текста

groupEnabled = EditorGUILayout.BeginToggleGroup ("Optional Settings", groupEnabled); //Выключаемая группа элементов
myBool = EditorGUILayout.Toggle ("Toggle", myBool); //Галочка-выключатель
myFloat = EditorGUILayout.Slider ("Slider", myFloat, -3, 3); //Слайдэр
EditorGUILayout.EndToggleGroup (); //Конец группы элементов
}
}
« Последнее редактирование: Август 03, 2014, 00:12:45 am от Mimi Neko »

Август 03, 2014, 04:10:02 am
Ответ #4

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Unity3d Editor - доступ к классам и переменным

Одна из замечательных возможностей расширений редактора Unity3d - возможность взаимодействия скриптов редактора, с классами самого проекта.
Для этого, у Юнити Редактора существует интерфейс target, через который в наш скрипт передаётся ссылка на элемент инспектора, находящийся в фокусе мыши.

Пример:
C#
MyComponentScript myTarget = (MyComponentScript)target;или
window.myTarget = (MyComponentScript)target;

JS
MyComponentScript myTarget = target;или
window.myTarget = target;
Во втором примере, ссылка на компонент, передаётся открывшемуся окну, в переменную myTarget


Пример доступа к классу кастомизируемого нами компонента, и его переменной:

Имеем гейм-объект, на котором висит компонент в виде скрипта-класса:
MyScript.cs:
using UnityEngine;

public class MyScript : MonoBehaviour {

public int test = 0;
}

В папке Editor, лежит скрипт кастомизации этого компонента MyScript.cs:

MyScriptCustomize.cs:
using UnityEditor;
using UnityEngine;

[CustomEditor (typeof(MyScript))] //Сообщаем, что кастомизируем MyScript.cs
class MyScriptCustomize : Editor{

public override void OnInspectorGUI(){
DrawDefaultInspector();//отрисовка содержимого инспектора по умолчанию

if(GUILayout.Button("Окно", GUILayout.Width(50))){

//создаём окно, с содержимым из класса MyWindow
MyWindow window = (MyWindow)EditorWindow.GetWindow(typeof(MyWindow));

window.myTarget = (MyScript)target; //Передаём в myTarget ссылку, на класс MyScript.cs
}
}
}

А также, в папке Editor, находится класс содержимого нашего открывающегося окна MyWindow:
MyWindow.cs:
using UnityEditor;
using UnityEngine;

class MyWindow : EditorWindow {

//Объявляем публичную переменную, соответствующую нашему кастомизируемому компоненту-классу MyScript.cs
public MyScript myTarget;


void OnGUI () {

if (GUILayout.Button("Доступ к классу")){

Debug.Log(myTarget);
}

if (GUILayout.Button("Чтение переменной")){

Debug.Log(myTarget.test);
}

if (GUILayout.Button("Изменение переменной")){

myTarget.test = 333;
}
}
}

Вот так мы получаем возможность, заполнять или читать содержимое полей и переменных компонентов, из наших расширений и инструментов редактора.



« Последнее редактирование: Август 03, 2014, 04:12:54 am от Mimi Neko »

Октябрь 28, 2014, 22:20:43 pm
Ответ #5

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля