164 lines
4.4 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|