多轮审查和修复
This commit is contained in:
63
Assets/Scripts/Player/States/HurtState.cs
Normal file
63
Assets/Scripts/Player/States/HurtState.cs
Normal file
@@ -0,0 +1,63 @@
|
||||
using UnityEngine;
|
||||
using BaseGames.Combat;
|
||||
|
||||
namespace BaseGames.Player.States
|
||||
{
|
||||
/// <summary>
|
||||
/// 受击硬直状态(架构 05_PlayerModule §2)。
|
||||
/// 由 PlayerController.TakeDamage 在玩家非无敌时触发;
|
||||
/// 播放 Hurt 动画,施加击退,结束后回到 Idle 或 Fall。
|
||||
/// </summary>
|
||||
public class HurtState : PlayerStateBase
|
||||
{
|
||||
private float _timer;
|
||||
private bool _ended;
|
||||
|
||||
public HurtState(PlayerController owner) : base(owner) { }
|
||||
|
||||
public void Initialize(BaseGames.Combat.DamageInfo info)
|
||||
{
|
||||
// 由 PlayerController.TakeDamage 传入伤害信息
|
||||
if (info.KnockbackForce > 0.01f)
|
||||
Move?.ApplyKnockback(info.KnockbackDirection, info.KnockbackForce);
|
||||
}
|
||||
|
||||
public override void OnStateEnter()
|
||||
{
|
||||
// 持续时长从 PlayerAnimationConfigSO 读取,不同攻击可设置不同硬直
|
||||
_timer = Owner.AnimConfig?.HurtDuration ?? 0.4f;
|
||||
_ended = false;
|
||||
Stats?.BeginInvincibility();
|
||||
|
||||
if (AnimCfg?.Hurt != null)
|
||||
{
|
||||
var state = Anim?.Play(AnimCfg.Hurt);
|
||||
if (state != null)
|
||||
state.Events(this).OnEnd = OnHurtEnd;
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnStateUpdate()
|
||||
{
|
||||
_timer -= Time.deltaTime;
|
||||
if (_timer <= 0f)
|
||||
OnHurtEnd();
|
||||
}
|
||||
|
||||
private void OnHurtEnd()
|
||||
{
|
||||
if (_ended) return;
|
||||
_ended = true;
|
||||
if (Stats != null && !Stats.IsAlive)
|
||||
{
|
||||
Owner.TransitionTo(Owner.GetState<DeadState>());
|
||||
return;
|
||||
}
|
||||
|
||||
if (Move.IsGrounded)
|
||||
Owner.TransitionTo(Owner.GetState<IdleState>());
|
||||
else
|
||||
Owner.TransitionTo(Owner.GetState<FallState>());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user