using System; using System.Collections; using System.Collections.Generic; using Animancer; using BITKit; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Net.Project.B.Inventory; using NodeCanvas.Framework; using NodeCanvas.Tasks.Actions; using Project.B.CharacterController; using UnityEngine; namespace Project.B.Animation { public class PlayerHandAnimancer:IDisposable { private readonly ILogger _logger; private readonly ICharacterController _characterController; private readonly IAfterTicker _ticker; private readonly IPlayerWeaponInventory _weaponInventory; private readonly IServiceProvider _serviceProvider; private readonly IBlackboard _blackboard; private IServiceScope _scope; private PlayerAnimancerController _animancerController; private readonly Animator _animator; private readonly Animator _armAnimator; public PlayerHandAnimancer(IPlayerWeaponInventory weaponInventory, IServiceProvider serviceProvider, IBlackboard blackboard, ILogger logger, IAfterTicker ticker, ICharacterController characterController, Animator animator) { _weaponInventory = weaponInventory; _serviceProvider = serviceProvider; _blackboard = blackboard; _logger = logger; _ticker = ticker; _characterController = characterController; _animator = animator; _armAnimator = _blackboard.GetVariable("animator_arm").value; if (! _armAnimator|| !_armAnimator.avatar ||!_armAnimator.GetBoneTransform(HumanBodyBones.UpperChest)) { return; } _weaponInventory.StateMachine.OnStateChanged += OnStateChanged; _ticker.Add(OnTick); OnStateChanged(null, _weaponInventory.StateMachine.CurrentState); } private void OnTick(float obj) { if(_animancerController is null)return; var bone = _animator.GetBoneTransform(HumanBodyBones.UpperChest); var armBone = _armAnimator.GetBoneTransform(HumanBodyBones.UpperChest); if(!bone ||!armBone)return; _armAnimator.transform.position += bone.position - armBone.position; _armAnimator.transform.rotation = _characterController.Rotation; } private void OnStateChanged(IPlayerWeaponController arg1, IPlayerWeaponController arg2) { if (arg2 is null) { _scope = _serviceProvider.CreateScope(); _animancerController= _scope.ServiceProvider.GetKeyedService(nameof(PlayerHandAnimancer)); _animancerController.AnimancerComponent = _armAnimator.GetComponent(); } else { Release(); } } public void Dispose() { Release(); _weaponInventory.StateMachine.OnStateChanged -= OnStateChanged; _ticker.Remove(OnTick); } private void Release() { _scope?.Dispose(); _animancerController?.Dispose(); _animancerController = null; _scope = null; } } }