zxl
/
CTT
forked from Cal/CTT
1
0
Fork 0
CTT/Unity/Assets/ModelView/Mono/MonoAnimancer.cs

164 lines
4.4 KiB
C#

using Animancer;
using Sirenix.OdinInspector;
using Sirenix.Serialization;
using System;
using System.Collections.Generic;
using UnityEngine;
namespace ET
{
public enum AnimationKey
{
Idle,
Run,
Atk,
Hurt,
Other,
}
[Serializable]
public struct AnimationClipInfo
{
public AnimationKey Key;
public AnimationClip AnimationClip;
}
public class MonoAnimancer : AnimancerComponent
{
[SerializeField]
private AnimationClipInfo[] _Clips;
private Dictionary<AnimationKey, AnimationClip> _AnimationClipDic;
private AnimationClip _AnimationClip;
public AnimationClip CurrClip => _AnimationClip;
private bool isAtk;
protected override void OnEnable()
{
base.OnEnable();
_AnimationClipDic = new Dictionary<AnimationKey, AnimationClip>();
foreach (AnimationClipInfo item in _Clips)
{
_AnimationClipDic[item.Key] = item.AnimationClip;
}
if (_AnimationClipDic.ContainsKey(AnimationKey.Other))
{
_AnimationClip = _AnimationClipDic[AnimationKey.Other];
}
else
PlayIdle();
}
public void PlayIdle()
{
isAtk = false;
_AnimationClip = _AnimationClipDic[AnimationKey.Idle];
Play(_AnimationClip, 0.1f);
}
public AnimancerState PlayRun(float fadeDuration = 0.1f)
{
isAtk = false;
_AnimationClip = _AnimationClipDic[AnimationKey.Run];
AnimancerState state = Play(_AnimationClip, fadeDuration);
if (_AnimationClip.isLooping)
{
}
else
{
state.Events.OnEnd = PlayIdle;
}
return state;
}
public AnimancerState PlayAtk(float fadeDuration = 0.1f)
{
isAtk = true;
_AnimationClip = _AnimationClipDic[AnimationKey.Atk];
AnimancerState state = Play(_AnimationClip, fadeDuration);
if (_AnimationClip.isLooping)
{
}
else
{
state.Events.OnEnd = PlayIdle;
}
return state;
}
public AnimancerState PlayHurt(float fadeDuration = 0.1f)
{
if (isAtk) return States.Current;
_AnimationClip = _AnimationClipDic[AnimationKey.Hurt];
AnimancerState state = Play(_AnimationClip, fadeDuration);
if (_AnimationClip.isLooping)
{
}
else
{
state.Events.OnEnd = PlayIdle;
}
return state;
}
public AnimancerState PlayOther(Action endEvent = null, float fadeDuration = 0.1f)
{
isAtk = false;
_AnimationClip = _AnimationClipDic[AnimationKey.Other];
AnimancerState state = Play(_AnimationClip, fadeDuration);
if (_AnimationClip.isLooping)
{
}
else
{
state.Events.OnEnd = () =>
{
state.Stop();
endEvent?.Invoke();
};
}
return state;
}
public void SetClips(AnimationClipInfo[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
SetKey(ref arr[i]);
}
_Clips = arr;
}
private void SetKey(ref AnimationClipInfo animationClipInfo)
{
string clipName = animationClipInfo.AnimationClip.name;
if (clipName.Contains("Idle"))
{
animationClipInfo.Key =AnimationKey.Idle;
}
else if (clipName.Contains("Run"))
{
animationClipInfo.Key =AnimationKey.Run;
}
else if (clipName.Contains("Attack"))
{
animationClipInfo.Key =AnimationKey.Atk;
}
else if (clipName.Contains("Hurt")
)
{
animationClipInfo.Key =AnimationKey.Hurt;
}
else
animationClipInfo.Key =AnimationKey.Other;
}
public AnimationClipInfo[] GetClips()
{
return _Clips;
}
}
}