Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Editor

класс в UnityEditor / Наследует от: ScriptableObject

Описание

На основе этого базового класса создайте собственный инспектор или редактор для вашего пользовательского объекта.

using UnityEngine; using System.Collections;

// This is not an editor script. public class MyPlayer : MonoBehaviour { public int armor = 75; public int damage = 25; public GameObject gun;

void Update() { // Update logic here... } }

Например, используйте пользовательский редактор, чтобы изменить внешний вид скрипта в Инспекторе.

Вы можете прикрепить редактор к пользовательскому компоненту с помощью атрибута CustomEditor.

Существует несколько способов создания пользовательских редакторов. Если вы хотите, чтобы редактор поддерживал редактирование нескольких объектов, вы можете использовать атрибут CanEditMultipleObjects. Вместо прямого изменения переменных скрипта лучше использовать для их редактирования систему SerializedObject и SerializedProperty, так как это автоматически редактирование объектов, отмена и переопределение Prefab. Если используется этот подход, пользователь может выбрать несколько ресурсов в окне иерархии и изменить значения для всех сразу.

Вы можете либо использовать UIElements для создания собственного пользовательского интерфейса, либо использовать IMGUI. Чтобы создать собственный инспектор с помощью UIElements, необходимо переопределить Editor.CreateInspectorGUI в классе Editor. Чтобы создать собственный инспектор с помощью IMGUI, необходимо переопределить Editor.OnInspectorGUI в классе Editor. Если вы используете UIElements и перезаписали Editor.CreateInspectorGUI, любая существующая реализация IMGUI, использующая Editor.OnInspectorGUI на том же Редактор будет проигнорирован.

Вот пример пользовательского инспектора:

Custom editor in the Inspector.
using UnityEditor; using UnityEditor.UIElements; using UnityEngine; using UnityEngine.UIElements; [CustomEditor(typeof(MyPlayer))] public class MyPlayerEditor : Editor { const string resourceFilename = "custom-editor-uie"; public override VisualElement CreateInspectorGUI() { VisualElement customInspector = new VisualElement(); var visualTree = Resources.Load(resourceFilename) as VisualTreeAsset; visualTree.CloneTree(customInspector); customInspector.styleSheets.Add(Resources.Load($"{resourceFilename}-style") as StyleSheet); return customInspector; } }

В следующем примере определяется макет пользовательского инспектора в uxml. Определение загружается как ресурс, и метод VisualTreeAsset.CloneTree помещает иерархию в объект VisualElement.

InspectorWindow создаст экземпляр InspectorElement, содержащий пользовательский инспектор. InspectorElement вызовет Bind для пользовательского инспектора, связывающего его с объектом MyPlayer.

<VisualElement class="player-property"> <VisualElement class="slider-row"> <Label class="player-property-label" text="Damage"/> <VisualElement class="input-container"> <SliderInt class="player-slider" name="damage-slider" high-value="100" direction="Horizontal" binding-path="damage"/> IntegerField class="player-int-field" binding-path="damage"/> VisualElement> VisualElement> ProgressBar class="player-property-progress-bar" name="damage-progress" binding-path="damage" title="Damage"/> VisualElement>

<VisualElement class="player-property"> <VisualElement class="slider-row"> <Label class="player-property-label" text="Armor"/> <VisualElement class="input-container"> <SliderInt class="player-slider" name="armor-slider" high-value="100" direction="Horizontal" binding-path="armor"/> IntegerField class="player-int-field" binding-path="armor"/> VisualElement> VisualElement> ProgressBar class="player-property-progress-bar" name="armor-progress" binding-path="armor" title="Armor"/> VisualElement>

PropertyField class="gun-field" binding-path="gun" label="Gun Object"/>

UIElements автоматически обновляет пользовательский интерфейс при изменении данных и наоборот. Для привязки данных и автоматического обновления данных и пользовательского интерфейса задайте значения для атрибутов "binding-path".

Стиль инспектора задается в uss.

.slider-row { flex-direction: row; justify-content: space-between; margin-top: 4px; } .input-container { flex-direction: row; flex-grow: .6; margin-right: 4px; } .player-property { margin-bottom: 4px; } .player-property-label { flex:1; margin-left: 16; } .player-slider { flex:3; margin-right: 4px; } .player-property-progress-bar { margin-left: 16px; margin-right: 4px; } .player-int-field { min-width: 48px; } .gun-field { justify-content: space-between; margin-left: 16px; margin-right: 4px; margin-top: 6px; flex-grow: .6; }

Вот пример пользовательского инспектора, использующего IMGUI и множественный выбор:

using UnityEditor; using UnityEngine; using System.Collections;

// Custom Editor using SerializedProperties. // Automatic handling of multi-object editing, undo, and Prefab overrides. [CustomEditor(typeof(MyPlayer))] [CanEditMultipleObjects] public class MyPlayerEditor : Editor { SerializedProperty damageProp; SerializedProperty armorProp; SerializedProperty gunProp;

void OnEnable() { // Setup the SerializedProperties. damageProp = serializedObject.FindProperty ("damage"); armorProp = serializedObject.FindProperty ("armor"); gunProp = serializedObject.FindProperty ("gun"); }

public override void OnInspectorGUI() { // Update the serializedProperty - always do this in the beginning of OnInspectorGUI. serializedObject.Update ();

// Show the custom GUI controls. EditorGUILayout.IntSlider (damageProp, 0, 100, new GUIContent ("Damage"));

// Only show the damage progress bar if all the objects have the same damage value: if (!damageProp.hasMultipleDifferentValues) ProgressBar (damageProp.intValue / 100.0f, "Damage");

EditorGUILayout.IntSlider (armorProp, 0, 100, new GUIContent ("Armor"));

// Only show the armor progress bar if all the objects have the same armor value: if (!armorProp.hasMultipleDifferentValues) ProgressBar (armorProp.intValue / 100.0f, "Armor");

EditorGUILayout.PropertyField (gunProp, new GUIContent ("Gun Object"));

// Apply changes to the serializedProperty - always do this in the end of OnInspectorGUI. serializedObject.ApplyModifiedProperties (); }

// Custom GUILayout progress bar. void ProgressBar (float value, string label) { // Get a rect for the progress bar using the same margins as a textfield: Rect rect = GUILayoutUtility.GetRect (18, 18, "TextField"); EditorGUI.ProgressBar (rect, value, label); EditorGUILayout.Space (); } }

Если автоматическая обработка многообъектного редактирования, отмены и переопределения Prefab не требуется, переменные скрипта могут быть изменены непосредственно редактором без использования SerializedObject и SerializedProperty, как в примере IMGUI ниже.

using UnityEditor; using UnityEngine; using System.Collections;

// Example script with properties. public class MyPlayerAlternative : MonoBehaviour { public int damage; public int armor; public GameObject gun;

// ...other code... }

// Custom Editor the "old" way by modifying the script variables directly. // No handling of multi-object editing, undo, and Prefab overrides! [CustomEditor (typeof(MyPlayerAlternative))] public class MyPlayerEditorAlternative : Editor {

public override void OnInspectorGUI() { MyPlayerAlternative mp = (MyPlayerAlternative)target;

mp.damage = EditorGUILayout.IntSlider ("Damage", mp.damage, 0, 100); ProgressBar (mp.damage / 100.0f, "Damage");

mp.armor = EditorGUILayout.IntSlider ("Armor", mp.armor, 0, 100); ProgressBar (mp.armor / 100.0f, "Armor");

bool allowSceneObjects = !EditorUtility.IsPersistent (target); mp.gun = (GameObject)EditorGUILayout.ObjectField ("Gun Object", mp.gun, typeof(GameObject), allowSceneObjects); }

// Custom GUILayout progress bar. void ProgressBar (float value, string label) { // Get a rect for the progress bar using the same margins as a textfield: Rect rect = GUILayoutUtility.GetRect (18, 18, "TextField"); EditorGUI.ProgressBar (rect, value, label); EditorGUILayout.Space (); } }

Свойства

serializedObject SerializedObject, представляющий проверяемый объект или объекты.
target Инспектируемый объект.
targets Массив всех проверяемых объектов.

Публичные Методы

CreateInspectorGUI Реализуйте этот метод, чтобы создать собственный инспектор UIElements.
DrawDefaultInspector Рисует встроенный инспектор.
DrawHeader Вызовите эту функцию, чтобы нарисовать заголовок редактора.
DrawPreview Первая точка входа для предварительного просмотра чертежа.
GetInfoString Реализуйте этот метод, чтобы отображать информацию об активе поверх предварительного просмотра актива.
GetPreviewTitle Переопределите этот метод, если хотите изменить метку области предварительного просмотра.
HasPreviewGUI Переопределите этот метод в подклассах, если вы реализуете OnPreviewGUI.
OnInspectorGUI Реализуйте эту функцию, чтобы создать собственный инспектор.
OnInteractivePreviewGUI Реализация для создания собственного интерактивного пользовательского предварительного просмотра. Интерактивные пользовательские предварительные просмотры используются в области предварительного просмотра инспектора и селектора объектов.
OnPreviewGUI Реализовать создание собственного пользовательского предварительного просмотра для области предварительного просмотра инспектора, заголовков основного редактора и селектора объектов.
OnPreviewSettings Переопределите этот метод, если вы хотите отображать пользовательские элементы управления в заголовке предварительного просмотра.
RenderStaticPreview Переопределите этот метод, если вы хотите визуализировать статический предварительный просмотр.
Repaint Перерисовать все инспекторы, отображающие этот редактор.
RequiresConstantRepaint Проверяет, требует ли этот редактор постоянной перерисовки в его текущем состоянии.
UseDefaultMargins Переопределите этот метод в подклассах, чтобы он возвращал false, если вам не нужны поля по умолчанию.

Защищенные методы

ShouldHideOpenButton Возвращает настройку видимости кнопки «Открыть» в Инспекторе.

Статические Методы

CreateCachedEditor По возвращении предыдущийредактор является редактором для targetObject или targetObjects. Функция либо возвращает значение, если редактор уже отслеживает объекты, либо уничтожает предыдущий редактор и создает новый.
CreateCachedEditorWithContext Создает кэшированный редактор, используя объект контекста.
CreateEditor Создайте собственный редактор для targetObject или targetObjects.
CreateEditorWithContext Создайте собственный редактор для targetObject или targetObjects с контекстным объектом.
DrawFoldoutInspector Рисует графический интерфейс инспектора с раскрывающимся заголовком для цели.

Сообщения

HasFrameBounds Validates whether custom bounds can be calculated for this editor.
OnGetFrameBounds Gets custom bounds for the target of this editor.
OnSceneGUI Enables the Editor to handle an event in the Scene view.

События

finishedDefaultHeaderGUI An event raised while drawing the header of the Inspector window, after the default header items have been drawn.

Унаследованные члены

Свойства

hideFlags Должен ли объект быть скрыт, сохранен вместе со сценой или изменен пользователем?
name Название объекта.

Публичные Методы

GetInstanceID Возвращает идентификатор экземпляра объекта.
ToString Возвращает имя объекта.

Статические Методы

Destroy Удаляет GameObject, компонент или актив.
DestroyImmediate Уничтожает объект obj. Вместо этого вам настоятельно рекомендуется использовать Destroy.
DontDestroyOnLoad Не уничтожает целевой объект при загрузке новой сцены.
FindObjectOfType Возвращает первый активный загруженный объект типа Type.
FindObjectsOfType Получает список всех загруженных объектов
Instantiate Клонирует исходный объект и возвращает клон.
CreateInstance Создает экземпляр объекта скрипта.

Операторы

bool Объект существует?
operator != Сравнивает, ссылаются ли два объекта на другой объект.
operator == Сравнивает две ссылки на объекты, чтобы определить, ссылаются ли они на один и тот же объект.

Сообщения

Awake Эта функция вызывается при запуске сценария ScriptableObject.
OnDestroy Эта функция вызывается, когда объект сценария будет уничтожен.
OnDisable Эта функция вызывается, когда объект сценария выходит за пределы области видимости.
OnEnable Эта функция вызывается при загрузке объекта.
OnValidate Функция только для редактора, которую Unity вызывает при загрузке скрипта или изменении значения в Инспекторе.
Reset Сбросить значения по умолчанию.
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
API скрипты 2021.3