Unity 编辑器开发实战【Custom Editor】- 为UI视图制作动画编辑器

简介: Unity 编辑器开发实战【Custom Editor】- 为UI视图制作动画编辑器

 image.gif

为了更方便地为UI视图添加动画,将动画的编辑功能封装在了UI View类中,可以通过编辑器快速的为视图编辑动画。动画分为两种类型,一种是Unity中的Animator动画,该类型直接通过一个字符串类型变量记录动画State状态的名称即可,播放时调用Animator类中的Play方法传入该名称。另一种是DoTween动画,支持视图的移动、旋转、缩放、淡入淡出动画的编辑:

image.gif

首先看一下动画相关的几个类的数据结构:

usingSystem;
usingUnityEngine;
usingDG.Tweening;
namespaceSK.Framework{
/// <summary>/// UI移动动画/// </summary>    [Serializable]
publicclassUIMoveAnimation    {
publicenumMoveMode        {
MoveIn,
MoveOut        }
/// <summary>/// UI移动动画方向/// </summary>publicenumUIMoveAnimationDirection        {
Left,
Right,
Top,
Bottom,
TopLeft,
TopRight,
MiddleCenter,
BottomLeft,
BottomRight,
        }
publicfloatduration=1f;
publicfloatdelay;
publicEaseease=Ease.Linear;
publicUIMoveAnimationDirectiondirection=UIMoveAnimationDirection.Left;
publicboolisCustom;
publicVector3startValue;
publicVector3endValue;
publicMoveModemoveMode=MoveMode.MoveIn;
publicTweenPlay(RectTransformtarget, boolinstant=false)
        {
Vector3pos=Vector3.zero;
floatxOffset=target.rect.width/2+target.rect.width*target.pivot.x;
floatyOffset=target.rect.height/2+target.rect.height*target.pivot.y;
switch (direction)
            {
caseUIMoveAnimationDirection.Left: pos=newVector3(-xOffset, 0f, 0f); break;
caseUIMoveAnimationDirection.Right: pos=newVector3(xOffset, 0f, 0f); break;
caseUIMoveAnimationDirection.Top: pos=newVector3(0f, yOffset, 0f); break;
caseUIMoveAnimationDirection.Bottom: pos=newVector3(0f, -yOffset, 0f); break;
caseUIMoveAnimationDirection.TopLeft: pos=newVector3(-xOffset, yOffset, 0f); break;
caseUIMoveAnimationDirection.TopRight: pos=newVector3(xOffset, yOffset, 0f); break;
caseUIMoveAnimationDirection.MiddleCenter: pos=Vector3.zero; break;
caseUIMoveAnimationDirection.BottomLeft: pos=newVector3(-xOffset, -yOffset, 0f); break;
caseUIMoveAnimationDirection.BottomRight: pos=newVector3(xOffset, -yOffset, 0f); break;
            }
switch (moveMode)
            {
caseMoveMode.MoveIn:
target.anchoredPosition3D=isCustom?startValue : pos;
returntarget.DOAnchorPos3D(endValue, instant?0f : duration).SetDelay(instant?0f : delay).SetEase(ease);
caseMoveMode.MoveOut:
target.anchoredPosition3D=startValue;
returntarget.DOAnchorPos3D(isCustom?endValue : pos, instant?0f : duration).SetDelay(instant?0f : delay).SetEase(ease);
default: returnnull;
            }
        }
    }
}

image.gif

usingSystem;
usingUnityEngine;
usingDG.Tweening;
namespaceSK.Framework{
/// <summary>/// UI旋转动画/// </summary>    [Serializable]
publicclassUIRotateAnimation    {
publicfloatduration=1f;
publicfloatdelay;
publicEaseease=Ease.Linear;
publicVector3startValue;
publicVector3endValue;
publicRotateModerotateMode=RotateMode.Fast;
publicboolisCustom;
publicTweenPlay(RectTransformtarget, boolinstant=false)
        {
if (isCustom)
            {
target.localRotation=Quaternion.Euler(startValue);
            }
returntarget.DORotate(endValue, instant?0f : duration, rotateMode).SetDelay(instant?0f : delay).SetEase(ease);
        }
    }
}

image.gif

usingSystem;
usingUnityEngine;
usingDG.Tweening;
namespaceSK.Framework{
/// <summary>/// UI缩放动画/// </summary>    [Serializable]
publicclassUIScaleAnimation    {
publicfloatduration=1f;
publicfloatdelay;
publicEaseease=Ease.Linear;
publicVector3startValue=Vector3.zero;
publicVector3endValue=Vector3.one;
publicboolisCustom;
publicTweenPlay(RectTransformtarget, boolinstant=false)
        {
if (isCustom)
            {
target.localScale=startValue;
            }
returntarget.DOScale(endValue, instant?0f : duration).SetDelay(instant?0f : delay).SetEase(ease);
        }
    }
}

image.gif

usingSystem;
usingDG.Tweening;
usingUnityEngine;
namespaceSK.Framework{
/// <summary>/// UI淡入淡出动画/// </summary>    [Serializable]
publicclassUIFadeAnimation    {
publicfloatduration=1f;
publicfloatdelay;
publicEaseease=Ease.Linear;
publicfloatstartValue;
publicfloatendValue=1f;
publicboolisCustom;
publicTweenPlay(CanvasGrouptarget, boolinstant=false)
        {
if (isCustom)
            {
target.alpha=startValue;
            }
returntarget.DOFade(endValue, instant?0f : duration).SetDelay(instant?0f : delay).SetEase(ease);
        }
    }
}

image.gif

namespaceSK.Framework{
/// <summary>/// UI动画类型/// </summary>publicenumUIAnimationType    {
/// <summary>/// DoTween动画/// </summary>Tween,
/// <summary>/// Animator动画/// </summary>Animator,
    }
}

image.gif

usingSystem;
usingUnityEngine;
namespaceSK.Framework{
/// <summary>/// UI动画/// </summary>    [Serializable]
publicclassUIAnimation    {
publicUIAnimationTypeanimationType=UIAnimationType.Tween;
publicstringstateName;
publicboolmoveToggle;
publicUIMoveAnimationmoveAnimation;
publicboolrotateToggle;
publicUIRotateAnimationrotateAnimation;
publicboolscaleToggle;
publicUIScaleAnimationscaleAnimation;
publicboolfadeToggle;
publicUIFadeAnimationfadeAnimation;
publicboolHasTweenAnimation        {
get            {
returnmoveToggle||rotateToggle||scaleToggle||fadeToggle;
            }
        }
publicIChainPlay(UIViewview, boolinstant=false, Actioncallback=null)
        {
switch (animationType)
            {
caseUIAnimationType.Tween:
if (HasTweenAnimation)
                    {
varchain=view.Sequence();
varcc=newConcurrentChain();
if (moveToggle) cc.Tween(() =>moveAnimation.Play(view.RectTransform, instant));
if (rotateToggle) cc.Tween(() =>rotateAnimation.Play(view.RectTransform, instant));
if (scaleToggle) cc.Tween(() =>scaleAnimation.Play(view.RectTransform, instant));
if (fadeToggle) cc.Tween(() =>fadeAnimation.Play(view.CanvasGroup, instant));
chain.Append(cc).Event(() =>callback?.Invoke()).Begin();
returnchain;
                    }
else                    {
callback?.Invoke();
returnnull;
                    }
caseUIAnimationType.Animator:
returnview.Sequence()
                        .Animation(view.GetComponent<Animator>(), stateName)
                        .Event(() =>callback?.Invoke())
                        .Begin();
default: returnnull;
            }
        }
    }
}

image.gif

在UI View类中的相关变量如下:

image.gif

usingSystem;
usingUnityEngine.Events;
namespaceSK.Framework{
    [Serializable]
publicclassViewVisibilityChangedEvent    {
publicUIAnimationanimation=newUIAnimation();
publicUnityEventonBeginEvent;
publicUnityEventonEndEvent;
    }
}

image.gif

为UI View创建Custom Editor:

usingSystem;
usingUnityEngine;
usingUnityEditor;
usingDG.Tweening;
usingSystem.Reflection;
usingUnityEditor.Animations;
usingUnityEditor.AnimatedValues;
namespaceSK.Framework{
    [CustomEditor(typeof(UIView), true)]
publicclassUIViewInspector : Editor    {
privateenumMenu        {
Animation,
UnityEvent,
        }
privateUIViewTarget;
privateSerializedPropertyvariables;
privateViewVisibilityChangedEventonShow;
privateViewVisibilityChangedEventonHide;
privatestaticstringuiViewOnShowFoldout="UIView OnShow Foldout";
privatestaticstringuiViewOnHideFoldout="UIView OnHide Foldout";
privateboolonShowFoldout;
privateboolonHideFoldout;
privateMenuonShowMenu=Menu.Animation;
privateMenuonHideMenu=Menu.Animation;
privateSerializedPropertyonShowBeginEvent;
privateSerializedPropertyonShowEndEvent;
privateSerializedPropertyonHideBeginEvent;
privateSerializedPropertyonHideEndEvent;
privateAnimBoolonShowMoveAnimBool;
privateAnimBoolonShowRotateAnimBool;
privateAnimBoolonShowScaleAnimBool;
privateAnimBoolonShowFadeAnimBool;
privateAnimBoolonHideMoveAnimBool;
privateAnimBoolonHideRotateAnimBool;
privateAnimBoolonHideScaleAnimBool;
privateAnimBoolonHideFadeAnimBool;
privateconstfloattitleWidth=80f;
privateconstfloatlabelWidth=60f;
publicoverridevoidOnInspectorGUI()
        {
if (Target==null)
            {
Target=targetasUIView;
onShow=typeof(UIView).GetField("onVisible", BindingFlags.Instance|BindingFlags.NonPublic).GetValue(Target) asViewVisibilityChangedEvent;
onHide=typeof(UIView).GetField("onInvisible", BindingFlags.Instance|BindingFlags.NonPublic).GetValue(Target) asViewVisibilityChangedEvent;
variables=serializedObject.FindProperty("variables");
onShowFoldout=EditorPrefs.GetBool(uiViewOnShowFoldout);
onHideFoldout=EditorPrefs.GetBool(uiViewOnHideFoldout);
onShowBeginEvent=serializedObject.FindProperty("onVisible").FindPropertyRelative("onBeginEvent");
onShowEndEvent=serializedObject.FindProperty("onVisible").FindPropertyRelative("onEndEvent");
onHideBeginEvent=serializedObject.FindProperty("onInvisible").FindPropertyRelative("onBeginEvent");
onHideEndEvent=serializedObject.FindProperty("onInvisible").FindPropertyRelative("onEndEvent");
onShowMoveAnimBool=newAnimBool(onShow.animation.moveToggle, Repaint);
onShowRotateAnimBool=newAnimBool(onShow.animation.rotateToggle, Repaint);
onShowScaleAnimBool=newAnimBool(onShow.animation.scaleToggle, Repaint);
onShowFadeAnimBool=newAnimBool(onShow.animation.fadeToggle, Repaint);
onHideMoveAnimBool=newAnimBool(onHide.animation.moveToggle, Repaint);
onHideRotateAnimBool=newAnimBool(onHide.animation.rotateToggle, Repaint);
onHideScaleAnimBool=newAnimBool(onHide.animation.scaleToggle, Repaint);
onHideFadeAnimBool=newAnimBool(onHide.animation.fadeToggle, Repaint);
            }
EditorGUILayout.PropertyField(variables);
//On Show 折叠栏varnewOnShowFoldout=EditorGUILayout.Foldout(onShowFoldout, "On Visible", true);
if (newOnShowFoldout!=onShowFoldout)
            {
onShowFoldout=newOnShowFoldout;
EditorPrefs.SetBool(uiViewOnShowFoldout, onShowFoldout);
            }
//Showif (onShowFoldout)
            {
GUILayout.BeginHorizontal();
Colorcolor=GUI.color;
GUI.color=onShowMenu==Menu.Animation?Color.cyan : color;
if (GUILayout.Button("Animation", "ButtonLeft"))
                {
onShowMenu=Menu.Animation;
                }
GUI.color=onShowMenu==Menu.UnityEvent?Color.cyan : color;
if (GUILayout.Button("Event", "ButtonRight"))
                {
onShowMenu=Menu.UnityEvent;
                }
GUI.color=color;
GUILayout.EndHorizontal();
switch (onShowMenu)
                {
caseMenu.Animation:
//Animation TypeGUILayout.BeginHorizontal();
GUILayout.Label("Mode", GUILayout.Width(titleWidth));
varnewOnShowAnimationType= (UIAnimationType)EditorGUILayout.EnumPopup(onShow.animation.animationType);
if (newOnShowAnimationType!=onShow.animation.animationType)
                        {
Undo.RecordObject(Target, "On Show Animation Type");
onShow.animation.animationType=newOnShowAnimationType;
EditorUtility.SetDirty(Target);
                        }
GUILayout.EndHorizontal();
UIAnimationanimation=onShow.animation;
switch (animation.animationType)
                        {
caseUIAnimationType.Tween:
//Move、Rotate、Scale、FadeGUILayout.BeginHorizontal();
                                {
GUI.color=animation.moveToggle?color : Color.gray;
if (GUILayout.Button(EditorGUIUtility.IconContent("MoveTool"), "ButtonLeft", GUILayout.Width(25f)))
                                    {
Undo.RecordObject(Target, "On Show Animation Move Toggle");
animation.moveToggle=!animation.moveToggle;
onShowMoveAnimBool.target=animation.moveToggle;
EditorUtility.SetDirty(Target);
                                    }
GUI.color=animation.rotateToggle?color : Color.gray;
if (GUILayout.Button(EditorGUIUtility.IconContent("RotateTool"), "ButtonMid", GUILayout.Width(25f)))
                                    {
Undo.RecordObject(Target, "On Show Animation Rotate Toggle");
animation.rotateToggle=!animation.rotateToggle;
onShowRotateAnimBool.target=animation.rotateToggle;
EditorUtility.SetDirty(Target);
                                    }
GUI.color=animation.scaleToggle?color : Color.gray;
if (GUILayout.Button(EditorGUIUtility.IconContent("ScaleTool"), "ButtonMid", GUILayout.Width(25f)))
                                    {
Undo.RecordObject(Target, "On Show Animation Scale Toggle");
animation.scaleToggle=!animation.scaleToggle;
onShowScaleAnimBool.target=animation.scaleToggle;
EditorUtility.SetDirty(Target);
                                    }
GUI.color=animation.fadeToggle?color : Color.gray;
if (GUILayout.Button(EditorGUIUtility.IconContent("ViewToolOrbit"), "ButtonRight", GUILayout.Width(25f)))
                                    {
Undo.RecordObject(Target, "On Show Animation Fade Toggle");
animation.fadeToggle=!animation.fadeToggle;
onShowFadeAnimBool.target=animation.fadeToggle;
EditorUtility.SetDirty(Target);
                                    }
GUI.color=color;
                                }
GUILayout.EndHorizontal();
//MoveAnimationvarmoveAnimation=animation.moveAnimation;
if (EditorGUILayout.BeginFadeGroup(onShowMoveAnimBool.faded))
                                {
GUILayout.BeginHorizontal("Badge");
                                    {
GUILayout.BeginVertical();
                                        {
GUILayout.Space(40f);
GUILayout.Label(EditorGUIUtility.IconContent("MoveTool"));
                                        }
GUILayout.EndVertical();
GUILayout.BeginVertical();
                                        {
//Duration、DelayGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("Duration", GUILayout.Width(labelWidth));
varnewDuration=EditorGUILayout.FloatField(moveAnimation.duration);
if (newDuration!=moveAnimation.duration)
                                                {
Undo.RecordObject(Target, "On Show Animation Move Duration");
moveAnimation.duration=newDuration;
EditorUtility.SetDirty(Target);
                                                }
GUILayout.Label("Delay", GUILayout.Width(labelWidth-20f));
varnewDelay=EditorGUILayout.FloatField(moveAnimation.delay);
if (newDelay!=moveAnimation.delay)
                                                {
Undo.RecordObject(Target, "On Show Animation Move Delay");
moveAnimation.delay=newDelay;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
//Is CustomGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("From", GUILayout.Width(labelWidth-2f));
if (GUILayout.Button(moveAnimation.isCustom?"Custom Position" : "Direction", "DropDownButton"))
                                                {
GenericMenugm=newGenericMenu();
gm.AddItem(newGUIContent("Direction"), !moveAnimation.isCustom, () => { moveAnimation.isCustom=false; EditorUtility.SetDirty(Target); });
gm.AddItem(newGUIContent("Custom Position"), moveAnimation.isCustom, () => { moveAnimation.isCustom=true; EditorUtility.SetDirty(Target); });
gm.ShowAsContext();
                                                }
                                            }
GUILayout.EndHorizontal();
//FromGUILayout.BeginHorizontal();
                                            {
GUILayout.Label(GUIContent.none, GUILayout.Width(labelWidth));
if (moveAnimation.isCustom)
                                                {
Vector3newStartValue=EditorGUILayout.Vector3Field(GUIContent.none, moveAnimation.startValue);
if (newStartValue!=moveAnimation.startValue)
                                                    {
Undo.RecordObject(Target, "On Show Animation Move From");
moveAnimation.startValue=newStartValue;
EditorUtility.SetDirty(Target);
                                                    }
                                                }
else                                                {
varnewMoveDirection= (UIMoveAnimationDirection)EditorGUILayout.EnumPopup(moveAnimation.direction);
if (newMoveDirection!=moveAnimation.direction)
                                                    {
Undo.RecordObject(Target, "On Show Animation Move Direction");
moveAnimation.direction=newMoveDirection;
EditorUtility.SetDirty(Target);
                                                    }
                                                }
                                            }
GUILayout.EndHorizontal();
//ToGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("To", GUILayout.Width(labelWidth));
Vector3newEndValue=EditorGUILayout.Vector3Field(GUIContent.none, moveAnimation.endValue);
if (newEndValue!=moveAnimation.endValue)
                                                {
Undo.RecordObject(Target, "On Show Animation Move To");
moveAnimation.endValue=newEndValue;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
//EaseGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("Ease", GUILayout.Width(labelWidth));
varnewEase= (Ease)EditorGUILayout.EnumPopup(moveAnimation.ease);
if (newEase!=moveAnimation.ease)
                                                {
Undo.RecordObject(Target, "On Show Animation Move Ease");
moveAnimation.ease=newEase;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
                                        }
GUILayout.EndVertical();
                                    }
GUILayout.EndHorizontal();
                                }
EditorGUILayout.EndFadeGroup();
//RotateAnimationvarrotateAnimation=animation.rotateAnimation;
if (EditorGUILayout.BeginFadeGroup(onShowRotateAnimBool.faded))
                                {
GUILayout.BeginHorizontal("Badge");
                                    {
GUILayout.BeginVertical();
                                        {
GUILayout.Space(rotateAnimation.isCustom?50f : 40f);
GUILayout.Label(EditorGUIUtility.IconContent("RotateTool"));
                                        }
GUILayout.EndVertical();
GUILayout.BeginVertical();
                                        {
//Duration、DelayGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("Duration", GUILayout.Width(labelWidth));
varnewDuration=EditorGUILayout.FloatField(rotateAnimation.duration);
if (newDuration!=rotateAnimation.duration)
                                                {
Undo.RecordObject(Target, "On Show Animation Rotate Duration");
rotateAnimation.duration=newDuration;
EditorUtility.SetDirty(Target);
                                                }
GUILayout.Label("Delay", GUILayout.Width(labelWidth-20f));
varnewDelay=EditorGUILayout.FloatField(rotateAnimation.delay);
if (newDelay!=rotateAnimation.delay)
                                                {
Undo.RecordObject(Target, "On Show Animation Rotate Delay");
rotateAnimation.delay=newDelay;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
//Is CustomGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("From", GUILayout.Width(labelWidth-2f));
if (GUILayout.Button(rotateAnimation.isCustom?"Fixed Rotation" : "Current Rotation", "DropDownButton"))
                                                {
GenericMenugm=newGenericMenu();
gm.AddItem(newGUIContent("Current Rotation"), !rotateAnimation.isCustom, () => { rotateAnimation.isCustom=false; EditorUtility.SetDirty(Target); });
gm.AddItem(newGUIContent("Fixed Rotation"), rotateAnimation.isCustom, () => { rotateAnimation.isCustom=true; EditorUtility.SetDirty(Target); });
gm.ShowAsContext();
                                                }
                                            }
GUILayout.EndHorizontal();
if (rotateAnimation.isCustom)
                                            {
//FromGUILayout.BeginHorizontal();
                                                {
GUILayout.Label(GUIContent.none, GUILayout.Width(labelWidth));
Vector3newStartValue=EditorGUILayout.Vector3Field(GUIContent.none, rotateAnimation.startValue);
if (newStartValue!=rotateAnimation.startValue)
                                                    {
Undo.RecordObject(Target, "On Show Animation Rotate From");
rotateAnimation.startValue=newStartValue;
EditorUtility.SetDirty(Target);
                                                    }
                                                }
GUILayout.EndHorizontal();
                                            }
//ToGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("To", GUILayout.Width(labelWidth));
Vector3newEndValue=EditorGUILayout.Vector3Field(GUIContent.none, rotateAnimation.endValue);
if (newEndValue!=rotateAnimation.endValue)
                                                {
Undo.RecordObject(Target, "On Show Animation Rotate To");
rotateAnimation.endValue=newEndValue;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
//Rotate ModeGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("Mode", GUILayout.Width(labelWidth));
varnewRotateMode= (RotateMode)EditorGUILayout.EnumPopup(rotateAnimation.rotateMode);
if (newRotateMode!=rotateAnimation.rotateMode)
                                                {
Undo.RecordObject(Target, "On Show Animation Rotate Mode");
rotateAnimation.rotateMode=newRotateMode;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
//EaseGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("Ease", GUILayout.Width(labelWidth));
varnewEase= (Ease)EditorGUILayout.EnumPopup(rotateAnimation.ease);
if (newEase!=rotateAnimation.ease)
                                                {
Undo.RecordObject(Target, "On Show Animation Rotate Ease");
rotateAnimation.ease=newEase;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
                                        }
GUILayout.EndVertical();
                                    }
GUILayout.EndHorizontal();
                                }
EditorGUILayout.EndFadeGroup();
//ScaleAnimationvarscaleAnimation=animation.scaleAnimation;
if (EditorGUILayout.BeginFadeGroup(onShowScaleAnimBool.faded))
                                {
GUILayout.BeginHorizontal("Badge");
                                    {
GUILayout.BeginVertical();
                                        {
GUILayout.Space(scaleAnimation.isCustom?40f : 30f);
GUILayout.Label(EditorGUIUtility.IconContent("ScaleTool"));
                                        }
GUILayout.EndVertical();
GUILayout.BeginVertical();
                                        {
//Duration、DelayGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("Duration", GUILayout.Width(labelWidth));
varnewDuration=EditorGUILayout.FloatField(scaleAnimation.duration);
if (newDuration!=scaleAnimation.duration)
                                                {
Undo.RecordObject(Target, "On Show Animation Scale Duration");
scaleAnimation.duration=newDuration;
EditorUtility.SetDirty(Target);
                                                }
GUILayout.Label("Delay", GUILayout.Width(labelWidth-20f));
varnewDelay=EditorGUILayout.FloatField(scaleAnimation.delay);
if (newDelay!=scaleAnimation.delay)
                                                {
Undo.RecordObject(Target, "On Show Animation Scale Delay");
scaleAnimation.delay=newDelay;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
//Is CustomGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("From", GUILayout.Width(labelWidth-2f));
if (GUILayout.Button(scaleAnimation.isCustom?"Fixed Scale" : "Current Scale", "DropDownButton"))
                                                {
GenericMenugm=newGenericMenu();
gm.AddItem(newGUIContent("Current Scale"), !scaleAnimation.isCustom, () => { scaleAnimation.isCustom=false; EditorUtility.SetDirty(Target); });
gm.AddItem(newGUIContent("Fixed Scale"), scaleAnimation.isCustom, () => { scaleAnimation.isCustom=true; EditorUtility.SetDirty(Target); });
gm.ShowAsContext();
                                                }
                                            }
GUILayout.EndHorizontal();
if (scaleAnimation.isCustom)
                                            {
//FromGUILayout.BeginHorizontal();
                                                {
GUILayout.Label(GUIContent.none, GUILayout.Width(labelWidth));
Vector3newStartValue=EditorGUILayout.Vector3Field(GUIContent.none, scaleAnimation.startValue);
if (newStartValue!=scaleAnimation.startValue)
                                                    {
Undo.RecordObject(Target, "On Show Animation Scale From");
scaleAnimation.startValue=newStartValue;
EditorUtility.SetDirty(Target);
                                                    }
                                                }
GUILayout.EndHorizontal();
                                            }
//ToGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("To", GUILayout.Width(labelWidth));
Vector3newEndValue=EditorGUILayout.Vector3Field(GUIContent.none, scaleAnimation.endValue);
if (newEndValue!=scaleAnimation.endValue)
                                                {
Undo.RecordObject(Target, "On Show Animation Scale To");
scaleAnimation.endValue=newEndValue;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
//EaseGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("Ease", GUILayout.Width(labelWidth));
varnewEase= (Ease)EditorGUILayout.EnumPopup(scaleAnimation.ease);
if (newEase!=scaleAnimation.ease)
                                                {
Undo.RecordObject(Target, "On Show Animation Scale Ease");
scaleAnimation.ease=newEase;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
                                        }
GUILayout.EndVertical();
                                    }
GUILayout.EndHorizontal();
                                }
EditorGUILayout.EndFadeGroup();
//FadeAnimationvarfadeAnimation=animation.fadeAnimation;
if (EditorGUILayout.BeginFadeGroup(onShowFadeAnimBool.faded))
                                {
GUILayout.BeginHorizontal("Badge");
                                    {
GUILayout.BeginVertical();
                                        {
GUILayout.Space(fadeAnimation.isCustom?40f : 30f);
GUILayout.Label(EditorGUIUtility.IconContent("ViewToolOrbit"));
                                        }
GUILayout.EndVertical();
GUILayout.BeginVertical();
                                        {
//Duration、DelayGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("Duration", GUILayout.Width(labelWidth));
varnewDuration=EditorGUILayout.FloatField(fadeAnimation.duration);
if (newDuration!=fadeAnimation.duration)
                                                {
Undo.RecordObject(Target, "On Show Animation Fade Duration");
fadeAnimation.duration=newDuration;
EditorUtility.SetDirty(Target);
                                                }
GUILayout.Label("Delay", GUILayout.Width(labelWidth-20f));
varnewDelay=EditorGUILayout.FloatField(fadeAnimation.delay);
if (newDelay!=fadeAnimation.delay)
                                                {
Undo.RecordObject(Target, "On Show Animation Fade Delay");
fadeAnimation.delay=newDelay;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
//Is CustomGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("From", GUILayout.Width(labelWidth-2f));
if (GUILayout.Button(fadeAnimation.isCustom?"Fixed Alpha" : "Current Alpha", "DropDownButton"))
                                                {
GenericMenugm=newGenericMenu();
gm.AddItem(newGUIContent("Current Alpha"), !fadeAnimation.isCustom, () => { fadeAnimation.isCustom=false; EditorUtility.SetDirty(Target); });
gm.AddItem(newGUIContent("Fixed Alpha"), fadeAnimation.isCustom, () => { fadeAnimation.isCustom=true; EditorUtility.SetDirty(Target); });
gm.ShowAsContext();
                                                }
                                            }
GUILayout.EndHorizontal();
if (fadeAnimation.isCustom)
                                            {
//FromGUILayout.BeginHorizontal();
                                                {
GUILayout.Label(GUIContent.none, GUILayout.Width(labelWidth));
floatnewStartValue=EditorGUILayout.FloatField(GUIContent.none, fadeAnimation.startValue);
if (newStartValue!=fadeAnimation.startValue)
                                                    {
Undo.RecordObject(Target, "On Show Animation Fade From");
fadeAnimation.startValue=newStartValue;
EditorUtility.SetDirty(Target);
                                                    }
                                                }
GUILayout.EndHorizontal();
                                            }
//ToGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("To", GUILayout.Width(labelWidth));
floatnewEndValue=EditorGUILayout.FloatField(GUIContent.none, fadeAnimation.endValue);
if (newEndValue!=fadeAnimation.endValue)
                                                {
Undo.RecordObject(Target, "On Show Animation Fade To");
fadeAnimation.endValue=newEndValue;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
//EaseGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("Ease", GUILayout.Width(labelWidth));
varnewEase= (Ease)EditorGUILayout.EnumPopup(fadeAnimation.ease);
if (newEase!=fadeAnimation.ease)
                                                {
Undo.RecordObject(Target, "On Show Animation Fade Ease");
fadeAnimation.ease=newEase;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
                                        }
GUILayout.EndVertical();
                                    }
GUILayout.EndHorizontal();
                                }
EditorGUILayout.EndFadeGroup();
break;
caseUIAnimationType.Animator:
varanimator=Target.GetComponent<Animator>();
if (animator!=null)
                                {
varanimatorController=animator.runtimeAnimatorControllerasAnimatorController;
varstateMachine=animatorController.layers[0].stateMachine;
if (stateMachine.states.Length==0)
                                    {
EditorGUILayout.HelpBox("no animator state was found.", MessageType.Info);
                                    }
else                                    {
string[] stateNames=newstring[stateMachine.states.Length];
for (inti=0; i<stateNames.Length; i++)
                                        {
stateNames[i] =stateMachine.states[i].state.name;
                                        }
varindex=Array.FindIndex(stateNames, m=>m==animation.stateName);
GUILayout.BeginHorizontal();
GUILayout.Label("State Name", GUILayout.Width(titleWidth));
varnewIndex=EditorGUILayout.Popup(index, stateNames);
if (newIndex!=index)
                                        {
Undo.RecordObject(Target, "Show Animation State Name");
animation.stateName=stateNames[newIndex];
EditorUtility.SetDirty(Target);
                                        }
GUILayout.EndHorizontal();
                                    }
                                }
else                                {
EditorGUILayout.HelpBox("no animator component on this view.", MessageType.Error);
                                }
break;
default:
break;
                        }
break;
caseMenu.UnityEvent:
//OnBeginEvent、OnEndEventEditorGUILayout.PropertyField(onShowBeginEvent);
EditorGUILayout.PropertyField(onShowEndEvent);
break;
default:
break;
                }
            }
//On Hide 折叠栏varnewOnHideFoldout=EditorGUILayout.Foldout(onHideFoldout, "On Invisible", true);
if (newOnHideFoldout!=onHideFoldout)
            {
onHideFoldout=newOnHideFoldout;
EditorPrefs.SetBool(uiViewOnHideFoldout, onHideFoldout);
            }
//Hideif (onHideFoldout)
            {
GUILayout.BeginHorizontal();
Colorcolor=GUI.color;
GUI.color=onHideMenu==Menu.Animation?Color.cyan : color;
if (GUILayout.Button("Animation", "ButtonLeft"))
                {
onHideMenu=Menu.Animation;
                }
GUI.color=onHideMenu==Menu.UnityEvent?Color.cyan : color;
if (GUILayout.Button("Event", "ButtonRight"))
                {
onHideMenu=Menu.UnityEvent;
                }
GUI.color=color;
GUILayout.EndHorizontal();
switch (onHideMenu)
                {
caseMenu.Animation:
//Animation TypeGUILayout.BeginHorizontal();
GUILayout.Label("Mode", GUILayout.Width(titleWidth));
varnewOnHideAnimationType= (UIAnimationType)EditorGUILayout.EnumPopup(onHide.animation.animationType);
if (newOnHideAnimationType!=onHide.animation.animationType)
                        {
Undo.RecordObject(Target, "On Hide Animation Type");
onHide.animation.animationType=newOnHideAnimationType;
                        }
GUILayout.EndHorizontal();
UIAnimationanimation=onHide.animation;
switch (animation.animationType)
                        {
caseUIAnimationType.Tween:
//Move、Rotate、Scale、FadeGUILayout.BeginHorizontal();
                                {
GUI.color=animation.moveToggle?color : Color.gray;
if (GUILayout.Button(EditorGUIUtility.IconContent("MoveTool"), "ButtonLeft", GUILayout.Width(25f)))
                                    {
Undo.RecordObject(Target, "On Hide Animation Move Toggle");
animation.moveToggle=!animation.moveToggle;
onHideMoveAnimBool.target=animation.moveToggle;
EditorUtility.SetDirty(Target);
                                    }
GUI.color=animation.rotateToggle?color : Color.gray;
if (GUILayout.Button(EditorGUIUtility.IconContent("RotateTool"), "ButtonMid", GUILayout.Width(25f)))
                                    {
Undo.RecordObject(Target, "On Hide Animation Rotate Toggle");
animation.rotateToggle=!animation.rotateToggle;
onHideRotateAnimBool.target=animation.rotateToggle;
EditorUtility.SetDirty(Target);
                                    }
GUI.color=animation.scaleToggle?color : Color.gray;
if (GUILayout.Button(EditorGUIUtility.IconContent("ScaleTool"), "ButtonMid", GUILayout.Width(25f)))
                                    {
Undo.RecordObject(Target, "On Hide Animation Scale Toggle");
animation.scaleToggle=!animation.scaleToggle;
onHideScaleAnimBool.target=animation.scaleToggle;
EditorUtility.SetDirty(Target);
                                    }
GUI.color=animation.fadeToggle?color : Color.gray;
if (GUILayout.Button(EditorGUIUtility.IconContent("ViewToolOrbit"), "ButtonRight", GUILayout.Width(25f)))
                                    {
Undo.RecordObject(Target, "On Hide Animation Fade Toggle");
animation.fadeToggle=!animation.fadeToggle;
onHideFadeAnimBool.target=animation.fadeToggle;
EditorUtility.SetDirty(Target);
                                    }
GUI.color=color;
                                }
GUILayout.EndHorizontal();
//MoveAnimationvarmoveAnimation=animation.moveAnimation;
if (EditorGUILayout.BeginFadeGroup(onHideMoveAnimBool.faded))
                                {
GUILayout.BeginHorizontal("Badge");
                                    {
GUILayout.BeginVertical();
                                        {
GUILayout.Space(40f);
GUILayout.Label(EditorGUIUtility.IconContent("MoveTool"));
                                        }
GUILayout.EndVertical();
GUILayout.BeginVertical();
                                        {
//Duration、DelayGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("Duration", GUILayout.Width(labelWidth));
varnewDuration=EditorGUILayout.FloatField(moveAnimation.duration);
if (newDuration!=moveAnimation.duration)
                                                {
Undo.RecordObject(Target, "On Hide Animation Move Duration");
moveAnimation.duration=newDuration;
EditorUtility.SetDirty(Target);
                                                }
GUILayout.Label("Delay", GUILayout.Width(labelWidth-20f));
varnewDelay=EditorGUILayout.FloatField(moveAnimation.delay);
if (newDelay!=moveAnimation.delay)
                                                {
Undo.RecordObject(Target, "On Hide Animation Move Delay");
moveAnimation.delay=newDelay;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
//FromGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("From", GUILayout.Width(labelWidth));
Vector3newStartValue=EditorGUILayout.Vector3Field(GUIContent.none, moveAnimation.startValue);
if (newStartValue!=moveAnimation.startValue)
                                                {
Undo.RecordObject(Target, "On Hide Animation Move From");
moveAnimation.startValue=newStartValue;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
//Is CustomGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("To", GUILayout.Width(labelWidth-2f));
if (GUILayout.Button(moveAnimation.isCustom?"Custom Position" : "Direction", "DropDownButton"))
                                                {
GenericMenugm=newGenericMenu();
gm.AddItem(newGUIContent("Direction"), !moveAnimation.isCustom, () => { moveAnimation.isCustom=false; EditorUtility.SetDirty(Target); });
gm.AddItem(newGUIContent("Custom Position"), moveAnimation.isCustom, () => { moveAnimation.isCustom=true; EditorUtility.SetDirty(Target); });
gm.ShowAsContext();
                                                }
                                            }
GUILayout.EndHorizontal();
//ToGUILayout.BeginHorizontal();
                                            {
GUILayout.Label(GUIContent.none, GUILayout.Width(labelWidth));
if (moveAnimation.isCustom)
                                                {
Vector3newEndValue=EditorGUILayout.Vector3Field(GUIContent.none, moveAnimation.endValue);
if (newEndValue!=moveAnimation.endValue)
                                                    {
Undo.RecordObject(Target, "On Hide Animation Move End");
moveAnimation.endValue=newEndValue;
EditorUtility.SetDirty(Target);
                                                    }
                                                }
else                                                {
varnewMoveDirection= (UIMoveAnimationDirection)EditorGUILayout.EnumPopup(moveAnimation.direction);
if (newMoveDirection!=moveAnimation.direction)
                                                    {
Undo.RecordObject(Target, "On Hide Animation Move Direction");
moveAnimation.direction=newMoveDirection;
EditorUtility.SetDirty(Target);
                                                    }
                                                }
                                            }
GUILayout.EndHorizontal();
//EaseGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("Ease", GUILayout.Width(labelWidth));
varnewEase= (Ease)EditorGUILayout.EnumPopup(moveAnimation.ease);
if (newEase!=moveAnimation.ease)
                                                {
Undo.RecordObject(Target, "On Hide Animation Move Ease");
moveAnimation.ease=newEase;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
                                        }
GUILayout.EndVertical();
                                    }
GUILayout.EndHorizontal();
                                }
EditorGUILayout.EndFadeGroup();
//RotateAnimationvarrotateAnimation=animation.rotateAnimation;
if (EditorGUILayout.BeginFadeGroup(onHideRotateAnimBool.faded))
                                {
GUILayout.BeginHorizontal("Badge");
                                    {
GUILayout.BeginVertical();
                                        {
GUILayout.Space(rotateAnimation.isCustom?50f : 40f);
GUILayout.Label(EditorGUIUtility.IconContent("RotateTool"));
                                        }
GUILayout.EndVertical();
GUILayout.BeginVertical();
                                        {
//Duration、DelayGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("Duration", GUILayout.Width(labelWidth));
varnewDuration=EditorGUILayout.FloatField(rotateAnimation.duration);
if (newDuration!=rotateAnimation.duration)
                                                {
Undo.RecordObject(Target, "On Hide Animation Rotate Duration");
rotateAnimation.duration=newDuration;
EditorUtility.SetDirty(Target);
                                                }
GUILayout.Label("Delay", GUILayout.Width(labelWidth-20f));
varnewDelay=EditorGUILayout.FloatField(rotateAnimation.delay);
if (newDelay!=rotateAnimation.delay)
                                                {
Undo.RecordObject(Target, "On Hide Animation Rotate Delay");
rotateAnimation.delay=newDelay;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
//Is CustomGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("From", GUILayout.Width(labelWidth-2f));
if (GUILayout.Button(rotateAnimation.isCustom?"Fixed Rotation" : "Current Rotation", "DropDownButton"))
                                                {
GenericMenugm=newGenericMenu();
gm.AddItem(newGUIContent("Current Rotation"), !rotateAnimation.isCustom, () => { rotateAnimation.isCustom=false; EditorUtility.SetDirty(Target); });
gm.AddItem(newGUIContent("Fixed Rotation"), rotateAnimation.isCustom, () => { rotateAnimation.isCustom=true; EditorUtility.SetDirty(Target); });
gm.ShowAsContext();
                                                }
                                            }
GUILayout.EndHorizontal();
if (rotateAnimation.isCustom)
                                            {
//FromGUILayout.BeginHorizontal();
                                                {
GUILayout.Label(GUIContent.none, GUILayout.Width(labelWidth));
Vector3newStartValue=EditorGUILayout.Vector3Field(GUIContent.none, rotateAnimation.startValue);
if (newStartValue!=rotateAnimation.startValue)
                                                    {
Undo.RecordObject(Target, "On Hide Animation Rotate From");
rotateAnimation.startValue=newStartValue;
EditorUtility.SetDirty(Target);
                                                    }
                                                }
GUILayout.EndHorizontal();
                                            }
//ToGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("To", GUILayout.Width(labelWidth));
Vector3newEndValue=EditorGUILayout.Vector3Field(GUIContent.none, rotateAnimation.endValue);
if (newEndValue!=rotateAnimation.endValue)
                                                {
Undo.RecordObject(Target, "On Hide Animation Rotate To");
rotateAnimation.endValue=newEndValue;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
//Rotate ModeGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("Mode", GUILayout.Width(labelWidth));
varnewRotateMode= (RotateMode)EditorGUILayout.EnumPopup(rotateAnimation.rotateMode);
if (newRotateMode!=rotateAnimation.rotateMode)
                                                {
Undo.RecordObject(Target, "On Hide Animation Rotate Mode");
rotateAnimation.rotateMode=newRotateMode;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
//EaseGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("Ease", GUILayout.Width(labelWidth));
varnewEase= (Ease)EditorGUILayout.EnumPopup(rotateAnimation.ease);
if (newEase!=rotateAnimation.ease)
                                                {
Undo.RecordObject(Target, "On Hide Animation Rotate Ease");
rotateAnimation.ease=newEase;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
                                        }
GUILayout.EndVertical();
                                    }
GUILayout.EndHorizontal();
                                }
EditorGUILayout.EndFadeGroup();
//ScaleAnimationvarscaleAnimation=animation.scaleAnimation;
if (EditorGUILayout.BeginFadeGroup(onHideScaleAnimBool.faded))
                                {
GUILayout.BeginHorizontal("Badge");
                                    {
GUILayout.BeginVertical();
                                        {
GUILayout.Space(scaleAnimation.isCustom?40f : 30f);
GUILayout.Label(EditorGUIUtility.IconContent("ScaleTool"));
                                        }
GUILayout.EndVertical();
GUILayout.BeginVertical();
                                        {
//Duration、DelayGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("Duration", GUILayout.Width(labelWidth));
varnewDuration=EditorGUILayout.FloatField(scaleAnimation.duration);
if (newDuration!=scaleAnimation.duration)
                                                {
Undo.RecordObject(Target, "On Hide Animation Scale Duration");
scaleAnimation.duration=newDuration;
EditorUtility.SetDirty(Target);
                                                }
GUILayout.Label("Delay", GUILayout.Width(labelWidth-20f));
varnewDelay=EditorGUILayout.FloatField(scaleAnimation.delay);
if (newDelay!=scaleAnimation.delay)
                                                {
Undo.RecordObject(Target, "On Hide Animation Scale Delay");
scaleAnimation.delay=newDelay;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
//Is CustomGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("From", GUILayout.Width(labelWidth-2f));
if (GUILayout.Button(scaleAnimation.isCustom?"Fixed Scale" : "Current Scale", "DropDownButton"))
                                                {
GenericMenugm=newGenericMenu();
gm.AddItem(newGUIContent("Current Scale"), !scaleAnimation.isCustom, () => { scaleAnimation.isCustom=false; EditorUtility.SetDirty(Target); });
gm.AddItem(newGUIContent("Fixed Scale"), scaleAnimation.isCustom, () => { scaleAnimation.isCustom=true; EditorUtility.SetDirty(Target); });
gm.ShowAsContext();
                                                }
                                            }
GUILayout.EndHorizontal();
if (scaleAnimation.isCustom)
                                            {
//FromGUILayout.BeginHorizontal();
                                                {
GUILayout.Label(GUIContent.none, GUILayout.Width(labelWidth));
Vector3newStartValue=EditorGUILayout.Vector3Field(GUIContent.none, scaleAnimation.startValue);
if (newStartValue!=scaleAnimation.startValue)
                                                    {
Undo.RecordObject(Target, "On Hide Animation Scale From");
scaleAnimation.startValue=newStartValue;
EditorUtility.SetDirty(Target);
                                                    }
                                                }
GUILayout.EndHorizontal();
                                            }
//ToGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("To", GUILayout.Width(labelWidth));
Vector3newEndValue=EditorGUILayout.Vector3Field(GUIContent.none, scaleAnimation.endValue);
if (newEndValue!=scaleAnimation.endValue)
                                                {
Undo.RecordObject(Target, "On Hide Animation Scale To");
scaleAnimation.endValue=newEndValue;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
//EaseGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("Ease", GUILayout.Width(labelWidth));
varnewEase= (Ease)EditorGUILayout.EnumPopup(scaleAnimation.ease);
if (newEase!=scaleAnimation.ease)
                                                {
Undo.RecordObject(Target, "On Hide Animation Scale Ease");
scaleAnimation.ease=newEase;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
                                        }
GUILayout.EndVertical();
                                    }
GUILayout.EndHorizontal();
                                }
EditorGUILayout.EndFadeGroup();
//FadeAnimationvarfadeAnimation=animation.fadeAnimation;
if (EditorGUILayout.BeginFadeGroup(onHideFadeAnimBool.faded))
                                {
GUILayout.BeginHorizontal("Badge");
                                    {
GUILayout.BeginVertical();
                                        {
GUILayout.Space(fadeAnimation.isCustom?40f : 30f);
GUILayout.Label(EditorGUIUtility.IconContent("ViewToolOrbit"));
                                        }
GUILayout.EndVertical();
GUILayout.BeginVertical();
                                        {
//Duration、DelayGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("Duration", GUILayout.Width(labelWidth));
varnewDuration=EditorGUILayout.FloatField(fadeAnimation.duration);
if (newDuration!=fadeAnimation.duration)
                                                {
Undo.RecordObject(Target, "On Hide Animation Fade Duration");
fadeAnimation.duration=newDuration;
EditorUtility.SetDirty(Target);
                                                }
GUILayout.Label("Delay", GUILayout.Width(labelWidth-20f));
varnewDelay=EditorGUILayout.FloatField(fadeAnimation.delay);
if (newDelay!=fadeAnimation.delay)
                                                {
Undo.RecordObject(Target, "On Hide Animation Fade Delay");
fadeAnimation.delay=newDelay;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
//Is CustomGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("From", GUILayout.Width(labelWidth-2f));
if (GUILayout.Button(fadeAnimation.isCustom?"Fixed Alpha" : "Current Alpha", "DropDownButton"))
                                                {
GenericMenugm=newGenericMenu();
gm.AddItem(newGUIContent("Current Alpha"), !fadeAnimation.isCustom, () => { fadeAnimation.isCustom=false; EditorUtility.SetDirty(Target); });
gm.AddItem(newGUIContent("Fixed Alpha"), fadeAnimation.isCustom, () => { fadeAnimation.isCustom=true; EditorUtility.SetDirty(Target); });
gm.ShowAsContext();
                                                }
                                            }
GUILayout.EndHorizontal();
if (fadeAnimation.isCustom)
                                            {
//FromGUILayout.BeginHorizontal();
                                                {
GUILayout.Label(GUIContent.none, GUILayout.Width(labelWidth));
floatnewStartValue=EditorGUILayout.FloatField(GUIContent.none, fadeAnimation.startValue);
if (newStartValue!=fadeAnimation.startValue)
                                                    {
Undo.RecordObject(Target, "On Hide Animation Fade From");
fadeAnimation.startValue=newStartValue;
EditorUtility.SetDirty(Target);
                                                    }
                                                }
GUILayout.EndHorizontal();
                                            }
//ToGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("To", GUILayout.Width(labelWidth));
floatnewEndValue=EditorGUILayout.FloatField(GUIContent.none, fadeAnimation.endValue);
if (newEndValue!=fadeAnimation.endValue)
                                                {
Undo.RecordObject(Target, "On Hide Animation Fade To");
fadeAnimation.endValue=newEndValue;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
//EaseGUILayout.BeginHorizontal();
                                            {
GUILayout.Label("Ease", GUILayout.Width(labelWidth));
varnewEase= (Ease)EditorGUILayout.EnumPopup(fadeAnimation.ease);
if (newEase!=fadeAnimation.ease)
                                                {
Undo.RecordObject(Target, "On Hide Animation Fade Ease");
fadeAnimation.ease=newEase;
EditorUtility.SetDirty(Target);
                                                }
                                            }
GUILayout.EndHorizontal();
                                        }
GUILayout.EndVertical();
                                    }
GUILayout.EndHorizontal();
                                }
EditorGUILayout.EndFadeGroup();
break;
caseUIAnimationType.Animator:
varanimator=Target.GetComponent<Animator>();
if (animator!=null)
                                {
varanimatorController=animator.runtimeAnimatorControllerasAnimatorController;
varstateMachine=animatorController.layers[0].stateMachine;
if (stateMachine.states.Length==0)
                                    {
EditorGUILayout.HelpBox("no animator state was found.", MessageType.Info);
                                    }
else                                    {
string[] stateNames=newstring[stateMachine.states.Length];
for (inti=0; i<stateNames.Length; i++)
                                        {
stateNames[i] =stateMachine.states[i].state.name;
                                        }
varindex=Array.FindIndex(stateNames, m=>m==animation.stateName);
GUILayout.BeginHorizontal();
GUILayout.Label("State Name", GUILayout.Width(titleWidth));
varnewIndex=EditorGUILayout.Popup(index, stateNames);
if (newIndex!=index)
                                        {
Undo.RecordObject(Target, "Show Animation State Name");
animation.stateName=stateNames[newIndex];
EditorUtility.SetDirty(Target);
                                        }
GUILayout.EndHorizontal();
                                    }
                                }
else                                {
EditorGUILayout.HelpBox("no animator component on this view.", MessageType.Error);
                                }
break;
default:
break;
                        }
break;
caseMenu.UnityEvent:
//OnBeginEvent、OnEndEventEditorGUILayout.PropertyField(onHideBeginEvent);
EditorGUILayout.PropertyField(onHideEndEvent);
break;
default:
break;
                }
            }
serializedObject.ApplyModifiedProperties();
        }
    }
}

image.gif

image.gif

目录
相关文章
|
11天前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
137 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
3月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
2月前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
1379 1
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
2月前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
3月前
|
开发框架 JavaScript 前端开发
HarmonyOS UI开发:掌握ArkUI(包括Java UI和JS UI)进行界面开发
【10月更文挑战第22天】随着科技发展,操作系统呈现多元化趋势。华为推出的HarmonyOS以其全场景、多设备特性备受关注。本文介绍HarmonyOS的UI开发框架ArkUI,探讨Java UI和JS UI两种开发方式。Java UI适合复杂界面开发,性能较高;JS UI适合快速开发简单界面,跨平台性好。掌握ArkUI可高效打造符合用户需求的界面。
195 8
|
4月前
|
JavaScript API 开发者
掌握ArkTS,打造HarmonyOS应用新视界:从“Hello World”到状态管理,揭秘鸿蒙UI开发的高效秘诀
【10月更文挑战第19天】ArkTS(ArkUI TypeScript)是华为鸿蒙系统中用于开发用户界面的声明式编程语言,结合了TypeScript和HarmonyOS的UI框架。本文介绍ArkTS的基本语法,包括组件结构、模板和脚本部分,并通过“Hello World”和计数器示例展示其使用方法。
146 1
|
4月前
|
缓存 测试技术 C#
使用Radzen Blazor组件库开发的基于ABP框架炫酷UI主题
【10月更文挑战第20天】本文介绍了使用 Radzen Blazor 组件库开发基于 ABP 框架的炫酷 UI 主题的步骤。从准备工作、引入组件库、设计主题、集成到 ABP 框架,再到优化和调试,详细讲解了每个环节的关键点和注意事项。通过这些步骤,你可以打造出高性能、高颜值的应用程序界面。
108 1
|
4月前
|
开发框架 JavaScript 前端开发
鸿蒙NEXT开发声明式UI是咋回事?
【10月更文挑战第15天】鸿蒙NEXT的声明式UI基于ArkTS,提供高效简洁的开发体验。ArkTS扩展了TypeScript,支持声明式UI描述、自定义组件及状态管理。ArkUI框架则提供了丰富的组件、布局计算和动画能力。开发者仅需关注数据变化,UI将自动更新,简化了开发流程。此外,其前后端分层设计与编译时优化确保了高性能运行,利于生态发展。通过组件创建、状态管理和渲染控制等方式,开发者能快速构建高质量的鸿蒙应用。
221 3
|
9月前
|
Android开发 缓存 双11
android的基础ui组件,Android开发社招面试经验
android的基础ui组件,Android开发社招面试经验
android的基础ui组件,Android开发社招面试经验
|
5月前
|
前端开发 开发者 UED
前端只是切图仔?来学学给开发人看的UI设计
该文章针对前端开发者介绍了UI设计的基本原则与实践技巧,覆盖了布局、色彩理论、字体选择等方面的知识,并提供了设计工具和资源推荐,帮助开发者提升产品的视觉与交互体验。

热门文章

最新文章