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

目录
相关文章
|
5月前
|
开发框架 前端开发 JavaScript
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发一
本文介绍了方舟开发框架(ArkUI)及其两种开发范式:基于ArkTS的声明式开发范式和类Web开发范式。ArkUI是用于构建HarmonyOS应用界面的UI框架,提供极简UI语法和基础设施。声明式开发范式使用ArkTS语言,以组件、动画和状态管理为核心,适合复杂团队协作;类Web开发范式采用HML、CSS、JavaScript三段式开发,适用于简单界面应用,贴近Web开发者习惯。文中还概述了两者的架构和基础能力,帮助开发者选择合适的范式进行高效开发。
191 15
|
5月前
|
编解码 前端开发 Java
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发三
本文介绍了基于声明式UI范式的图形绘制与动画效果实现方法,涵盖绘制图形、添加动画效果及常见组件说明三部分内容。在绘制图形部分,详细讲解了如何通过Circle组件为食物成分表添加圆形标签,以及使用Path组件结合SVG命令绘制自定义图形(如应用Logo)。动画效果部分则展示了如何利用animateTo实现闪屏动画,包括渐出、放大效果,并设置页面跳转;同时介绍了页面间共享元素转场动画的实现方式。最后,文章列举了声明式开发范式中的各类组件及其功能,帮助开发者快速上手构建复杂交互页面。
201 11
|
1月前
|
存储 开发者 容器
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
本文介绍了ArkTS语言中的Class类、泛型、接口、模块化、自定义组件及状态管理等核心概念,并结合代码示例讲解了对象属性、构造方法、继承、静态成员、访问修饰符等内容,同时涵盖了路由管理、生命周期和Stage模型等应用开发关键知识点。
204 1
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
|
4月前
|
JavaScript 前端开发 UED
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发四
本文介绍了Web组件开发与性能优化的相关内容。在Web组件开发部分,涵盖创建组件、设置样式与属性、添加事件和方法以及场景示例,如动态播放视频。性能提升方面,推荐使用数据懒加载、条件渲染替代显隐控制、Column/Row替代Flex、设置List组件宽高及调整cachedCount减少滑动白块等方法,以优化应用性能与用户体验。
208 56
|
4月前
|
编解码 UED 开发者
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发之常见布局
本文主要介绍了自适应布局与响应式布局的相关内容。自适应布局部分涵盖线性布局、层叠布局、弹性布局和网格布局,详细说明了各布局的特性及使用方法,例如线性布局中的排列、拉伸与缩放,弹性布局的方向、换行与对齐方式等。响应式布局则重点讲解了栅格系统和媒体查询,阐述如何通过栅格组件和媒体查询条件实现不同设备上的适配效果。这些技术帮助开发者灵活应对多尺寸屏幕的设计需求,提升用户体验。
271 55
|
5月前
|
存储 开发框架 API
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发二
本文详细介绍了基于声明式UI开发的健康饮食应用的设计与实现过程。内容涵盖从基础环境搭建到复杂功能实现的全流程,包括创建简单视图、构建布局(如Stack、Flex)、数据模型设计、列表与网格布局构建,以及页面跳转和数据传递等核心功能。 本文通过实际案例深入浅出地解析了声明式UI开发的关键技术和最佳实践,为开发者提供了宝贵的参考。
210 14
|
4月前
|
JavaScript 前端开发 开发者
09.HarmonyOS Next数据驱动UI开发:ForEach与动态渲染完全指南(上)
在现代前端开发中,数据驱动UI已成为主流开发范式。HarmonyOS Next的ArkTS语言和声明式UI框架完美支持这一理念,使开发者能够以更高效、更直观的方式构建复杂应用。
118 1
|
8月前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
479 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
11月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
6月前
|
人工智能 物联网 编译器
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
190 11
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡

热门文章

最新文章