Описание
На основе этого базового класса создайте собственный инспектор или редактор для вашего пользовательского объекта.
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 на том же Редактор будет проигнорирован.
Вот пример пользовательского инспектора:
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 | Сбросить значения по умолчанию. |