C# — Unity custom editor window Как добавить Картинку


C# — Unity custom editor window Как добавить Картинку

В прошлом уроке мы рассмотрели проверку вводимых данных через скрипт пользовательского редактора.
Но этот скрипт для одного конкретного компонента.
А если у нас много компонентов, для которых нужны однотипные проверки?
Для этого создаются атрибуты.

Рассмотрим наш класс юнита:

Поле «_health» может принимать значения в диапазоне от 0 до 100.
Для таких случаев существует атрибут «Range».
Передаём ему минимальное и максимальное значение, поле отображается в виде слайдера и мы не сможем выйти за диапазон. С «_health» всё отлично, идём дальше.

Поле «_price» не может быть меньше 1. Ограничений по максимуму нет, поэтому атрибут «Range» тут не поможет.

Можно было бы использовать в качестве максимального значения int.MaxValue или какое-то другое разумное значение, но слайдер крайне неудобен при больших диапазонах.

В поле «min» будет храниться минимальное значение, с которым мы и будем сверять значение переменной, к которой применяем атрибут.
Конструктор вызывается при применении атрибута.
Теперь нужно описать отображение и проверку поля с этим атрибутом. Для этого нужно создать скрипт редактора с классом-наследником от PropertyDrawer:

В «CustomPropertyDrawer» указывается атрибут, к которому применяется данный отрисовщик.
Переопределённый метод «OnGUI» будет вызываться Unity при отображении поля, к которому применён наш атрибут.
Функция имеет три параметра:
«position» — позиция и размер, заданные пользователем или рассчитанные Unity (при использовании EditorGUILayout).

В отрисовщике, из соображений производительности, не рекомендуется использовать EditorGUILayout. Но этого и не требуется, т.к. позиция всегда передаётся в параметре.

С помощью свойства «attribute» мы получаем экземпляр нашего атрибута, т.е тот, в котором хранится минимальное значение именно для этого поля.
Отображаем поле уже знакомым нам методом «PropertyField».
Далее для каждого типа ограничиваем минимальное значение с помощью Mathf.Max.
Применяем к нашему полю «_price»: Внешне в редакторе изменений нет, но теперь нельзя указать значение меньше 1.

Переходим к полю «_name» и создадим новый атрибут. «defaultValue» — значение «по-умолчанию», которое мы задаём при применении атрибута.
Создаём для него отрисовщик: Здесь мы проверяем значение поля и, если оно пустое, то присваиваем значение по-умолчанию.
Теперь мы может применять это атрибут к любым строковым полям.

А что, если применить атрибут к полю типа int (или любого другого не строкового типа)?
В консоль посыпятся ошибки, что «тип не поддерживает строковое значение».
Избежать этого можно двумя способами:

  1. Проверять тип поля после вывода и, если тип строковый, производим проверки.
  2. Проверять тип поля до вывода и, если он не стоковый, вместо поля выводить сообщение, что атрибут только для строковых полей.

Но это уже попробуйте сами :)

В качестве «домашнего задания» можете создать атрибуты:

  1. Ограничивающий максимальное значение.
  2. Удаляющий пробелы в начале и в конце.

Как заменить картинку в unity?

Всем привет.
Есть ui image Хочу чтобы при событьи картинка была заменена. Как это сделать? С другими было проще(text) а тут не знаю.

  • Вопрос задан более двух лет назад

  • 1569 просмотров

Как вам уже и укзали UI.Image.sprite
только вот не Sprite, а sprite
И настроики импорта у текстуры/изображения должны быть именно для спраита, не текустура по умолчанию как стоит.

Другими словами вы не сможете впихнуть в UI текстуру, но сможете спраит.

Вот мой код
using UnityEngine.UI;
Здесь я пробовал public sprite и prublic image и public transform без толку.
public Image img1;

Здесь тоже пробывал всякие разные решения. тоже без толку. Особенно на sprite ошибку выдает. когда хочу в ручную прописать sprite. из доступного таблиста его просто нет. Вчера сидел и обновил unity и VS в надежде что исправится. другие утверждают что все работает. а у меня ругается на sprite.

Кастомные редакторы для Unity3D, которые мы используем в игре

Unity — сказочный движок.

Иногда эта сказка добрая — про пони и радугу. А иногда — про страшного бабайку. И очень важная часть данного движка, а именно расширения для редактора (custom inspectors) — как раз про бабайку. В статье я бы хотел поделиться опытом использования собственных расширений на примере нашей игры.

Начнём с определения. Вот, что говорится в документации про расширения: «Unity позволяет вам расширить редактор своими собственными инспекторами и окнами редактора (Editor Windows), и вы можете задать, как свойства должны отображаться и инспектора при помощи пользовательского Property Drawers».

То есть имеем три основных типа для расширения функциональности, наследуемые от базовых классов:

  • UnityEditor.Editor;
  • UnityEditor.EditorWindow;
  • UnityEditor.PropertyDrawer.

И сразу же первая загвоздка — все расширения делаются только с помощью кода. Никакого визуального программирования и блок-схем, WYSIWYG, перетаскивания кнопочек по формочкам. Только C #, только хардор. Изменил размер кнопки — будь добр пересобрать весь проект, чтобы увидеть изменения. Соответственно, написать новое расширение или поправить скаченное из Asset Store не программисту — практически непосильная задача.

Первый тип (Editor) используется для того, чтобы сказать Unity «как отобразить класс». Это может быть ScriptableObject или MonoBehaviour. Используется чаще всего, по крайне мере у нас. Второй (EditorWindow) — может быть использован для отображения почти любого содержимого в пределах нового окна, за которое он отвечает. Третий (PropertyDrawer) отвечает на вопрос «как отобразить параметр». Причём это может быть как один из стандартных типов параметров, так и свой собственный.


Для каждого из типов расширений можно найти по небольшому «Hello World» в документации. Но чтобы сделать действительно полезное, удобное и красивое расширение, придётся ещё постараться. Связано это, во-первых, с наличием огромного числа недокументированных и внутренних (Internal) функций движка, которые можно использовать.

Во-вторых, с большим количеством багов и общей неинтуитивностью подсистемы. В-третьих, почти все статьи про расширения на английском или вообще иероглифы. Если с английским лично я ещё могу справится, то китайский поддается только Google-переводчику, что слабо помогает общему усвоению информации. Именно поэтому сделать что-то сложнее двух дополнительных кнопок — сродни алхимии и чёрной магии. Но когда это нас останавливало?

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

PropertyDrawer

Здесь, как раз, ничего сильно интересного у нас нет. Просто для примера — отображение свойства неактивным, если объект на сцене. И возможность редактировать свойство, если объект является префабом.

Эта функция используется для свойств-идентификаторов объектов. Что-то типа ИД, необходимого для сериализации/десериализации структуры уровня. Защита от самого себя, чтобы не поменять идентификатор во время сборки уровня в редакторе. Если так сделать — уровень сохранится, но загружаться не будет.

Еще есть PropertyDrawer для класса «Координаты X и Y» — вместо двух строчек выводит в одну. Ещё один — для отображения коллекции string в виде выпадающего списка.

EditorWindow

Здесь уже интереснее. Кастомное окно у нас одно. Используется как основной способ редактирования уровня. Весь код я приводить, конечно, не буду. Из интересного можно выделить пару моментов.

Первый — получение картинки-превью префаба. То есть той картинки, которая отображается в самом редакторе Unity. Реализуется с помощью одного метода AssetPreview.GetAssetPreview(gameObject).

Цукерберг рекомендует:  Создание простейшего REST-сервера на JavaScript с Node.js

Второй — центрирование камеры в SceneView к выбранной ячейке.

Editor

Здесь начинается самое интересное. Во-первых, был реализован универсальный базовый кастомный эдитор, который выводит в начало своей верстки короткое информационное сообщение. Это может быть просто текст подсказки, предупреждение или сообщение об ошибке. В зависимости от типа сообщения, блок с текстом отображается индивидуально. Визуально выглядит так.

Дальше от него наследуются все остальные кастомные эдиторы. Самые «толстые» у нас — это ContentPackEditor, LevelEditor, LocalizationEditor, GameFieldEditor. Каждый от 200 до 300 строк кода. Опять же, приводить код каждого смысла не имеет. Расскажу только про интересные моменты.

Для ContentPackEditor нужны были функции визуальной сортировки элементов массива. И они в Unity есть, это ReorderableList в UnityEditorInternal. Вот статья по основам использования.

От себя я добавил сворачивание/разворачивание списка при клике на заголовок.

В LocalizationEditor надо было сделать что-то вроде таблицы, чтобы чётные и нечётные сроки выводились разным цветом. Решается это заведением двух разных стилей.

Вторым проблемным моментом было сделать поиск в уже добавленных ключах локализации и мгновенный вывод результатов в виде выпадающего списка под строкой поиска. Вот для этого найти решение было действительно непросто. В итоге нашёлся метод на каком-то китайском сайте с иероглифами. Хорошо, что код — он и в Африке (Китае) код.


Путём небольшой доработки напильником стало выглядеть вот так.

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

Почитать статью без картинок, зато с объемным кодом на C # можно на форуме.

Подписывайтесь, комментируйте, покупайте нашу игру.

Материал опубликован пользователем.
Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Пытаться делать в редакторе Юнити вещи, для которых он не предназначен — плохая идея. Вы гробите туеву хучу времени на борьбу с API и UI, вместо того, что бы задействовать сторонние тулсы, написав импорт данных в пару десятков строк.

На примере вашего локализатора — да боже мой, импорт из Excel был бы в 1000 раз удобнее.

Только пожалуйста, не надо писать очередные десериализаторы XML, json и прочих сторонних форматов! И уж тем более, класть их потом в папку Resources (почему-то очень популярный у начинающих разработчиков варварский подход). ScriptableObject сериализируется в прекрасный и читаемый YAML, и большинство гейм-дизайнеров скажут вам только спасибо, если игровые данные можно будет отредактировать сразу в движке, не занимаясь никакими импортами – а удобство гейм-дизайнеров это всегда основная задача разработчиков тулзов.

Локализация это, пожалуй, единственный пример где импорта стороннего формата имеет смысл, ведь локализаторы это сторонняя компания. Но и при работе с локализацией гейм-дизайнеров должны писать исходные тексты на «основном» языке, пока контент не готов к отправке на перевод, прямо в движке.

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

Я вас не совсем понимаю.
1) Кого класть? десериализаторы?
2) Про YAML не знал, загуглил. Спасибо.
3) Ну вроде кастомный редактор позволяет «никакими импортами» и не заниматься, в чем здесь проблема? :)

1) ресурсы
2) так это же был не вам комментарий, как раз с кастомнымм редакторами я согласен

А куда класть ресурсы, если не в папку Resources?
В ассет-бандлы?

Вообще, в Unity есть три основных места: в Resources, просто в проект, и, наконец, в ассет-бандлы.

Resources, по ряду причин, это наиухдшее решение из возможных. Класть ресурсы просто в проект — рабочее решение на проектах маленького и среднего размера. На больших проектах лучше переключаться на ассет бандлы, чтобы билд не занимал пару часов.

Когда-то делал смену скинов, и приходилось в рантайме загружать-выгружать текстуры. Ассет бандлы я не вывез (дело было до 5.3) а ресурсы работали как часики.

Если задача требует ручного управления загрузкой и выгрузкой ресурсов из памяти, то без нормального менеджера ассетов, который будет скрывать ассет бандлы под адекватным слоем абстракции никуда, по-моему.

Другое дело, что такие вещи нужны очень редко. Я сейчас работаю над проектом с открытым миром, где в принципе нет разделения на сцены — и автоматическое управление ресурсами, просто с общей выгрузкой неиспользуемых ассетов, работает на боевых загрузках очень адекватно. Даже отключение обджект пула, написанного предыдущего разработчиками, судя по всему, по инерции, не даёт никаких пенальти к производительности — зато прибавляет огромное количество очков стабильности.


В-общем, чем заниматься преждевременной оптимизацией, лучше просто планировать архитектуру так, чтобы её можно было безболезненно имплементировать, когда (и если) она действительно будет необходима.

Custom List , displaying data your way

This tutorial comes after the Custom Data tutorial.

This tutorial is for Unity version 4.3 and above.

Creating Test Data

We start with the finished Custom Data tutorial project, or by creating a new empty project and importing custom-data.unitypackage.

Then we create a new test script named ListTester with some test arrays, and make a new prefab and prefab instance with it, so we can see it all works as expected.

Creating a Custom Inspector

We can get to the serialized object via the serializedObject property. To prepare it for editing, we must first synchronize it with the component it represents, by calling its Update method. Then we can show the properties. And after we are done, we have to commit any changes via its ApplyModifiedProperties method. This also takes care of Unity’s undo history. In between these two is where we’ll draw our properties.

Creating an Editor List

Properly Indenting

Collapsing Lists

Showing the Size

  • Why not use arraySize here?

Complete lists.

Customizing the List


Using Flags

The first thing we need to do is create an enumeration of all our options. We name it EditorListOption and give it the System.Flags attribute. We place it in its own script file or in the same script as EditorList , but outside of the class.

H > Another useful feature is the ability to hide the labels of the elements. So let’s add an option for element labels and include it in the default. We can also add a convenient entry for the default without the element labels.

Adding Buttons

First we’ll add an option for buttons, and also a convenient option to activate everything.

We predefine static GUIContent for these buttons and include handy tooltips as well. We also add a separate method for showing the buttons and call it after each element, if desired.

Fortunately, adding functionality to the buttons is very simple, as we can directly use the methods for array manipulation provided by SerializedProperty . We need the list and the current element index for this to work, so we add them as parameters to our ShowButtons method and pass them along inside the loop of ShowElements .

While this is how Unity handles deletion in this case, it is weird. Instead, we want the element to always be removed, not sometimes cleared. We can enforce this by checking whether the list’s size has remained the same after deleting the element. If so, it has only been cleared and we should delete it again, for real this time.

Only Allowing Lists

Multi-object Editing

Downloads

Questions & Answers

At this point we don’t want a simple integer, we want the size as a SerializedProperty so it’s easy to edit. Fortunately, we can extract the size as a property via the special relative path Array.size. We will use arraySize in all other cases. How does showListSize work? We define showListSize as an optional parameter by assigning a constant value to it. This is equivalent to adding a second method declaration without the argument, then calling the original method with the constant value as an argument.

void DoWork (bool fast) <> void DoWork ()

Цукерберг рекомендует:  Законы программирования, о которых вы, возможно, не слышали

Be advised that using optional parameters can lead to weird errors on some platform builds. I only use them in editor scripts, which won’t be included in builds. Is the Flags attribute required? You do not need to apply the Flags attribute, it will work fine without. What the attribute does is signify that you are using the enumeration for flags that can be combined together, which will affect how such values are converted to strings, among other things. How do bitwise flags work? You can use the individual digits of a number to represent a sequence of boolean values, commonly named flags. For example, 01 would mean that the fist option is on, 10 would mean that the second option is on, 11 would mean that both are on, and 00 would mean that neither are on.

As each option gets its own digit, their values must be set to 1, 10, 100, 1000, 10000, and so on. However, we are dealing with binary numbers here, while in our scripts we write decimal numbers. So we have to use powers of two instead of powers of ten, writing 1, 2, 4, 8, 16, etcetera. Why static instead of const ? Objects cannot be constants, only simple values can. So we make our content static instead, which means that it will be created the first time that any EditorList code is accessed, and then stay as they are as long as we don’t mess with them. How does Button work? The method GUI.Button both shows a button and returns whether it was clicked. So you typically call it inside an if statement and perform the necessary work in the corresponding code block.

What actually happens is that your own GUI method, in this case OnInspectorGUI , gets called far more often than just once. It gets called when performing layout, when repainting, and whenever a significant GUI event happens, which is quite often. Only when a mouse click event comes along that is consumed by the button, will it return true .

To get an idea of how often the GUI methods get called, put Debug.Log(Event.current); at the start of your OnInspectorGUI method, then fool around a bit in the editor and watch the console.


Usually you need not worry about this, but be aware of it when performing heavy work like generating textures. You don’t want to do that dozens of times per second if you don’t need to. What happens when we move the bottom element? When trying to move the bottom element even lower, nothing will happen. Nothing gets screwed up, the action simply changes nothing. What are the contents of a new item? If you insert a new array element via a SerializedProperty , the new element will be a duplicate of the element just above it. If there’s no other element, it gets default values.

Кастомные редакторы для Unity3D, которые мы используем в игре

Unity – сказочный движок.

Иногда эта сказка добрая, про пони и радугу. А иногда – про страшного бабайку. И очень важная часть данного движка, а именно расширения для редактора (custom inspectors) – как раз про бабайку. В статье я бы хотел поделиться опытом использования собственных расширений на примере нашей игры .

Начнем с определения. Вот, что говорится в документации про расширения:

“Unity позволяет вам расширить редактор своими собственными инспекторами и окнами редактора (Editor Windows), и вы можете задать, как свойства должны отображаться и инспектора при помощи пользовательского Property Drawers.” https://docs.unity3d.com/Manual/ExtendingTheEditor.html

То есть имеем три основных типа для расширения функционала, наследуемые от базовых классов:

  • UnityEditor.Editor
  • UnityEditor.EditorWindow
  • UnityEditor.PropertyDrawer

И сразу же первая загвоздка – все расширения делаются только с помощью кода. Никакого визуального программирования и блок-схем, WYSIWYG, перетаскивания кнопочек по формочкам. Только C #, только хардор. Изменил размер кнопки – будь добр пересобрать весь проект, чтобы увидеть изменения. Соответственно, написать новое расширение или поправить скаченное из Asset Store не программисту – практически непосильная задача.

Первый тип (Editor) используется для того, чтобы сказать Unity “как отобразить класс”. Это может быть ScriptableObject или MonoBehaviour. Используется чаще всего, по крайне мере у нас. Второй (EditorWindow) – может быть использован для отображения почти любого содержимого в пределах нового окна, за которое он отвечает. Третий (PropertyDrawer) отвечает на вопрос “как отобразить параметр”. Причем это может быть как один из стандартных типов параметров, так и свой собственный.

Для каждого из типов расширений можно найти по небольшому “Hello World” в документации. Но чтобы сделать действительно полезное, удобное и красивое расширение, придется еще постараться. Связано это, во-первых, с наличием ОГРОМНОГО числа недокументированных и внутренних (Internal) функций движка, которые можно использовать. Во-вторых, с большим количеством багов и общей не интуитивностью подсистемы. В-третьих, почти все статьи про расширения на английском или вообще иероглифы. Если с английским лично я еще могу справится, то китайский поддается только гугл транслейту, что слабо помогает общему усвоению информации. Именно поэтому сделать что-то сложнее двух дополнительных кнопок – сродни алхимии и черной магии. Но когда это нас останавливало?

В нашей, казалось бы, небольшой игре используется 22 собственных скрипта для расширений на

2 500 строк кода в сумме. Приведу особо интересные примеры для каждого типа расширений.

PropertyDrawer

Здесь, как раз, ничего сильно интересного у нас нет. Просто для примера – отображение свойства неактивным, если объект на сцене. И возможность редактировать свойство, если объект является префабом.

Эта функция используется для свойств-идентификаторов объектов. Что-то типа ИД, необходимого для сериализации/десериализации структуры уровня. Защита от самого себя, чтобы не поменять идентификатор во время сборки уровня в редакторе. Если так сделать – уровень сохранится, но загружаться не будет.

Кастомные редакторы для Unity3D, которые мы используем в игре


Начнем с определения. Вот, что говорится в документации про расширения:

“Unity позволяет вам расширить редактор своими собственными инспекторами и окнами редактора (Editor Windows), и вы можете задать, как свойства должны отображаться и инспектора при помощи пользовательского Property Drawers.” https://docs.unity3d.com/Manual/ExtendingTheEditor.html

То есть имеем три основных типа для расширения функционала, наследуемые от базовых классов:

  • UnityEditor.Editor
  • UnityEditor.EditorWindow
  • UnityEditor.PropertyDrawer

И сразу же первая загвоздка — все расширения делаются только с помощью кода. Никакого визуального программирования и блок-схем, WYSIWYG, перетаскивания кнопочек по формочкам. Только C #, только хардор. Изменил размер кнопки — будь добр пересобрать весь проект, чтобы увидеть изменения. Соответственно, написать новое расширение или поправить скаченное из Asset Store не программисту — практически непосильная задача.

Первый тип (Editor) используется для того, чтобы сказать Unity “как отобразить класс”. Это может быть ScriptableObject или MonoBehaviour. Используется чаще всего, по крайне мере у нас. Второй (EditorWindow) — может быть использован для отображения почти любого содержимого в пределах нового окна, за которое он отвечает. Третий (PropertyDrawer) отвечает на вопрос “как отобразить параметр”. Причем это может быть как один из стандартных типов параметров, так и свой собственный.

Для каждого из типов расширений можно найти по небольшому “Hello World” в документации. Но чтобы сделать действительно полезное, удобное и красивое расширение, придется еще постараться. Связано это, во-первых, с наличием ОГРОМНОГО числа недокументированных и внутренних (Internal) функций движка, которые можно использовать. Во-вторых, с большим количеством багов и общей не интуитивностью подсистемы. В-третьих, почти все статьи про расширения на английском или вообще иероглифы. Если с английским лично я еще могу справится, то китайский поддается только гугл транслейту, что слабо помогает общему усвоению информации. Именно поэтому сделать что-то сложнее двух дополнительных кнопок — сродни алхимии и черной магии. Но когда это нас останавливало?

В нашей, казалось бы, небольшой игре используется 22 собственных скрипта для расширений на

2 500 строк кода в сумме. Приведу особо интересные примеры для каждого типа расширений.

PropertyDrawer

Здесь, как раз, ничего сильно интересного у нас нет. Просто для примера — отображение свойства неактивным, если объект на сцене. И возможность редактировать свойство, если объект является префабом.

Цукерберг рекомендует:  Изменение размера текста на странице

Эта функция используется для свойств-идентификаторов объектов. Что-то типа ИД, необходимого для сериализации/десериализации структуры уровня. Защита от самого себя, чтобы не поменять идентификатор во время сборки уровня в редакторе. Если так сделать — уровень сохранится, но загружаться не будет.

Еще есть PropertyDrawer для класса “Координаты X и Y” — вместо двух строчек выводит в одну. Еще один — для отображения коллекции string в виде выпадающего списка.

EditorWindow

Здесь уже интереснее. Кастомное окно у нас одно. Используется как основной способ редактирования уровня. Весь код я приводить, конечно, не буду. Из интересного можно выделить пару моментов.

Первый — получение картинки-превью префаба. Т.е. той картинки, которая отображается в самом редакторе Unity. Реализуется с помощью одного метода AssetPreview.GetAssetPreview(gameObject).

Второй — центрирование камеры в SceneView к выбранной ячейке.
Editor


Здесь начинается самое интересное. Во первых, был реализован универсальный базовый кастомный эдитор, который выводит в начало своей верстки короткое информационное сообщение. Это может быть просто текст подсказки, предупреждение или сообщение об ошибке. В зависимости от типа сообщения, блок с текстом отображается индивидуально.
Дальше от него наследуются все остальные кастомные эдиторы. Самые “толстые” у нас — это ContentPackEditor, LevelEditor, LocalizationEditor, GameFieldEditor. Каждый от 200 до 300 строк кода. Опять же, приводить код каждого смысла не имеет. Расскажу только про интересные моменты.

Для ContentPackEditor нужен был функционал визуальной сортировки элементов массива. И такой функционал в Unity есть, это ReorderableList в UnityEditorInternal. Вот статья по основам использования http://va.lent.in/unity-make-your-lists-functional-with-reorderablelist/

От себя я добавил сворачивание/разворачивание списка при клике на заголовок.

В LocalizationEditor надо было сделать что-то вроде таблицы, чтобы четные и нечетные сроки выводились разным цветом. Решается это заведение двух разных стилей.

Вторым проблемным моментом было сделать поиск в уже добавленных ключах локализации и мгновенный вывод результатов в виде выпадающего списка под строкой поиска. Вот для этого найти решение было действительно непросто. В итоге нашелся метод на каком-то китайском сайте с иероглифами. Хорошо, что код — он и в африке (Китае) код. http://www.clonefactor.com/wordpress/public/1769/

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

Creating Editor Windows in Unity

Our game developer OДџuz develops Unity editor tools both at work and in his free time. He finds the lack of resources for editor development rather disturbing, so he decided to create his own series of tutorials. Check out the post below and keep following us for even more!

For the last decade, Unity has been a great platform for developing games that provides a large number of tools to developers: rendering engine, physics engine, animation systems, audio mixers etc. However, when creating levels or generating in-game data, Unity falls short, because each game is unique and requires different kinds of tools. Thankfully, Unity has an API available to us developers to create our own editor windows, custom drawers and inspector panels. In this series of blog posts, I am going to show you how we develop custom editors in Unity for designers and artists at Gram Games. We will start by creating an editor window, put two panels in it, and then make it resizable. In the next post, we will turn that window into a clone of Unity’s own Console window.

Well then, let’s start! First, we are going to create an empty Unity project and add a folder named Editor under Assets. If you give folders in Unity certain names,В it will treat their contents in a special way. Editor is one of those names and the scripts in this folder will become a part of Unity’s own editor. So, then, let’s build an editor window script: go into theВ Editor folder you just created, right-click, and select Create -> C# Script. You can also select Editor Test C# Script, but we will change all the content anyway, so it doesn’t actually matter. Name your script ResizablePanels and then open it in your favourite text editor (here at Gram Games we prefer Xamarin).

Since this is going to be an editor window, the class should derive from EditorWindow instead of MonoBehaviour. TheВ EditorWindow class resides in UnityEditor namespace, so we will need to add it as well.

GUI Unity Редактор пользовательских

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

Я думаю, что ваши данные перезаписываются в 2-х местах.

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

C# — Unity custom editor window Как добавить Картинку

171 просмотра

1 ответ


40 Репутация автора

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

Ответы (1)

1 плюс

459 Репутация автора

Я думаю, что ваши данные перезаписываются в 2 местах.

Так что вот одно решение. По сути, я просто предлагаю вам извлечь части, которые не нужно запускать 60 раз в секунду, вы можете делать это как хотите.

unity3d Editor Window

Example

Why an Editor Window?

As you may have seen, you can do a lot of things in a custom inspector (if you don’t know what a custom inspector is, check the example here : http://www.riptutorial.com/unity3d/topic/2506/extending-the-editor. But at one point you may want to implement a configuration panel, or a customized asset palette. In those cases you are going to use an EditorWindow. Unity UI itself is composed of Editor Windows ; you can open them (usually through the top bar), tab them, etc.

Create a basic EditorWindow

Simple Example

Creating an custom editor window is fairly simple. All you need to do is extend the EditorWindow class and use the Init() and OnGUI() methods. Here is a simple example :

The 3 important points are :

  1. Don’t forget to extend EditorWindow
  2. Use the Init() as provided in the example. EditorWindow.GetWindow is checking if a CustomWindow is already created. If not, it will create a new instance. Using this you ensure that you don’t have several instances of your window at the same time
  3. Use OnGUI() like usual to display information in your window

The final result will look like this :

Going deeper

Of course you will probably want to manage or modify some assets using this EditorWindow. Here is an example using the Selection class (to get the active Selection) and modifying the selected asset properties via SerializedObject and SerializedProperty.

Here is the result :

Advanced topics

You can do some really advanced things in the editor, and the EditorWindow class is perfect for displaying large amount of information. Most advanced assets on the Unity Asset Store (such as NodeCanvas or PlayMaker) use EditorWindow for displaying for custom views.

Drawing in the SceneView

One interesting thing to do with an EditorWindow is to display information directly in your SceneView. This way you can create a fully customized map/world editor, for example, using your custom EditorWindow as an asset palette and listening to clicks in the SceneView to instantiate new objects. Here is an example :

This will display the a toolbar directly in your SceneView

Here is a quick glimpse of how far you can go :

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих