MayHeCome/Assets/Editor/动画/AnimationUIEditor.cs

205 lines
7.6 KiB
C#
Raw Normal View History

2024-12-18 09:55:34 +00:00
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using System.Linq;
using DG.Tweening;
[CustomEditor(typeof(AnimationUI))]
public class AnimationUIEditor : Editor
{
private List<bool> foldouts = new List<bool>(); // <20><EFBFBD>۵<EFBFBD>״̬
string[] OnenableOpens = new string[] { "һ<><D2BB><EFBFBD>ѾͲ<D1BE><CDB2><EFBFBD>", "<22><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>","<22><>ʧǰ<CAA7><C7B0><EFBFBD><EFBFBD>" };
string[] loopTypeOptions = new string[] { "<22><><EFBFBD>¿<EFBFBD>ʼ", "<22><><EFBFBD><EFBFBD>", "<22><><EFBFBD><EFBFBD>" };
public override void OnInspectorGUI()
{
// <20><>ȡĿ<C8A1><C4BF><EFBFBD>ű<EFBFBD><C5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AnimationUI myScript = (AnimationUI)target;
EditorGUILayout.Space();
// <20><>ʼ<EFBFBD><CABC><EFBFBD>۵<EFBFBD><DBB5>б<EFBFBD><D0B1>Ĵ<EFBFBD>С
EnsureFoldoutListSize(myScript);
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫɾ<D2AA><C9BE>ij<EFBFBD><C4B3>Ч<EFBFBD><D0A7>
int deleteIndex = -1;
bool isAnimationEffect = false; // <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
// <20>ϲ<EFBFBD> uiAnimationEffects <20><> uiShakeEffects <20><><EFBFBD><EFBFBD> ListIndex <20><><EFBFBD><EFBFBD>
List<BaseUIEffect> sortedEffects = new List<BaseUIEffect>();
sortedEffects.AddRange(myScript.uiAnimationEffects);
sortedEffects.AddRange(myScript.uiShakeEffects);
sortedEffects = sortedEffects.OrderBy(effect => effect.ListIndex).ToList(); // <20><> ListIndex <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>б<EFBFBD>
for (int i = 0; i < sortedEffects.Count; i++)
{
BaseUIEffect effect = sortedEffects[i];
// <20>۵<EFBFBD><DBB5><EFBFBD>
foldouts[i] = EditorGUILayout.Foldout(foldouts[i], $"UI<55><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> {effect.ListIndex}");
if (foldouts[i])
{
EditorGUILayout.BeginVertical(GUI.skin.box);
// <20><><EFBFBD><EFBFBD> UIAnimationEffect
if (effect is UIAnimationEffect uiAnimationEffect)
{
uiAnimationEffect.animationType = (UIAnimationEffect.AnimationType)EditorGUILayout.EnumPopup("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", uiAnimationEffect.animationType);
uiAnimationEffect.duration = EditorGUILayout.FloatField("<22><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>", uiAnimationEffect.duration);
uiAnimationEffect.easeType = (Ease)EditorGUILayout.EnumPopup("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", uiAnimationEffect.easeType);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD>ȶ<EFBFBD><C8B6><EFBFBD><EFBFBD><EFBFBD>Fade<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ͸<CABE><CDB8><EFBFBD><EFBFBD>ֵ
if (uiAnimationEffect.animationType == UIAnimationEffect.AnimationType.Fade)
{
uiAnimationEffect.targetAlpha = EditorGUILayout.FloatField("Ŀ<><C4BF>͸<EFBFBD><CDB8><EFBFBD><EFBFBD>", uiAnimationEffect.targetAlpha);
}
else
{
uiAnimationEffect.targetValue = EditorGUILayout.Vector3Field("Ŀ<><C4BF>ֵ", uiAnimationEffect.targetValue);
}
}
// <20><><EFBFBD><EFBFBD> UIShakeEffect
else if (effect is UIShakeEffect uiShakeEffect)
{
uiShakeEffect.shakeType = (UIShakeEffect.ShakeType)EditorGUILayout.EnumPopup("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", uiShakeEffect.shakeType);
uiShakeEffect.strength = EditorGUILayout.Vector3Field("<22><><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF>", uiShakeEffect.strength);
uiShakeEffect.vibrato = EditorGUILayout.IntField("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", uiShakeEffect.vibrato);
uiShakeEffect.randomness = EditorGUILayout.FloatField("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", uiShakeEffect.randomness);
uiShakeEffect.duration = EditorGUILayout.FloatField("<22><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>", uiShakeEffect.duration);
}
// <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD> ListIndex
effect.ListIndex = EditorGUILayout.IntField("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", effect.ListIndex);
if (GUILayout.Button(<><C9BE><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>"))
{
deleteIndex = i;
isAnimationEffect = effect is UIAnimationEffect;
}
EditorGUILayout.EndVertical();
}
// <20><><EFBFBD>Ƕ<EFBFBD><C7B6><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
myScript.animationSequenceNeedsUpdate = true;
}
// <20><><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE>Ч<EFBFBD><D0A7>
if (deleteIndex >= 0)
{
BaseUIEffect effectToDelete = sortedEffects[deleteIndex];
if (isAnimationEffect)
{
myScript.uiAnimationEffects.Remove((UIAnimationEffect)effectToDelete);
}
else
{
myScript.uiShakeEffects.Remove((UIShakeEffect)effectToDelete);
}
foldouts.RemoveAt(deleteIndex); // ͬʱ<CDAC>Ƴ<EFBFBD><C6B3>۵<EFBFBD>״̬
}
EditorGUILayout.Space();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2><EFBFBD>
EditorGUILayout.BeginHorizontal();
// <20><>¼<EFBFBD>ɵ<EFBFBD> loopEntireSequence ֵ
bool previousLoopEntireSequence = myScript.loopEntireSequence;
// <20><>ͬһ<CDAC><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ "<22>Ƿ<EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" <20><> "<22>Զ<EFBFBD><D4B6><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" (<28>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
myScript.loopEntireSequence = EditorGUILayout.Toggle(new GUIContent(<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"), myScript.loopEntireSequence);
// <20><><EFBFBD><EFBFBD> loopEntireSequence <20>ı<EFBFBD><C4B1>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (myScript.loopEntireSequence != previousLoopEntireSequence)
{
myScript.animationSequenceNeedsUpdate = true;
Debug.Log(<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>Ѹ<EFBFBD><D1B8>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>");
}
// ͨ<><CDA8><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ LoopType
LoopType selectedLoopType = myScript.sequenceLoopType;
int selectedIndex = EditorGUILayout.Popup(new GUIContent(<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"), (int)selectedLoopType, loopTypeOptions);
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
myScript.OnenableOpen = EditorGUILayout.Popup(new GUIContent("<22><><EFBFBD><EFBFBD>ģʽ"), myScript.OnenableOpen,OnenableOpens);
if (GUILayout.Button("<22><>λ"))
{
myScript.RestartAnimations();
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
// <20><><EFBFBD><EFBFBD> LoopType <20>ı<EFBFBD><C4B1>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ((LoopType)selectedIndex != myScript.sequenceLoopType)
{
myScript.sequenceLoopType = (LoopType)selectedIndex;
myScript.animationSequenceNeedsUpdate = true;
Debug.Log(<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѹ<EFBFBD><D1B8>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>");
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>UI<55><49><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD>ť
if (GUILayout.Button("<22><><EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>UI<55><49><EFBFBD><EFBFBD>"))
{
AddUIAnimationEffect(myScript);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>UI<55><49><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>İ<EFBFBD>ť
if (GUILayout.Button("<22><><EFBFBD><EFBFBD>UI<55><49><EFBFBD><EFBFBD>"))
{
AddUIShakeEffect(myScript);
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
// <20><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>UI<55><49><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD>ť
if (GUILayout.Button("<22><><EFBFBD><EFBFBD>"))
{
myScript.PlayUIAnimations();
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣUI<55><49><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD>ť
if (GUILayout.Button("<22><>ͣ"))
{
myScript.StopUIAnimations();
}
EditorGUILayout.EndHorizontal();
EditorUtility.SetDirty(myScript); // <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>޸ģ<DEB8>ȷ<EFBFBD><C8B7>Unity<74><79><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
}
// <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> UIAnimationEffect
private void AddUIAnimationEffect(AnimationUI script)
{
UIAnimationEffect newEffect = new UIAnimationEffect();
script.uiAnimationEffects.Add(newEffect);
foldouts.Add(true); // Ĭ<><C4AC>չ<EFBFBD><D5B9><EFBFBD>µ<EFBFBD>Ч<EFBFBD><D0A7>
script.animationSequenceNeedsUpdate = true; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
}
// <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> UIShakeEffect
private void AddUIShakeEffect(AnimationUI script)
{
UIShakeEffect newEffect = new UIShakeEffect();
script.uiShakeEffects.Add(newEffect);
foldouts.Add(true); // Ĭ<><C4AC>չ<EFBFBD><D5B9><EFBFBD>µ<EFBFBD>Ч<EFBFBD><D0A7>
script.animationSequenceNeedsUpdate = true; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
}
// ȷ<><C8B7><EFBFBD>۵<EFBFBD><DBB5>б<EFBFBD><D0B1>Ĵ<EFBFBD>С<EFBFBD><D0A1>Ч<EFBFBD><D0A7><EFBFBD>б<EFBFBD>ƥ<EFBFBD><C6A5>
private void EnsureFoldoutListSize(AnimationUI script)
{
int totalEffects = script.uiAnimationEffects.Count + script.uiShakeEffects.Count;
while (foldouts.Count < totalEffects)
{
foldouts.Add(true); // Ĭ<><C4AC>չ<EFBFBD><D5B9>
}
}
}