Чтобы ускорить разработку приложений, создайте собственные редакторы для часто используемых компонентов. На этой странице показано, как создать простой скрипт, чтобы сделать GameObjectsфундаментальным объектом в сценах Unity, который может представлять персонажей, реквизит, пейзажи, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
Смотрите в Словарь всегда смотрите в точку.
- Создайте сценарий C# и назовите его «LookAtPoint».
- Откройте скрипт и замените его содержимое приведенным ниже кодом.
- Прикрепите скрипт к GameObject в вашей СценеСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь.
//C# Example (LookAtPoint.cs)
using UnityEngine;
public class LookAtPoint : MonoBehaviour
{
public Vector3 lookAtPoint = Vector3.zero;
void Update()
{
transform.LookAt(lookAtPoint);
}
}
Когда вы входите в режим игры, игровой объект, к которому вы прикрепили скрипт, теперь ориентируется по координатам, которые вы установили для свойства «Посмотрите на точку». При написании сценариевРедактора. Фрагмент кода, позволяющий создавать собственные Компоненты, запускать игровые события, изменять свойства Компонентов с течением времени и реагировать на ввод пользователя любым удобным для вас способом. Подробнее
См. в Словарь, часто полезно выполнять определенные сценарии во время Режим редактирования, когда ваше приложение не запущено. Для этого добавьте в класс атрибут ExecuteInEditMode
, например:
//C# Example (LookAtPoint.cs)
using UnityEngine;
[ExecuteInEditMode]
public class LookAtPoint : MonoBehaviour
{
public Vector3 lookAtPoint = Vector3.zero;
void Update()
{
transform.LookAt(lookAtPoint);
}
}
Теперь, если вы переместите GameObject в редакторе или измените значения «Посмотреть точку» в ИнспектореA Окно Unity, в котором отображается информация о текущем выбранном игровом объекте, активе или настройках проекта, что позволяет просматривать и редактировать значения. Дополнительная информация
Посмотрите в Словарь, GameObject обновляет свое вращение, чтобы смотреть на цель точка в мировом пространстве.
Создание пользовательского редактора
Приведенное выше демонстрирует, как можно запускать простые скрипты во время редактирования, однако это само по себе не позволяет создавать собственные инструменты редактора. Следующим шагом будет создание Пользовательского редактора для только что созданного скрипта.
Когда вы создаете скрипт в Unity, по умолчанию он наследуется от MonoBehaviour и, следовательно, является компонентом, который вы можете прикрепить к GameObject. Когда вы помещаете компонент в GameObject, Инспектор отображает интерфейс по умолчанию, который вы можете использовать для просмотра и редактирования каждой общедоступной переменной, например: целого числа, числа с плавающей запятой или строки.
Вот как по умолчанию выглядит Инспектор для компонента LookAtPoint:
Пользовательский редактор – это отдельный скрипт, который заменяет этот макет по умолчанию любыми элементами управления редактора, которые вы выберете.
Чтобы создать пользовательский редактор для сценария LookAtPoint:
- Создайте новый сценарий C# и назовите его «LookAtPointEditor».
- Откройте скрипт и замените его содержимое приведенным ниже кодом.
//C# Example (LookAtPointEditor.cs)
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(LookAtPoint))]
[CanEditMultipleObjects]
public class LookAtPointEditor : Editor
{
SerializedProperty lookAtPoint;
void OnEnable()
{
lookAtPoint = serializedObject.FindProperty("lookAtPoint");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(lookAtPoint);
serializedObject.ApplyModifiedProperties();
}
}
Этот класс должен наследоваться от Editor. Атрибут CustomEditor сообщает Unity, для какого компонента он должен выступать в качестве редактора. Атрибут CanEditMultipleObjects сообщает Unity, что вы можете выбрать несколько объектов с помощью этого редактора и изменить их все одновременно.
Unity выполняет код в OnInspectorGUI и отображает редактор в Инспекторе. Вы можете поместить сюда любой код графического интерфейса, и он работает так же, как и OnGUI, но запускается внутри Инспектора. Редактор определяет целевое свойство, которое вы можете использовать для доступа к проверяемому игровому объекту.
Вот как выглядит Инспектор для компонента LookAtPoint в новом редакторе:
Выглядит очень похоже (хотя поле «Сценарий» теперь отсутствует, потому что скрипт редактора не добавляет кода инспектора для его отображения).
Однако теперь, когда у вас есть контроль над тем, как Инспектор отображается в сценарии редактора, вы можете использовать любой код, который вам нравится, для компоновки полей Инспектора, позволяя пользователю настраивать значения и даже отображать графику или другие визуальные элементы. На самом деле все инспекторы, которые вы видите в редакторе Unity, включая более сложные инспекторы, такие как ландшафтландшафт в вашей сцене. Игровой объект Terrain добавляет в вашу сцену большую плоскую плоскость, и вы можете использовать окно Terrain Inspector для создания подробного ландшафта. Подробнее
См. в Словарь, настройки импорта системы и анимации выполняются с использованием одного и того же API. к которым у вас есть доступ при создании собственных пользовательских редакторов.
Вот простой пример, который расширяет ваш скрипт редактора для отображения сообщения, указывающего, находится ли целевая точка выше или ниже GameObject:
//C# Example (LookAtPointEditor.cs)
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(LookAtPoint))]
[CanEditMultipleObjects]
public class LookAtPointEditor : Editor
{
SerializedProperty lookAtPoint;
void OnEnable()
{
lookAtPoint = serializedObject.FindProperty("lookAtPoint");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(lookAtPoint);
serializedObject.ApplyModifiedProperties();
if (lookAtPoint.vector3Value.y > (target as LookAtPoint).transform.position.y)
{
EditorGUILayout.LabelField("(Above this object)");
}
if (lookAtPoint.vector3Value.y < (target as LookAtPoint).transform.position.y)
{
EditorGUILayout.LabelField("(Below this object)");
}
}
}
Вот как выглядит Инспектор для компонента LookAtPoint с сообщением, показывающим, находится ли целевая точка выше или ниже GameObject.
У вас есть полный доступ ко всем командам IMGUI для рисования интерфейса любого типа, включая рендерингпроцесс рисования графики для экран (или текстуру рендеринга). По умолчанию основная камера в Unity отображает изображение на экране. Подробнее
См. в Словарь Сцены с использованием КамераКомпонент, который создает изображение определенной точки обзора в вашей сцене. Вывод либо рисуется на экране, либо фиксируется в виде текстуры. Подробнее
См. в Словарь в окнах редактора.
Дополнения к просмотру сцен
Вы можете добавить дополнительный код в Вид сценыИнтерактивный вид создаваемого вами мира. Вы используете Scene View для выбора и размещения пейзажей, персонажей, камер, источников света и всех других типов игровых объектов. Дополнительная информация
См. в Словарь. Для этого реализуйте OnSceneGUI в своем пользовательском редакторе.
OnSceneGUI работает так же, как OnInspectorGUI, за исключением того, что он запускается в представлении "Сцена". Чтобы упростить создание собственных элементов управления редактированием, вы можете использовать функции, определенные в классе Handles. Все функции предназначены для работы в режимах 3D-сцен.
//C# Example (LookAtPointEditor.cs)
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(LookAtPoint))]
[CanEditMultipleObjects]
public class LookAtPointEditor : Editor
{
SerializedProperty lookAtPoint;
void OnEnable()
{
lookAtPoint = serializedObject.FindProperty("lookAtPoint");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(lookAtPoint);
if (lookAtPoint.vector3Value.y > (target as LookAtPoint).transform.position.y)
{
EditorGUILayout.LabelField("(Above this object)");
}
if (lookAtPoint.vector3Value.y < (target as LookAtPoint).transform.position.y)
{
EditorGUILayout.LabelField("(Below this object)");
}
serializedObject.ApplyModifiedProperties();
}
public void OnSceneGUI()
{
var t = (target as LookAtPoint);
EditorGUI.BeginChangeCheck();
Vector3 pos = Handles.PositionHandle(t.lookAtPoint, Quaternion.identity);
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(target, "Move point");
t.lookAtPoint = pos;
t.Update();
}
}
}
Если вы хотите добавить 2D-объекты GUI (например, GUI или EditorGUI), вам нужно обернуть их вызовами Handles.BeginGUI() и Handles.EndGUI().