Files
test/Assets/Scripts/PlayerVisual.cs
T
2025-10-16 16:28:29 +07:00

99 lines
2.8 KiB
C#

using Animancer;
using BrewMonster;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerVisual : MonoBehaviour
{
[SerializeField] NamedAnimancerComponent namedAnimancer;
[SerializeField] private INFO _playerInfo;
[SerializeField] private AnimancerState _currentState;
[SerializeField] private Queue<string> _animationQueue = new Queue<string>();
[SerializeField] private bool isHit;
QueueActionEvent queueActionEvent;
private void PlayActionEventHandler(PlayActionEvent @event)
{
_currentState = namedAnimancer.TryPlay(@event.AnimationName);
if (_currentState == null)
{
BMLogger.LogError("HoangDev: PlayActionEventHandler Failed " + @event.AnimationName);
}
}
public void InitHostPlayerEventDoneHandler()
{
namedAnimancer = GetComponentInChildren<NamedAnimancerComponent>();
if (namedAnimancer == null)
{
BrewMonster.BMLogger.LogError("animancer == null");
return;
}
var player = GetComponentInParent<CECPlayer>();
if (player == null)
{
BrewMonster.BMLogger.LogError("player == null");
return;
}
_playerInfo = player.GetPlayInfo();
EventBus.SubscribeChannel<PlayActionEvent>(_playerInfo.cid, PlayActionEventHandler);
EventBus.SubscribeChannelClass<QueueActionEvent>(_playerInfo.cid, QueueActionEventHandler);
}
private void QueueActionEventHandler(QueueActionEvent @event)
{
if (!EnqueueAnimation(@event))
{
BMLogger.LogError("HoangDev : EnqueueAnimation Failed");
}
}
private void Update()
{
PlayNext();
}
public bool EnqueueAnimation(QueueActionEvent @event)
{
if (namedAnimancer == null) return false;
queueActionEvent = @event;
_animationQueue.Enqueue(@event.AnimationName);
if (!isHit)
{
isHit = @event.IsHitAnim;
}
return true;
}
private void PlayNext()
{
if (_animationQueue.Count == 0)
{
return;
}
if (_currentState == null) return;
if (_currentState.NormalizedTime < 1f) return;
if (isHit)
{
ApplyDamage();
}
string animName = _animationQueue.Dequeue();
_currentState = namedAnimancer.TryPlay(animName);
}
void ApplyDamage()
{
isHit = false;
queueActionEvent.SetFlag(true, queueActionEvent.AttackEvent);
}
private void OnDestroy()
{
EventBus.UnsubscribeAllInChannel(_playerInfo.cid);
}
public bool IsAnimationExist(string animationName)
{
return namedAnimancer.States.TryGet("ActionName", out var existingState) ? true : false;
}
}