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

196 lines
7.2 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; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
using DG.Tweening;
[CustomEditor(typeof(DoweenAnimator))]
public class DoweenAnimatorEditor : Editor
{
private List<bool> foldouts = new List<bool>(); // <20><EFBFBD>۵<EFBFBD>״̬
string[] OnenableOpens = new string[] { "<22><>" , "һ<><D2BB><EFBFBD>ѾͲ<D1BE><CDB2><EFBFBD>"};
public override void OnInspectorGUI()
{
// <20><>ȡĿ<C8A1><C4BF><EFBFBD>ű<EFBFBD><C5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DoweenAnimator myScript = (DoweenAnimator)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> animationEffects <20><> shakeEffects <20><><EFBFBD><EFBFBD> ListIndex <20><><EFBFBD><EFBFBD>
List<BaseEffect> sortedEffects = new List<BaseEffect>();
sortedEffects.AddRange(myScript.animationEffects);
sortedEffects.AddRange(myScript.shakeEffects);
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++)
{
BaseEffect effect = sortedEffects[i];
// <20>۵<EFBFBD><DBB5><EFBFBD>
foldouts[i] = EditorGUILayout.Foldout(foldouts[i], $"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{effect.ListIndex}");
if (foldouts[i])
{
EditorGUILayout.BeginVertical(GUI.skin.box);
// <20><><EFBFBD><EFBFBD> AnimationEffect
if (effect is AnimationEffect animationEffect)
{
EditorGUILayout.LabelField("Animation Effect", EditorStyles.boldLabel);
animationEffect.animationType = (AnimationEffect.AnimationType)EditorGUILayout.EnumPopup("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", animationEffect.animationType);
animationEffect.targetValue = EditorGUILayout.Vector3Field("Ŀ<><C4BF>ֵ", animationEffect.targetValue);
animationEffect.duration = EditorGUILayout.FloatField("<22><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>", animationEffect.duration);
animationEffect.easeType = (Ease)EditorGUILayout.EnumPopup("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", animationEffect.easeType);
}
// <20><><EFBFBD><EFBFBD> ShakeEffect
else if (effect is ShakeEffect shakeEffect)
{
EditorGUILayout.LabelField("Shake Effect", EditorStyles.boldLabel);
shakeEffect.shakeType = (ShakeEffect.ShakeType)EditorGUILayout.EnumPopup("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", shakeEffect.shakeType);
shakeEffect.strength = EditorGUILayout.Vector3Field("<22><><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF>", shakeEffect.strength);
shakeEffect.vibrato = EditorGUILayout.IntField("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", shakeEffect.vibrato);
shakeEffect.randomness = EditorGUILayout.FloatField("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", shakeEffect.randomness);
shakeEffect.duration = EditorGUILayout.FloatField("<22><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>", shakeEffect.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 AnimationEffect;
}
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)
{
BaseEffect effectToDelete = sortedEffects[deleteIndex];
if (isAnimationEffect)
{
myScript.animationEffects.Remove((AnimationEffect)effectToDelete);
}
else
{
myScript.shakeEffects.Remove((ShakeEffect)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(<><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;
string[] loopTypeOptions = new string[] { "<22><><EFBFBD>¿<EFBFBD>ʼ", "<22><><EFBFBD><EFBFBD>", "<22><><EFBFBD><EFBFBD>" };
int selectedIndex = EditorGUILayout.Popup("<22>Զ<EFBFBD><D4B6><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", (int)selectedLoopType, loopTypeOptions);
// <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.BeginHorizontal();
myScript.OnenableOpen = EditorGUILayout.Popup(new GUIContent("<22><><EFBFBD><EFBFBD>ģʽ"), myScript.OnenableOpen, OnenableOpens);
if (GUILayout.Button("<22><>λ"))
{
myScript.RestartAnimations();
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><C2B6><EFBFBD><EFBFBD>İ<EFBFBD>ť
if (GUILayout.Button("<22><><EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"))
{
AddAnimationEffect(myScript);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><C2B6><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>İ<EFBFBD>ť
if (GUILayout.Button("<22><><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD>"))
{
AddShakeEffect(myScript);
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
// <20><><EFBFBD>Ӳ<EFBFBD><D3B2>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD>İ<EFBFBD>ť
if (GUILayout.Button("<22><><EFBFBD><EFBFBD>"))
{
myScript.PlayAnimations();
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD>ť
if (GUILayout.Button("<22><>ͣ"))
{
myScript.StopAnimations();
}
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> AnimationEffect
private void AddAnimationEffect(DoweenAnimator script)
{
AnimationEffect newEffect = new AnimationEffect();
script.animationEffects.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> ShakeEffect
private void AddShakeEffect(DoweenAnimator script)
{
ShakeEffect newEffect = new ShakeEffect();
script.shakeEffects.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(DoweenAnimator script)
{
int totalEffects = script.animationEffects.Count + script.shakeEffects.Count;
while (foldouts.Count < totalEffects)
{
foldouts.Add(true); // Ĭ<><C4AC>չ<EFBFBD><D5B9>
}
}
}