196 lines
7.2 KiB
C#
196 lines
7.2 KiB
C#
|
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>
|
|||
|
}
|
|||
|
}
|
|||
|
}
|