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(); _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) { if (animationClips.TryGetValue(animationName, out var clip) is false) return; var layer = isAdditive ? 2 : 1; 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(); if (isAdditive is false) _override.RemoveOverride(animationName); } } } }