112 lines
3.5 KiB
C#
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;
|
|
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
|