261 lines
9.3 KiB
C#
261 lines
9.3 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEditor;
|
|
using UnityEditorInternal;
|
|
|
|
namespace HighlightingSystem
|
|
{
|
|
[CustomEditor(typeof(Highlighter)), CanEditMultipleObjects]
|
|
public class HighlighterEditor : Editor
|
|
{
|
|
private const string kShowTweenKey = "HighlightingSystem.Highlighter.ShowTween";
|
|
private const string kShowConstantKey = "HighlightingSystem.Highlighter.ShowConstant";
|
|
private const string kShowFilterKey = "HighlightingSystem.Highlighter.ShowFilter";
|
|
|
|
static private readonly GUIContent labelOverlay = new GUIContent("Overlay");
|
|
static private readonly GUIContent labelOccluder = new GUIContent("Occluder");
|
|
static private readonly GUIContent labelColor = new GUIContent("Color (Current)");
|
|
static private readonly GUIContent labelForceRender = new GUIContent("Force Render");
|
|
|
|
static private readonly GUIContent labelTween = new GUIContent("Tween");
|
|
static private readonly GUIContent labelGradient = new GUIContent("Gradient");
|
|
static private readonly GUIContent labelDuration = new GUIContent("Duration");
|
|
static private readonly GUIContent labelUseUnscaledTime = new GUIContent("Use Unscaled Time");
|
|
static private readonly GUIContent labelDelay = new GUIContent("Delay");
|
|
static private readonly GUIContent labelLoopMode = new GUIContent("Loop Mode");
|
|
static private readonly GUIContent labelEasing = new GUIContent("Easing");
|
|
static private readonly GUIContent labelReverse = new GUIContent("Reverse");
|
|
static private readonly GUIContent labelRepeatCount = new GUIContent("Repeat Count");
|
|
|
|
static private readonly GUIContent labelConstant = new GUIContent("Constant");
|
|
static private readonly GUIContent labelConstantColor = new GUIContent("Constant Color");
|
|
static private readonly GUIContent labelFadeInTime = new GUIContent("Fade In Time");
|
|
static private readonly GUIContent labelFadeOutTime = new GUIContent("Fade Out Time");
|
|
|
|
static private readonly GUIContent labelFilterMode = new GUIContent("Mode");
|
|
static private readonly GUIContent labelFilterList = new GUIContent("Transform Filtering List");
|
|
|
|
static private readonly GUIContent labelGroupTween = new GUIContent("Tween");
|
|
static private readonly GUIContent labelGroupConstant = new GUIContent("Constant");
|
|
static private readonly GUIContent labelGroupFilter = new GUIContent("Filter");
|
|
|
|
private Dictionary<string, SerializedProperty> fieldCache = new Dictionary<string, SerializedProperty>();
|
|
private Highlighter highlighter;
|
|
private SerializedProperty propertyFilterList;
|
|
|
|
private ReorderableList listFilter;
|
|
|
|
private bool showTween;
|
|
private bool showConstant;
|
|
private bool showFilter;
|
|
|
|
//
|
|
void OnEnable()
|
|
{
|
|
highlighter = target as Highlighter;
|
|
|
|
propertyFilterList = serializedObject.FindProperty("_filterList");
|
|
|
|
showTween = EditorPrefs.GetBool(kShowTweenKey, false);
|
|
showConstant = EditorPrefs.GetBool(kShowConstantKey, false);
|
|
showFilter = EditorPrefs.GetBool(kShowFilterKey, false);
|
|
|
|
listFilter = new ReorderableList(serializedObject, propertyFilterList, true, true, true, true);
|
|
listFilter.drawHeaderCallback = new ReorderableList.HeaderCallbackDelegate(FilterListDrawHeader);
|
|
listFilter.onAddCallback = new ReorderableList.AddCallbackDelegate(FilterListAdd);
|
|
listFilter.onRemoveCallback = new ReorderableList.RemoveCallbackDelegate(FilterListRemove);
|
|
listFilter.drawElementCallback = new ReorderableList.ElementCallbackDelegate(FilterListDrawElement);
|
|
listFilter.elementHeight = EditorGUIUtility.singleLineHeight + 2f;
|
|
}
|
|
|
|
//
|
|
public override void OnInspectorGUI()
|
|
{
|
|
serializedObject.Update();
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
|
|
DoGeneralGUI();
|
|
DoHighlighterGUI();
|
|
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
serializedObject.ApplyModifiedProperties();
|
|
}
|
|
}
|
|
|
|
//
|
|
private void DoGeneralGUI()
|
|
{
|
|
// General
|
|
EditorGUILayout.PropertyField(FindField("_overlay"), labelOverlay);
|
|
EditorGUILayout.PropertyField(FindField("_occluder"), labelOccluder);
|
|
EditorGUILayout.PropertyField(FindField("forceRender"), labelForceRender);
|
|
|
|
// Current color (readonly, since Highlighter component overrides it's value every frame)
|
|
using (new EditorGUI.DisabledScope(true))
|
|
{
|
|
EditorGUILayout.PropertyField(FindField("color"), labelColor);
|
|
}
|
|
}
|
|
|
|
//
|
|
private void DoHighlighterGUI()
|
|
{
|
|
// Tween
|
|
if (Foldout(labelGroupTween, ref showTween, kShowTweenKey))
|
|
{
|
|
using (new EditorGUI.IndentLevelScope())
|
|
{
|
|
EditorGUILayout.PropertyField(FindField("_tween"), labelTween);
|
|
EditorGUILayout.PropertyField(FindField("_tweenGradient"), labelGradient);
|
|
//DoSpectrumButtonGUI();
|
|
EditorGUILayout.PropertyField(FindField("_tweenDuration"), labelDuration);
|
|
EditorGUILayout.PropertyField(FindField("_tweenReverse"), labelReverse);
|
|
EditorGUILayout.PropertyField(FindField("_tweenLoop"), labelLoopMode);
|
|
EditorGUILayout.PropertyField(FindField("_tweenEasing"), labelEasing);
|
|
EditorGUILayout.PropertyField(FindField("_tweenDelay"), labelDelay);
|
|
EditorGUILayout.PropertyField(FindField("_tweenRepeatCount"), labelRepeatCount);
|
|
EditorGUILayout.PropertyField(FindField("_tweenUseUnscaledTime"), labelUseUnscaledTime);
|
|
}
|
|
}
|
|
|
|
// Constant
|
|
if (Foldout(labelGroupConstant, ref showConstant, kShowConstantKey))
|
|
{
|
|
using (new EditorGUI.IndentLevelScope())
|
|
{
|
|
EditorGUILayout.PropertyField(FindField("_constant"), labelConstant);
|
|
EditorGUILayout.PropertyField(FindField("_constantColor"), labelConstantColor);
|
|
EditorGUILayout.PropertyField(FindField("_constantFadeInTime"), labelFadeInTime);
|
|
EditorGUILayout.PropertyField(FindField("_constantFadeOutTime"), labelFadeOutTime);
|
|
EditorGUILayout.PropertyField(FindField("_constantEasing"), labelEasing);
|
|
EditorGUILayout.PropertyField(FindField("_constantUseUnscaledTime"), labelUseUnscaledTime);
|
|
}
|
|
}
|
|
|
|
if (Foldout(labelGroupFilter, ref showFilter, kShowFilterKey))
|
|
{
|
|
using (new EditorGUI.IndentLevelScope())
|
|
{
|
|
// filterMode
|
|
SerializedProperty fieldFilterMode = FindField("_filterMode");
|
|
EditorGUILayout.PropertyField(fieldFilterMode, labelFilterMode);
|
|
|
|
if (!fieldFilterMode.hasMultipleDifferentValues)
|
|
{
|
|
RendererFilterMode filterMode = (RendererFilterMode)fieldFilterMode.enumValueIndex;
|
|
|
|
if (highlighter.rendererFilter != null)
|
|
{
|
|
EditorGUILayout.HelpBox("Custom RendererFilter assigned to this Highlighter. Filtering list disabled.", MessageType.Warning);
|
|
}
|
|
else
|
|
{
|
|
switch (filterMode)
|
|
{
|
|
case RendererFilterMode.None:
|
|
EditorGUILayout.HelpBox("All Renderers found in child GameObjects will be highlighted.", MessageType.Info);
|
|
break;
|
|
case RendererFilterMode.Include:
|
|
EditorGUILayout.HelpBox("Renderers only on specified Transforms (and any of their children) will be highlighted.", MessageType.Info);
|
|
break;
|
|
case RendererFilterMode.Exclude:
|
|
EditorGUILayout.HelpBox("Renderers on specified Transforms (and any of their children) will be excluded from highlighting.", MessageType.Info);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// filterList
|
|
Rect rect = EditorGUI.IndentedRect(GUILayoutUtility.GetRect(0f, listFilter.GetHeight()));
|
|
listFilter.DoList(rect);
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
private SerializedProperty FindField(string fieldPath)
|
|
{
|
|
SerializedProperty field;
|
|
if (!fieldCache.TryGetValue(fieldPath, out field))
|
|
{
|
|
field = serializedObject.FindProperty(fieldPath);
|
|
fieldCache.Add(fieldPath, field);
|
|
}
|
|
return field;
|
|
}
|
|
|
|
//
|
|
private bool Foldout(GUIContent content, ref bool isExpanded, string key)
|
|
{
|
|
Rect rect = GUILayoutUtility.GetRect(content, EditorStyles.foldout);
|
|
bool expanded = EditorGUI.Foldout(rect, isExpanded, content, true, EditorStyles.foldout);
|
|
if (expanded != isExpanded && !string.IsNullOrEmpty(key))
|
|
{
|
|
isExpanded = expanded;
|
|
EditorPrefs.SetBool(key, isExpanded);
|
|
}
|
|
return isExpanded;
|
|
}
|
|
|
|
//
|
|
private void DoSpectrumButtonGUI()
|
|
{
|
|
// Spectrum
|
|
if (GUILayout.Button("Spectrum"))
|
|
{
|
|
highlighter.tweenGradient = new Gradient()
|
|
{
|
|
colorKeys = new GradientColorKey[]
|
|
{
|
|
new GradientColorKey(new Color(1f, 0f, 0f, 1f), 0f / 6f),
|
|
new GradientColorKey(new Color(1f, 1f, 0f, 1f), 1f / 6f),
|
|
new GradientColorKey(new Color(0f, 1f, 0f, 1f), 2f / 6f),
|
|
new GradientColorKey(new Color(0f, 1f, 1f, 1f), 3f / 6f),
|
|
new GradientColorKey(new Color(0f, 0f, 1f, 1f), 4f / 6f),
|
|
new GradientColorKey(new Color(1f, 0f, 1f, 1f), 5f / 6f),
|
|
new GradientColorKey(new Color(1f, 0f, 0f, 1f), 6f / 6f),
|
|
},
|
|
alphaKeys = new GradientAlphaKey[]
|
|
{
|
|
new GradientAlphaKey(1f, 0f),
|
|
new GradientAlphaKey(1f, 1f),
|
|
}
|
|
};
|
|
GUI.changed = true;
|
|
}
|
|
}
|
|
|
|
//
|
|
private void FilterListDrawHeader(Rect rect)
|
|
{
|
|
EditorGUI.LabelField(rect, labelFilterList);
|
|
}
|
|
|
|
//
|
|
private void FilterListAdd(ReorderableList list)
|
|
{
|
|
ReorderableList.defaultBehaviours.DoAddButton(list);
|
|
}
|
|
|
|
//
|
|
private void FilterListRemove(ReorderableList list)
|
|
{
|
|
ReorderableList.defaultBehaviours.DoRemoveButton(list);
|
|
}
|
|
|
|
//
|
|
private void FilterListDrawElement(Rect rect, int index, bool selected, bool focused)
|
|
{
|
|
rect.height -= 2f;
|
|
var propertyElement = propertyFilterList.GetArrayElementAtIndex(index);
|
|
EditorGUI.ObjectField(rect, propertyElement);
|
|
//EditorGUIUtility.ShowObjectPicker;
|
|
}
|
|
}
|
|
}
|
|
|