| 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_NEWERusing UnityEditor.SceneManagement;#endifnamespace 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    }}
 |