Files
Net.Like.Xue.Tokyo/Packages-Local/Com.Project.B.Unity/CharacterAnimation/PlayerHandAnimancer.cs
2025-06-24 23:49:13 +08:00

112 lines
3.5 KiB
C#

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<PlayerHandAnimancer> _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<PlayerHandAnimancer> 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>("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<PlayerAnimancerController>(nameof(PlayerHandAnimancer));
_animancerController.AnimancerComponent = _armAnimator.GetComponent<AnimancerComponent>();
}
else
{
Release();
}
}
public void Dispose()
{
Release();
_weaponInventory.StateMachine.OnStateChanged -= OnStateChanged;
_ticker.Remove(OnTick);
}
private void Release()
{
_scope?.Dispose();
_animancerController?.Dispose();
_animancerController = null;
_scope = null;
}
}
}