将 Enemy 攻击冷却计时器 由 Enemy 内部维护迁移到 TimerModule 维护

This commit is contained in:
2026-06-18 23:09:44 +08:00
parent 0dc5889417
commit 25f36d38c9
3 changed files with 25 additions and 23 deletions
@@ -1,6 +1,7 @@
using SepCore.Components;
using SepCore.CustomUtility;
using SepCore.Definition;
using SepCore.Timer;
using UnityEngine;
using UnityGameFramework.Runtime;
@@ -23,7 +24,8 @@ namespace SepCore.Entity
private int _attackDamage = 1;
private float _sqrAttackRange;
private float _currAttackTimer;
private TimerHandle _attackTimerHandle;
private bool _canAttack;
private AttackStateType _attackState = AttackStateType.Idle;
@@ -69,7 +71,8 @@ namespace SepCore.Entity
_attackDamage = Mathf.Max(1, _meleeEnemyData.AttackDamage);
_sqrAttackRange = _attackRange * _attackRange;
_currAttackTimer = 0f;
_canAttack = false;
_attackTimerHandle = GameEntry.Timer.ScheduleOnce(_attackCooldown, () => _canAttack = true, this);
_attackState = AttackStateType.Idle;
_targetableTarget = null;
@@ -93,7 +96,8 @@ namespace SepCore.Entity
_movementComponent.OnReset();
_healthComponent.OnReset();
_targetableTarget = null;
_currAttackTimer = 0f;
GameEntry.Timer.Cancel(_attackTimerHandle);
_attackTimerHandle = TimerHandle.Invalid;
_attackState = AttackStateType.Idle;
base.OnHide(isShutdown, userData);
@@ -109,8 +113,6 @@ namespace SepCore.Entity
private void UpdateAttackState(float elapseSeconds)
{
_currAttackTimer += elapseSeconds;
switch (_attackState)
{
case AttackStateType.Idle:
@@ -151,8 +153,10 @@ namespace SepCore.Entity
return;
}
if (_currAttackTimer >= _attackCooldown)
if (_canAttack)
{
_canAttack = false;
_attackTimerHandle = GameEntry.Timer.ScheduleOnce(_attackCooldown, () => _canAttack = true, this);
TransitionTo(AttackStateType.Attack);
}
@@ -169,21 +173,15 @@ namespace SepCore.Entity
SetMove(false);
}
if (_attackState == AttackStateType.Check_InRange && _currAttackTimer >= _attackCooldown)
{
TransitionTo(AttackStateType.Attack);
return;
}
if (_attackState == AttackStateType.Attack)
{
SetMove(false);
ExecuteAttack();
_currAttackTimer = 0f;
TransitionTo(AttackStateType.Check_InRange);
}
}
private bool HasValidTarget()
{
if (_target == null) return false;