增加传送门逻辑
增加无敌时间
This commit is contained in:
@@ -29,10 +29,19 @@ namespace IndianOceanAssets.Engine2_5D
|
||||
[SerializeField] private float fadeDuration = 2f;
|
||||
|
||||
private bool _isDead = false; // 防止重复触发死亡
|
||||
private bool _isInvincible = false; // 无敌状态
|
||||
private float _invincibleTimer = 0f; // 无敌剩余时间(<=0 表示永久无敌)
|
||||
|
||||
[Header("受伤无敌")]
|
||||
[Tooltip("玩家受伤后的无敌时间(秒)")]
|
||||
[SerializeField] private float damageInvincibleDuration = 2f;
|
||||
|
||||
/// <summary>是否已死亡(只读)</summary>
|
||||
public bool IsDead => _isDead;
|
||||
|
||||
/// <summary>是否处于无敌状态(只读)</summary>
|
||||
public bool IsInvincible => _isInvincible;
|
||||
|
||||
/// <summary>最大血量(只读)</summary>
|
||||
public int MaxHealth => maxHealth;
|
||||
|
||||
@@ -46,6 +55,7 @@ namespace IndianOceanAssets.Engine2_5D
|
||||
public void Damage(int damageAmount)
|
||||
{
|
||||
if (_isDead) return; // 已死亡,不再处理
|
||||
if (_isInvincible) return; // 无敌状态,免疫伤害
|
||||
|
||||
health -= damageAmount;
|
||||
|
||||
@@ -57,6 +67,10 @@ namespace IndianOceanAssets.Engine2_5D
|
||||
if (isPlayer && AudioManager.Instance != null)
|
||||
AudioManager.Instance.PlaySFXFromResources("SFX/Hurt", 0.7f);
|
||||
|
||||
// 玩家受伤后进入短暂无敌(防止连续掉血)
|
||||
if (isPlayer && !_isDead)
|
||||
MakeInvincible(damageInvincibleDuration);
|
||||
|
||||
// If dead
|
||||
if (health <= 0)
|
||||
{
|
||||
@@ -75,6 +89,41 @@ namespace IndianOceanAssets.Engine2_5D
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 进入无敌状态。
|
||||
/// duration <= 0 表示永久无敌(直到被外部取消)。
|
||||
/// duration > 0 表示限时无敌,到期后自动解除。
|
||||
/// </summary>
|
||||
public void MakeInvincible(float duration = 0f)
|
||||
{
|
||||
_isInvincible = true;
|
||||
|
||||
if (duration <= 0f)
|
||||
{
|
||||
// 永久无敌
|
||||
_invincibleTimer = -1f;
|
||||
StopCoroutine(nameof(InvincibleCountdown));
|
||||
}
|
||||
else
|
||||
{
|
||||
// 限时无敌:刷新计时器
|
||||
_invincibleTimer = duration;
|
||||
StopCoroutine(nameof(InvincibleCountdown));
|
||||
StartCoroutine(InvincibleCountdown());
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>限时无敌倒计时协程</summary>
|
||||
private IEnumerator InvincibleCountdown()
|
||||
{
|
||||
while (_invincibleTimer > 0f)
|
||||
{
|
||||
_invincibleTimer -= Time.deltaTime;
|
||||
yield return null;
|
||||
}
|
||||
_isInvincible = false;
|
||||
}
|
||||
|
||||
// Handles death logic and effects
|
||||
public void Die()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user