Описание
Класс составной ручки для редактирования угла и радиуса в представлении "Сцена".
Этот класс позволяет отображать маркеры управления для редактирования угла и радиуса дуги. Дуга начинается с Vector3.forward, умноженного на radius, и вращается вокруг Vector3.up. На дескриптор, отображаемый методом DrawHandle этого класса, влияет глобальное состояние в классе Handles, например Handles.matrix и Handles.color.
Следующий компонент определяет объект со свойствами угла и силы.
using UnityEngine;
public class ProjectileExample : MonoBehaviour
{
public float elevationAngle { get { return m_ElevationAngle; } set { m_ElevationAngle = value; } }
[SerializeField]
float m_ElevationAngle = 45f;
public float impulse { get { return m_Impulse; } set { m_Impulse = value; } }
[SerializeField]
float m_Impulse = 20f;
public Vector3 facingDirection
{
get
{
Vector3 result = transform.forward;
result.y = 0f;
return result.sqrMagnitude == 0f ? Vector3.forward : result.normalized;
}
}
protected virtual void Start()
{
GameObject ball = GameObject.CreatePrimitive(PrimitiveType.Sphere);
Vector3 direction = facingDirection;
direction = Quaternion.AngleAxis(elevationAngle, Vector3.Cross(direction, Vector3.up)) * direction;
ball.AddComponent<Rigidbody>().AddForce(direction * impulse, ForceMode.Impulse);
}
}
Следующий пример пользовательского редактора позволяет редактировать угол возвышения и свойства силы для этого компонента в представлении «Сцена», где сила представлена радиусом ручки.
using UnityEditor;
using UnityEditor.IMGUI.Controls;
using UnityEngine;
[CustomEditor(typeof(ProjectileExample))]
public class ProjectileExampleEditor : Editor
{
ArcHandle m_ArcHandle = new ArcHandle();
protected virtual void OnEnable()
{
// arc handle has no radius handle by default
m_ArcHandle.SetColorWithRadiusHandle(Color.white, 0.1f);
}
// the OnSceneGUI callback uses the Scene view camera for drawing handles by default
protected virtual void OnSceneGUI()
{
ProjectileExample projectileExample = (ProjectileExample)target;
// copy the target object's data to the handle
m_ArcHandle.angle = projectileExample.elevationAngle;
m_ArcHandle.radius = projectileExample.impulse;
// set the handle matrix so that angle extends upward from target's facing direction along ground
Vector3 handleDirection = projectileExample.facingDirection;
Vector3 handleNormal = Vector3.Cross(handleDirection, Vector3.up);
Matrix4x4 handleMatrix = Matrix4x4.TRS(
projectileExample.transform.position,
Quaternion.LookRotation(handleDirection, handleNormal),
Vector3.one
);
using (new Handles.DrawingScope(handleMatrix))
{
// draw the handle
EditorGUI.BeginChangeCheck();
m_ArcHandle.DrawHandle();
if (EditorGUI.EndChangeCheck())
{
// record the target object before setting new values so changes can be undone/redone
Undo.RecordObject(projectileExample, "Change Projectile Properties");
// copy the handle's updated data back to the target object
projectileExample.elevationAngle = m_ArcHandle.angle;
projectileExample.impulse = m_ArcHandle.radius;
}
}
}
}
Смотрите так же: Editor.OnSceneGUI, Handles.SetCamera.
Свойства
angle | Возвращает или указывает угол дуги ручки. |
angleHandleColor | Возвращает или задает цвет маркера управления углом. |
angleHandleDrawFunction | CapFunction для использования при отображении маркера управления углом. |
angleHandleSizeFunction | Функция SizeFunction для указания размера ручки управления углом. |
fillColor | Возвращает или задает цвет формы дуги. |
radius | Возвращает или указывает радиус дуги ручки. |
radiusHandleColor | Возвращает или задает цвет маркера управления радиусом. |
radiusHandleDrawFunction | CapFunction для использования при отображении маркера управления радиусом. |
radiusHandleSizeFunction | Функция SizeFunction для указания размера ручки управления углом. |
wireframeColor | Возвращает или задает цвет изогнутой линии снаружи дуги. |
Конструкторы
ArcHandle | Создает новый экземпляр класса ArcHandle. |
Публичные Методы
DrawHandle | Функция для отображения этого экземпляра в текущей камере дескриптора с использованием его текущей конфигурации. |
SetColorWithoutRadiusHandle | Устанавливает для angleHandleColor, wireframeColor и fillColor одно и то же значение, где fillColor будет иметь указанное значение альфа-канала. Для radiusHandleColor будет задано значение Color.clear, а ручка радиуса будет отключена. |
SetColorWithRadiusHandle | Устанавливает для angleHandleColor, radiusHandleColor, wireframeColor и fillColor одно и то же значение, где fillColor будет иметь указанное значение альфа-канала. |
Статические Методы
DefaultAngleHandleDrawFunction | CapFunction, рисующая линию, заканчивающуюся Handles.CylinderHandleCap. |
DefaultAngleHandleSizeFunction | Функция SizeFunction, возвращающая фиксированный размер экранного пространства. |
DefaultRadiusHandleSizeFunction | Функция SizeFunction, возвращающая фиксированный размер экранного пространства. |