Files
bansonic_beta_main/Assets/Airy UI/Editor/CustomAnimatedElement_Inspector.cs
T

630 lines
20 KiB
C#

using UnityEngine;
using UnityEditor;
namespace AiryUI
{
[CustomEditor(typeof(CustomAnimatedElement))]
[CanEditMultipleObjects]
public class CustomAnimatedElement_Inspector : Editor
{
private CustomAnimatedElement animatedElement;
private SerializedProperty _isControlledByGroup;
private SerializedProperty _animateOnEnable;
//===================
private SerializedProperty _showTimeMode;
private SerializedProperty _hideTimeMode;
//===================
private SerializedProperty _group;
//===================
private SerializedProperty _containerCanvas;
//===================
private SerializedProperty _componentsToAnimate_SHOW;
private SerializedProperty _transformAnimationRecords_SHOW;
private SerializedProperty _graphicAnimationRecords_SHOW;
private SerializedProperty _transformAndGraphicAnimationRecords_SHOW;
//===================
private SerializedProperty _componentsToAnimate_HIDE;
private SerializedProperty _transformAnimationRecords_HIDE;
private SerializedProperty _graphicAnimationRecords_HIDE;
private SerializedProperty _transformAndGraphicAnimationRecords_HIDE;
//===================
private SerializedProperty _currentRecordDuration;
private SerializedProperty _currentRecordDelay;
//===================
private SerializedProperty _showDelay;
private SerializedProperty _hideDelay;
//===================
private SerializedProperty _onShowEvent;
private SerializedProperty _onHideEvent;
private SerializedProperty _onShowCompleteEvent;
private SerializedProperty _onHideCompleteEvent;
//===================
private string[] tabsTexts = { "Show", "Hide" };
private int currentTabIndex = 0;
public float currentRecordDuration = 0.5f;
public float currentRecordStartsAt = 0;
private bool recordModeActive;
//===================
private Color showPropsColor = new Color(0.52f, 1, 0.8f, 1);
private Color hidePropsColor = new Color(1, 0.66f, 0.66f, 1);
//===================
private void OnEnable()
{
GetSavedInspectorValues();
animatedElement = (CustomAnimatedElement)target;
_isControlledByGroup = serializedObject.FindProperty("isControlledByGroup");
_group = serializedObject.FindProperty("group");
_animateOnEnable = serializedObject.FindProperty("animateOnEnable");
_containerCanvas = serializedObject.FindProperty("containerCanvas");
_showTimeMode = serializedObject.FindProperty("showTimeMode");
_hideTimeMode = serializedObject.FindProperty("hideTimeMode");
_componentsToAnimate_SHOW = serializedObject.FindProperty("componentsToAnimate_SHOW");
_transformAnimationRecords_SHOW = serializedObject.FindProperty("TransformAnimationRecords_SHOW");
_graphicAnimationRecords_SHOW = serializedObject.FindProperty("GraphicAnimationRecords_SHOW");
_transformAndGraphicAnimationRecords_SHOW = serializedObject.FindProperty("TransformAndGraphicAnimationRecords_SHOW");
_componentsToAnimate_HIDE = serializedObject.FindProperty("componentsToAnimate_HIDE");
_transformAnimationRecords_HIDE = serializedObject.FindProperty("TransformAnimationRecords_HIDE");
_graphicAnimationRecords_HIDE = serializedObject.FindProperty("GraphicAnimationRecords_HIDE");
_transformAndGraphicAnimationRecords_HIDE = serializedObject.FindProperty("TransformAndGraphicAnimationRecords_HIDE");
_currentRecordDuration = serializedObject.FindProperty("currentRecordDuration");
_currentRecordDelay = serializedObject.FindProperty("currentRecordDelay");
_showDelay = serializedObject.FindProperty("showDelay");
_hideDelay = serializedObject.FindProperty("hideDelay");
_onShowEvent = serializedObject.FindProperty("OnShow");
_onHideEvent = serializedObject.FindProperty("OnHide");
_onShowCompleteEvent = serializedObject.FindProperty("OnShowComplete");
_onHideCompleteEvent = serializedObject.FindProperty("OnHideComplete");
}
public override void OnInspectorGUI()
{
if (animatedElement.GetComponent<AnimatedElementsGroup>())
{
EditorGUILayout.HelpBox("You can't add 'Custom Animated Element' on a game object that has 'Animated Elements Group' !", MessageType.Error);
animatedElement.enabled = false;
animatedElement.disableShowAnimation = true;
animatedElement.disableHideAnimation = true;
// Don't draw anything.
return;
}
Undo.RecordObject(animatedElement, "custom animated element");
GeneralSettings();
DrawLinkedGroup();
DrawAnimateOnEnable_TOGGLE();
Tabs();
if (currentTabIndex == 0)
{
EditorGUILayout.BeginVertical(SetContainerBoxStyle(new Color(0.52f, 1, 0.8f, 0.1f)));
if (!animatedElement.disableShowAnimation)
{
Loop_TOGGLE();
ComponentsToAnimateShow_DROPDOWN();
AnimationShowTimeMode_DROPDOWN();
RecordMode_BUTTONS();
ShowAnimationDelay_PROPS();
Duration_PROPS();
TransformAnimationRecordsShow_LIST();
GraphicAnimationRecordsShow_LIST();
TransformAndGraphicAnimationRecordsShow_LIST();
OnShow_EVENT();
OnShowComplete_EVENT();
}
else
{
OnShowComplete_EVENT();
}
GUILayout.EndVertical();
}
else if (currentTabIndex == 1)
{
EditorGUILayout.BeginVertical(SetContainerBoxStyle(new Color(1, 0.66f, 0.66f, 0.1f)));
if (!animatedElement.disableHideAnimation)
{
ComponentsToAnimateHide_DROPDOWN();
AnimationHideTimeMode_DROPDOWN();
RecordMode_BUTTONS();
HideAnimationDelay_PROPS();
Duration_PROPS();
TransformAnimationRecordsHide_LIST();
GraphicAnimationRecordsHide_LIST();
TransformAndGraphicAnimationRecordsHide_LIST();
OnHide_EVENT();
OnHideComplete_EVENT();
}
else
{
OnHideComplete_EVENT();
}
GUILayout.EndVertical();
}
serializedObject.ApplyModifiedProperties();
SaveInspectorValues();
}
private void GeneralSettings()
{
//Title_LABEL ();
GUILayout.Space(10);
GUI.color = showPropsColor;
animatedElement.disableShowAnimation = EditorGUILayout.ToggleLeft("Disable Show Animation", animatedElement.disableShowAnimation);
GUI.color = hidePropsColor;
animatedElement.disableHideAnimation = EditorGUILayout.ToggleLeft("Disable Hide Animation", animatedElement.disableHideAnimation);
GUILayout.Space(10);
GUI.color = Color.white;
ContainerCanvas();
GUILayout.Space(10);
}
private void DrawLinkedGroup()
{
animatedElement.isControlledByGroup = EditorGUILayout.ToggleLeft("Is Controlled By Group?", animatedElement.isControlledByGroup);
if (animatedElement.isControlledByGroup)
{
EditorGUILayout.PropertyField(_group);
}
EditorGUILayout.Space(10);
}
private void DrawAnimateOnEnable_TOGGLE()
{
EditorGUILayoutExtensions.ToggleLeft(_animateOnEnable, new GUIContent("Animate On Enable"));
if (animatedElement.isControlledByGroup && animatedElement.group != null)
{
animatedElement.animateOnEnable = false;
EditorGUILayout.HelpBox("You can't enable 'Animate On Enable' because this Animated Element is controlled by an 'Animated Elements Group'", MessageType.None);
}
GUILayout.Space(10);
}
private void Tabs()
{
GUILayout.Space(20);
currentTabIndex = GUILayout.Toolbar(currentTabIndex, new string[] { "Show Animation", "Hide Animation" });
GUILayout.Space(10);
}
private void ContainerCanvas()
{
EditorGUILayout.BeginHorizontal();
EditorGUILayout.PropertyField(_containerCanvas, new GUIContent("Container Canvas"));
if (GUILayout.Button("Auto Find"))
{
foreach (var go in Selection.gameObjects)
{
go.GetComponent<AnimatedElement>().containerCanvas = go.GetComponentInParent<Canvas>();
}
}
EditorGUILayout.EndHorizontal();
GUILayout.Space(10);
}
private GUIStyle SetContainerBoxStyle(Color color)
{
GUIStyle boxStyle = new GUIStyle("box");
boxStyle.padding = new RectOffset(20, 20, 20, 20);
boxStyle.margin = new RectOffset(5, 5, 5, 5);
var texture = new Texture2D(1, 1);
texture.SetPixel(0, 0, color);
texture.Apply();
boxStyle.normal.background = texture;
return boxStyle;
}
private void AnimationShowTimeMode_DROPDOWN()
{
EditorGUILayout.PropertyField(_showTimeMode, new GUIContent("Time Mode"));
GUILayout.Space(10);
}
private void AnimationHideTimeMode_DROPDOWN()
{
EditorGUILayout.PropertyField(_hideTimeMode, new GUIContent("Time Mode"));
GUILayout.Space(10);
}
private void Loop_TOGGLE()
{
animatedElement.loop = EditorGUILayout.ToggleLeft("Loop", animatedElement.loop);
GUILayout.Space(10);
}
private void Title_LABEL()
{
GUILayout.Space(20);
var titleLabelStyle = new GUIStyle(GUI.skin.label) { alignment = TextAnchor.UpperCenter, fontSize = 20, fontStyle = FontStyle.Bold, fixedHeight = 50 };
EditorGUILayout.LabelField("Custom Animated Element", titleLabelStyle);
GUILayout.Space(30);
}
private void ComponentsToAnimateShow_DROPDOWN()
{
EditorGUILayout.PropertyField(_componentsToAnimate_SHOW, new GUIContent("What to animate"), true);
GUI.color = Color.white;
GUILayout.Space(20);
}
private void ComponentsToAnimateHide_DROPDOWN()
{
//GUI.color = Color.cyan;
EditorGUILayout.PropertyField(_componentsToAnimate_HIDE, new GUIContent("What to animate"), true);
GUI.color = Color.white;
GUILayout.Space(20);
}
private void Duration_PROPS()
{
EditorGUILayout.BeginVertical();
GUI.color = Color.yellow;
EditorGUILayout.PropertyField(_currentRecordDuration);
GUI.color = Color.green;
EditorGUILayout.PropertyField(_currentRecordDelay);
GUI.color = Color.white;
GUILayout.Space(20);
EditorGUILayout.EndVertical();
}
private void TransformAnimationRecordsShow_LIST()
{
EditorGUILayout.BeginVertical();
if (animatedElement.componentsToAnimate_SHOW == CustomAnimatedElement.ComponentsToAnimate.Transform)
{
EditorGUILayout.PropertyField(_transformAnimationRecords_SHOW, new GUIContent("Animation Records"));
GUILayout.Space(20);
}
EditorGUILayout.EndVertical();
}
private void TransformAnimationRecordsHide_LIST()
{
EditorGUILayout.BeginVertical();
if (animatedElement.componentsToAnimate_HIDE == CustomAnimatedElement.ComponentsToAnimate.Transform)
{
EditorGUILayout.PropertyField(_transformAnimationRecords_HIDE, new GUIContent("Animation Records"), true);
GUILayout.Space(20);
}
EditorGUILayout.EndVertical();
}
private void GraphicAnimationRecordsShow_LIST()
{
EditorGUILayout.BeginVertical();
if (animatedElement.componentsToAnimate_SHOW == CustomAnimatedElement.ComponentsToAnimate.Graphic)
{
EditorGUILayout.PropertyField(_graphicAnimationRecords_SHOW, new GUIContent("Animation Records"), true);
GUILayout.Space(20);
}
EditorGUILayout.EndVertical();
}
private void GraphicAnimationRecordsHide_LIST()
{
EditorGUILayout.BeginVertical();
if (animatedElement.componentsToAnimate_HIDE == CustomAnimatedElement.ComponentsToAnimate.Graphic)
{
EditorGUILayout.PropertyField(_graphicAnimationRecords_HIDE, new GUIContent("Animation Records"), true);
GUILayout.Space(20);
}
EditorGUILayout.EndVertical();
}
private void TransformAndGraphicAnimationRecordsShow_LIST()
{
EditorGUILayout.BeginVertical();
if (animatedElement.componentsToAnimate_SHOW == CustomAnimatedElement.ComponentsToAnimate.Both)
{
EditorGUILayout.PropertyField(_transformAndGraphicAnimationRecords_SHOW, new GUIContent("Animation Records"), true);
GUILayout.Space(20);
}
EditorGUILayout.EndVertical();
}
private void TransformAndGraphicAnimationRecordsHide_LIST()
{
EditorGUILayout.BeginVertical();
if (animatedElement.componentsToAnimate_HIDE == CustomAnimatedElement.ComponentsToAnimate.Both)
{
EditorGUILayout.PropertyField(_transformAndGraphicAnimationRecords_HIDE, new GUIContent("Animation Records"), true);
GUILayout.Space(20);
}
EditorGUILayout.EndVertical();
}
private void RecordMode_BUTTONS()
{
EditorGUILayout.BeginHorizontal();
EditorGUI.BeginDisabledGroup(recordModeActive);
GUI.color = new Color(1, 0.45f, 0, 1);
if (GUILayout.Button("●\n<color=white>RECORD</color>", new GUIStyle(GUI.skin.button) { fontSize = 12, fontStyle = FontStyle.Bold, fixedWidth = 100, richText = true }))
{
foreach (var g in Selection.gameObjects)
{
CustomAnimatedElement aniamtedElement = g.GetComponent<CustomAnimatedElement>();
if (aniamtedElement)
{
aniamtedElement.EnterRecordMode(g, (CustomAnimatedElement.AnimationShowOrHide)currentTabIndex);
}
}
recordModeActive = true;
}
EditorGUI.EndDisabledGroup();
EditorGUILayout.Space(5);
EditorGUI.BeginDisabledGroup(!recordModeActive);
GUI.color = Color.yellow;
if (GUILayout.Button("■\n<color=white>STOP</color> ", new GUIStyle(GUI.skin.button) { fontSize = 12, fontStyle = FontStyle.Bold, fixedWidth = 100, richText = true }))
{
foreach (var g in Selection.gameObjects)
{
CustomAnimatedElement aniamtedElement = g.GetComponent<CustomAnimatedElement>();
if (aniamtedElement)
{
aniamtedElement.ExitRecordMode(g, (CustomAnimatedElement.AnimationShowOrHide)currentTabIndex);
}
}
recordModeActive = false;
GUI.color = Color.white;
}
EditorGUI.EndDisabledGroup();
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space(5);
EditorGUILayout.BeginHorizontal();
EditorGUI.BeginDisabledGroup(!recordModeActive);
GUI.color = new Color(0.66f, 0, 1, 1);
if (GUILayout.Button("⌦\n<color=white>KEYFRAME</color>", new GUIStyle(GUI.skin.button) { fontSize = 12, fontStyle = FontStyle.Bold, richText = true }))
{
if (currentTabIndex == 0)
{
foreach (var g in Selection.gameObjects)
{
CustomAnimatedElement aniamtedElement = g.GetComponent<CustomAnimatedElement>();
if (aniamtedElement)
{
aniamtedElement.Record(g, CustomAnimatedElement.AnimationShowOrHide.Show);
}
}
}
else if (currentTabIndex == 1)
{
foreach (var g in Selection.gameObjects)
{
CustomAnimatedElement aniamtedElement = g.GetComponent<CustomAnimatedElement>();
if (aniamtedElement)
{
aniamtedElement.Record(g, CustomAnimatedElement.AnimationShowOrHide.Hide);
}
}
}
}
EditorGUI.EndDisabledGroup();
//GUILayout.FlexibleSpace();
EditorGUILayout.EndHorizontal();
GUILayout.Space(20);
}
private void ShowAnimationDelay_PROPS()
{
GUI.color = Color.white;
animatedElement.delayEnabled = EditorGUILayout.ToggleLeft("Enable Delay", animatedElement.delayEnabled);
if (animatedElement.delayEnabled)
{
EditorGUILayout.PropertyField(_showDelay, new GUIContent("Show Delay"));
}
EditorGUILayout.Space(); EditorGUILayout.Space();
}
private void HideAnimationDelay_PROPS()
{
GUI.color = Color.white;
animatedElement.delayEnabled = EditorGUILayout.ToggleLeft("Enable Delay", animatedElement.delayEnabled);
if (animatedElement.delayEnabled)
{
EditorGUILayout.PropertyField(_hideDelay, new GUIContent("Hide Delay"));
}
EditorGUILayout.Space(); EditorGUILayout.Space();
}
private void OnShow_EVENT()
{
EditorGUILayout.BeginVertical();
EditorGUILayout.PropertyField(_onShowEvent, new GUIContent("On Animation Start"));
GUILayout.Space(10);
EditorGUILayout.EndVertical();
}
private void OnShowComplete_EVENT()
{
EditorGUILayout.BeginVertical();
EditorGUILayout.PropertyField(_onShowCompleteEvent, new GUIContent("On Animation Complete"));
GUILayout.Space(10);
EditorGUILayout.EndVertical();
}
private void OnHide_EVENT()
{
EditorGUILayout.BeginVertical();
EditorGUILayout.PropertyField(_onHideEvent, new GUIContent("On Animation Start"));
EditorGUILayout.EndVertical();
}
private void OnHideComplete_EVENT()
{
EditorGUILayout.BeginVertical();
EditorGUILayout.PropertyField(_onHideCompleteEvent, new GUIContent("On Animation Complete"));
EditorGUILayout.EndVertical();
}
//===========================================================================================================
private void SaveInspectorValues()
{
foreach (var id in Selection.instanceIDs)
{
EditorPrefs.SetInt("airyui/custom/" + nameof(currentTabIndex), currentTabIndex);
}
}
private void GetSavedInspectorValues()
{
currentTabIndex = EditorPrefs.GetInt("airyui/custom/" + nameof(currentTabIndex), 0);
}
}
}