增加传送门逻辑

增加无敌时间
This commit is contained in:
2026-07-05 22:50:58 +08:00
parent b7aac301ba
commit c06a8abad0
7 changed files with 322 additions and 697 deletions
@@ -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 &lt;= 0 表示永久无敌(直到被外部取消)。
/// duration &gt; 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()
{