[Из песочницы] Unity3D Editor: советы и трюки

Решил вкратце в одном документе описать некоторые способы расширения редактора, позволяющие сделать работу с ним более удобной.В публикации затронуты следующие моменты:

Отображение иконки и текста над объектом в сцене; Отображение текста или иконки в окне Project; Шаблоны создаваемых скриптов; Открытие и создание проекта через контекстное меню проводника; Добавление подписчиков на событие в инспекторе. Заранее предупрежу, что для сокращения кода в некоторых скриптах все поля сделал публичными. В реальных проектах так делать не стоит.Отображение иконки и текста над объектом в сцене73f5b206b16b41bda8f2026b3f69a202.pngНазвание объекта или иконку можно отобразить встроенными средствами редактора: Gizmo and Icon Display Controls.

Иконку также можно отобразить с помощью метода Gizmos.DrawIcon. Файл иконки должен быть расположен в папке «Assets/Gizmos».

public class IconExample: MonoBehaviour { void OnDrawGizmos () { Gizmos.DrawIcon (transform.position, «Icon.png», true); } } Если вы хотите выводить свой текст, то можете воспользоваться следующим кодом: public static class GizmosUtils { public static void DrawText (GUISkin guiSkin, string text, Vector3 position, Color? color = null, int fontSize = 0, float yOffset = 0) { #if UNITY_EDITOR var prevSkin = GUI.skin; if (guiSkin == null) Debug.LogWarning («editor warning: guiSkin parameter is null»); else GUI.skin = guiSkin;

GUIContent nameContent = new GUIContent (text);

GUIStyle style = (guiSkin!= null) ? new GUIStyle (guiSkin.GetStyle («Label»)) : new GUIStyle (); if (color!= null) style.normal.textColor = (Color)color; if (fontSize > 0) style.fontSize = fontSize;

Vector2 textSize = style.CalcSize (nameContent); Vector3 screenPoint = Camera.current.WorldToScreenPoint (position);

if (screenPoint.z > 0) // проверка, необходимая чтобы текст не был виден, если камера направлена в противоположную сторону относительно объекта { var worldPosition = Camera.current.ScreenToWorldPoint (new Vector3(screenPoint.x — textSize.x * 0.5f, screenPoint.y + textSize.y * 0.5f + yOffset, screenPoint.z)); UnityEditor.Handles.Label (worldPosition, nameContent, style); } GUI.skin = prevSkin; #endif } } public class GizmosTextExample: MonoBehaviour { public float yOffset = 16; public Color textColor = Color.cyan; public int fontSize = 12;

private void OnDrawGizmos () { GizmosUtils.DrawText (GUI.skin, «Custom text», transform.position, textColor, fontSize, yOffset); } } Отображение текста или иконки в окне Project e1580ca2054141799b1dbb31cb9853e1.pngДля этого нужно использовать делегат EditorApplication.projectWindowItemOnGUI.Ниже пример немного отредактированного кода, найденного по ссылке: Extending the editor: Project window.

[InitializeOnLoad] internal class CustomProjectWindow { static readonly Color labelColor = new Color (0.75f, 0.75f, 0.75f, 1.0f);

static CustomProjectWindow () { EditorApplication.projectWindowItemOnGUI += OnProjectWindowGUI; } static void OnProjectWindowGUI (string pGUID, Rect pDrawingRect) { string assetpath = AssetDatabase.GUIDToAssetPath (pGUID); string extension = Path.GetExtension (assetpath); bool icons = pDrawingRect.height > 20;

if (icons || assetpath.Length == 0) return;

GUIStyle labelStyle = new GUIStyle (EditorStyles.label); Vector2 labelSize = labelStyle.CalcSize (new GUIContent (extension)); Rect newRect = pDrawingRect; newRect.width += pDrawingRect.x; newRect.x = newRect.width — labelSize.x — 4;

Color prevGuiColor = GUI.color; GUI.color = labelColor; GUI.Label (newRect, extension, labelStyle); GUI.color = prevGuiColor; } } Отображение текста или иконки в окне Hierarchy Здесь я, пожалуй, просто оставлю ссылку на статью, в который уже есть хороший пример: «Наводим порядок в Hierarchy View».Шаблоны создаваемых скриптов b97d16c560d8409fb787f39be19661f9.pngПри создании нового скрипта в окне Project, для него можно выбрать один из существующих шаблонов скриптов.Если вы хотите, чтобы при создании нового скрипта в нем уже был написан какой-то определенный код, то данные шаблоны можно заранее отредактировать, либо создать свои.

Шаблоны обычно расположены в следующих папках: Windows: \Program Files\Unity\Editor\Data\Resources\ScriptTemplatesOS X: /Applications/Unity/Unity.app/Contents/Resources/ScriptTemplates

Опишу параметры в имени шаблона »81-C# Script-NewBehaviourScript.cs»:»81» — порядковый номер шаблона в контекстном меню; «C# Script» — отображаемое имя в контекстном меню; «NewBehaviourScript» — дефолтное имя созданного скрипта.

Открытие и создание проекта через контекстное меню проводника 48c413c0067c4b3893f7f4176f610fc1.pngВ проводник Windows можно добавить пункты для создания или открытия существующего Unity3D проекта.

Готовые файлы реестра можно скачать по ссылке (Tip #63 и Tip #71): Tip of the day

Добавление подписчиков на событие в инспекторе 148fadd54c254450a065b62590864547.pngНемного не по теме, но хотелось бы описать довольно полезное нововведение.В Unity 4.6 в инспекторе наконец-то добавили возможность назначать подписчиков на событие. Теперь можно перенести объекты в список подписчиков и выбрать методы, которые мы хотим выполнить при вызове этого события.Для этого достаточно в скрипте объявить событие с типом UnityEvent или его наследником.

Пример кода, создающего объекты спустя заданный промежуток времени:

public class InvokeRepeating: MonoBehaviour { public UnityEvent onInvoke; public float repeatTime = 3f; public float startTime = 1f;

void Start () { InvokeRepeating («Execute», startTime, repeatTime); }

void Execute () { onInvoke.Invoke (); } } public class CreateObject: MonoBehaviour { public Transform Prefab;

public void Execute () { Instantiate (Prefab, transform.position, transform.rotation); } } Прощальные слова Вот, в общем-то, и все, что я хотел написать. Надеюсь, данная публикация будет полезной для вас.

© Habrahabr.ru