BITFALL/Assets/Artists/Scripts/Entities/Animation/EntitiesAnimationController.cs

67 lines
2.1 KiB
C#
Raw Normal View History

2023-10-20 19:31:12 +08:00
using System.Collections;
using System.Collections.Generic;
2023-11-21 18:05:18 +08:00
using System.Linq;
using System.Security.Permissions;
2023-10-29 15:27:13 +08:00
using AYellowpaper.SerializedCollections;
2023-11-30 00:23:23 +08:00
using BITFALL.Entities;
2023-10-29 15:27:13 +08:00
using BITFALL.Entities.Equipment;
using BITKit.Animations;
2023-10-20 19:31:12 +08:00
using UnityEngine;
2023-10-29 15:27:13 +08:00
namespace BITKit.Entities.Animation
2023-10-20 19:31:12 +08:00
{
2023-10-30 01:25:53 +08:00
public sealed class EntitiesAnimationController : EntityBehavior
2023-10-29 15:27:13 +08:00
{
[SerializeField] private UnityAnimator unityAnimator;
[SerializeField] private SerializedDictionary<string, RuntimeAnimatorController> animatorControllers;
[Inject]
private IEntityEquipment _entityEquipment;
2023-11-30 00:23:23 +08:00
[Inject(true)]
private IKnockdown _knockdown;
[Inject]
private IHealth _health;
2023-10-29 15:27:13 +08:00
private RuntimeAnimatorController _initialRuntimeAnimatorController;
private readonly DoubleBuffer<RuntimeAnimatorController> _runtimeAnimatorControllerBuffer = new();
public override void OnAwake()
{
base.OnAwake();
2023-10-30 01:25:53 +08:00
_entityEquipment.OnEquipAddressable += OnEquip;
2023-11-15 23:54:54 +08:00
_entityEquipment.OnUnEquipAddressable += UnEquip;
2023-10-29 15:27:13 +08:00
_initialRuntimeAnimatorController = unityAnimator.animator.runtimeAnimatorController;
2023-11-30 00:23:23 +08:00
2023-10-29 15:27:13 +08:00
}
2023-11-15 23:54:54 +08:00
private void UnEquip(string obj)
{
2023-11-30 00:23:23 +08:00
if (_knockdown is not null && _knockdown.IsKnockdown) return;
if (_health.IsAlive is false) return;
2023-11-21 18:05:18 +08:00
if (animatorControllers.Values.Any(x => x == unityAnimator.animator.runtimeAnimatorController))
_runtimeAnimatorControllerBuffer.Release(_initialRuntimeAnimatorController);
2023-11-15 23:54:54 +08:00
}
2023-10-29 15:27:13 +08:00
public override void OnLateUpdate(float deltaTime)
{
if(_runtimeAnimatorControllerBuffer.TryGetRelease(out var controller))
{
2023-11-30 00:23:23 +08:00
if (controller is AnimatorOverrideController overrideController)
{
controller = overrideController.CopyAndFillMissingContent(_initialRuntimeAnimatorController as AnimatorOverrideController);
}
2023-10-29 15:27:13 +08:00
unityAnimator.animator.runtimeAnimatorController = controller;
2023-11-30 00:23:23 +08:00
unityAnimator.animator.Update(deltaTime);
2023-10-29 15:27:13 +08:00
}
}
2023-10-30 01:25:53 +08:00
private void OnEquip(string equipName)
2023-10-29 15:27:13 +08:00
{
2023-11-30 00:23:23 +08:00
if (_knockdown is not null && _knockdown.IsKnockdown) return;
2023-10-30 01:25:53 +08:00
_runtimeAnimatorControllerBuffer.Release(animatorControllers.TryGetValue(equipName, out var controller)
? controller
: _initialRuntimeAnimatorController);
2023-10-29 15:27:13 +08:00
}
}
2023-10-20 19:31:12 +08:00
}