using System.Collections; using System.Collections.Generic; using Animancer; using AYellowpaper.SerializedCollections; using BITKit; using BITKit.Entities; using UnityEngine; namespace BITFALL.Movement.MotionBased { public class MotionBasedBehavior : EntityBehavior { [SerializeField] private AnimancerComponent animancerComponent; [SerializeField] private SerializedDictionary animationClips; [SerializeField] private SerializedDictionary avatarMasks; [SerializeField] private bool allowDeathAnimation; [Inject] private IEntityOverride _override; [Inject] private IHealth _health; private string lastAnimationName; public override void OnStart() { base.OnStart(); _health.OnDamageRelease += OnDamageRelease; _health.OnSetAlive += OnSetAlive; UnityEntity.AddListener(Constant.Animation.Play,Play); animancerComponent.Layers[2].IsAdditive = true; foreach (var pair in avatarMasks) { animancerComponent.Layers[pair.Key].SetMask(pair.Value); } } private void OnSetAlive(bool obj) { if (obj) { //_override.RemoveOverride(-1); animancerComponent.Layers[8].Stop(); } else if( allowDeathAnimation) { //animancerComponent.Layers[1].Stop(); Play("Death",false,8); // _override.AddOverride(-1); // if (animationClips.TryGetValue("Death", out var clips) is false) return; // var state = animancerComponent.Layers[8].Play(clips.Random()); // state.Events.OnEnd += OnEnd; // return; // void OnEnd() // { // _override.RemoveOverride(-1); // state.Events.OnEnd = null; // animancerComponent.Layers[8].Stop(); // } } } private void OnDamageRelease(DamageMessage obj) { if (_health.IsAlive) Play("GetDamage",true); // if (obj.Position is not { x: 0, z: 0 }) // { // var direction = Vector3.ProjectOnPlane(obj.Position - transform.position, Vector3.up); // transform.rotation = Quaternion.LookRotation(direction); // } } public void Play(string animationName)=>Play(animationName,false); public void Play(string animationName, bool isAdditive,int layer = -1) { if (animationClips.TryGetValue(animationName, out var clip) is false) return; layer = layer is -1 ? isAdditive ? 2 : 1 : layer; if (string.IsNullOrEmpty(lastAnimationName) is false) { _override.RemoveOverride(lastAnimationName); } if (isAdditive is false) _override.AddOverride(animationName); animancerComponent.Layers[layer].Stop(); var state = animancerComponent.Layers[layer].Play(clip.Random(), 0.2f); state.Events.OnEnd += RemoveOverride; lastAnimationName = animationName; return; void RemoveOverride() { state.Events.OnEnd = null; animancerComponent.Layers[layer].Stop(); UnityEntity.Invoke(Constant.Animation.OnPlayEnd,animationName); if (isAdditive is false) _override.RemoveOverride(animationName); } } } }