BITFALL/Assets/Artists/Scripts/Entities/Movement/MotionBasedBehavior.cs

104 lines
2.9 KiB
C#

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<string, AnimationClip[]> animationClips;
[SerializeField] private SerializedDictionary<int,AvatarMask> 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<string>(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);
}
}
}
}