123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- /*************************************************************************
- * Copyright © 2018 Mogoson. All rights reserved.
- *------------------------------------------------------------------------
- * File : GenericEditor.cs
- * Description : Define generic editor.
- *------------------------------------------------------------------------
- * Author : Mogoson
- * Version : 0.1.0
- * Date : 2/26/2018
- * Description : Initial development version.
- *
- * Author : Mogoson
- * Version : 0.1.1
- * Date : 6/20/2018
- * Description : Add method for draw adaptive graph.
- *************************************************************************/
- using System;
- using UnityEditor;
- using UnityEngine;
- #if UNITY_5_3_OR_NEWER
- using UnityEditor.SceneManagement;
- #endif
- namespace Mogoson.UEditor
- {
- public class GenericEditor : Editor
- {
- #region Field and Property
- protected readonly Color Blue = new Color(0, 1, 1, 1);
- protected readonly Color TransparentBlue = new Color(0, 1, 1, 0.1f);
- protected readonly Vector3 MoveSnap = Vector3.one;
- #if UNITY_5_5_OR_NEWER
- protected readonly Handles.CapFunction CircleCap = Handles.CircleHandleCap;
- protected readonly Handles.CapFunction SphereCap = Handles.SphereHandleCap;
- #else
- protected readonly Handles.DrawCapFunction CircleCap = Handles.CircleCap;
- protected readonly Handles.DrawCapFunction SphereCap = Handles.SphereCap;
- #endif
- protected const float NodeSize = 0.125f;
- protected const float AreaRadius = 1.25f;
- protected const float ArrowLength = 2f;
- protected const float LineLength = 10;
- protected const float FixedAreaRadius = 0.5f;
- protected const float FixedArrowLength = 0.75f;
- #endregion
- #region Protected Method
- protected void DrawCircleCap(Vector3 position, Quaternion rotation, float size)
- {
- #if UNITY_5_5_OR_NEWER
- if (Event.current.type == EventType.Repaint)
- {
- CircleCap(0, position, rotation, size, EventType.Repaint);
- }
- #else
- CircleCap(0, position, rotation, size);
- #endif
- }
- protected void DrawAdaptiveCircleCap(Vector3 position, Quaternion rotation, float size)
- {
- DrawCircleCap(position, rotation, size * GetHandleSize(position));
- }
- protected void DrawSphereCap(Vector3 position, Quaternion rotation, float size)
- {
- #if UNITY_5_5_OR_NEWER
- if (Event.current.type == EventType.Repaint)
- {
- SphereCap(0, position, rotation, size, EventType.Repaint);
- }
- #else
- SphereCap(0, position, rotation, size);
- #endif
- }
- protected void DrawAdaptiveSphereCap(Vector3 position, Quaternion rotation, float size)
- {
- DrawSphereCap(position, rotation, size * GetHandleSize(position));
- }
- protected void DrawAdaptiveWireArc(Vector3 center, Vector3 normal, Vector3 from, float angle, float radius)
- {
- Handles.DrawWireArc(center, normal, from, angle, radius * GetHandleSize(center));
- }
- protected void DrawAdaptiveSolidArc(Vector3 center, Vector3 normal, Vector3 from, float angle, float radius)
- {
- Handles.DrawSolidArc(center, normal, from, angle, radius * GetHandleSize(center));
- }
- protected void DrawAdaptiveSolidDisc(Vector3 center, Vector3 normal, float radius)
- {
- Handles.DrawSolidDisc(center, normal, radius * GetHandleSize(center));
- }
- protected void DrawSphereArrow(Vector3 start, Vector3 end, float size, string text = "")
- {
- Handles.DrawLine(start, end);
- DrawAdaptiveSphereCap(end, Quaternion.identity, size);
- Handles.Label(end, text);
- }
- protected void DrawSphereArrow(Vector3 start, Vector3 direction, float length, float size, string text = "")
- {
- DrawSphereArrow(start, start + direction.normalized * length, size, text);
- }
- protected void DrawAdaptiveSphereArrow(Vector3 start, Vector3 direction, float length, float size, string text = "")
- {
- DrawSphereArrow(start, direction, length * GetHandleSize(start), size, text);
- }
- protected void DrawPositionHandle(Transform transform)
- {
- EditorGUI.BeginChangeCheck();
- var position = Handles.PositionHandle(transform.position, GetPivotRotation(transform));
- if (EditorGUI.EndChangeCheck())
- {
- Undo.RecordObject(transform, "Change Position");
- transform.position = position;
- MarkSceneDirty();
- }
- }
- protected void DrawRotationHandle(Transform transform)
- {
- EditorGUI.BeginChangeCheck();
- var rotation = Handles.RotationHandle(transform.rotation, transform.position);
- if (EditorGUI.EndChangeCheck())
- {
- Undo.RecordObject(transform, "Change Rotation");
- transform.rotation = rotation;
- MarkSceneDirty();
- }
- }
- #if UNITY_5_5_OR_NEWER
- protected void DrawFreeMoveHandle(Vector3 position, Quaternion rotation, float size, Vector3 snap, Handles.CapFunction capFunc, Action<Vector3> callback)
- #else
- protected void DrawFreeMoveHandle(Vector3 position, Quaternion rotation, float size, Vector3 snap, Handles.DrawCapFunction capFunc, Action<Vector3> callback)
- #endif
- {
- EditorGUI.BeginChangeCheck();
- var newPosition = Handles.FreeMoveHandle(position, Quaternion.identity, GetHandleSize(position) * size, snap, capFunc);
- if (EditorGUI.EndChangeCheck())
- {
- Undo.RecordObject(target, "Move Handle");
- callback.Invoke(newPosition);
- MarkSceneDirty();
- }
- }
- #if UNITY_5_5_OR_NEWER
- protected void DrawAdaptiveButton(Vector3 position, Quaternion direction, float size, float pickSize, Handles.CapFunction capFunc, Action callback)
- #else
- protected void DrawAdaptiveButton(Vector3 position, Quaternion direction, float size, float pickSize, Handles.DrawCapFunction capFunc, Action callback)
- #endif
- {
- var scale = GetHandleSize(position);
- if (Handles.Button(position, direction, size * scale, pickSize * scale, capFunc))
- {
- Undo.RecordObject(target, "Click Button");
- callback.Invoke();
- MarkSceneDirty();
- }
- }
- protected float GetHandleSize(Vector3 position)
- {
- return HandleUtility.GetHandleSize(position);
- }
- protected Quaternion GetPivotRotation(Transform transform)
- {
- if (Tools.pivotRotation == PivotRotation.Local)
- {
- return transform.rotation;
- }
- else
- {
- return Quaternion.identity;
- }
- }
- protected void MarkSceneDirty()
- {
- #if UNITY_5_3_OR_NEWER
- EditorSceneManager.MarkAllScenesDirty();
- #else
- EditorApplication.MarkSceneDirty();
- #endif
- }
- #endregion
- }
- }
|