You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity游戏中玩家死亡一次扣除2颗心而非1颗,该问题如何解决?

问题根因

你的Lives()扣血方法每次死亡时被调用了2次,所以单次死亡会扣除2点生命值,和你Debug输出连续两个数值的表现完全吻合。

解决方案

你可以按以下步骤排查修复:

  • 首先检查重复挂载:确认玩家对象上是否挂了多个带相同OnTriggerEnter碰撞逻辑的脚本,或是场景里存在重复的Water碰撞体,删掉多余的重复内容即可。
  • 加扣血冷却防抖:在生命值管理器中增加冷却标记,避免短时间内重复触发扣血,修改后的代码如下:
// Lives Manager 代码修改部分
private bool isInCooldown = false;
// 冷却时长可根据需求调整,这里设1秒
public float cooldownTime = 1f;

public void Lives()
{
    // 冷却期内直接跳过扣血逻辑
    if (isInCooldown) return;

    playerLives -= 1;
    Debug.Log(playerLives);
    livesTxt.text = "Lives - " + playerLives.ToString();

    // 开启冷却,到期后重置标记
    isInCooldown = true;
    Invoke(nameof(ResetCooldown), cooldownTime);
}

private void ResetCooldown()
{
    isInCooldown = false;
}
  • 过滤重复碰撞触发:如果玩家对象上挂了多个子碰撞体(比如身体、脚部分开做碰撞盒),就会多次触发Water的碰撞检测,可以在触发逻辑里加过滤条件,修改后的代码如下:
// 碰撞逻辑代码修改部分
public void OnTriggerEnter(Collider other)
{
    if(other.gameObject.tag == "Water")
    {
        // 只有玩家根对象的碰撞盒触发才执行逻辑,可根据自己的Tag设置调整
        if (!other.attachedRigidbody.gameObject.CompareTag("Player")) return;
        
        Vector3 randomPosition = new Vector3(Random.Range(minX, maxX), Random.Range(minY, maxY), Random.Range(minZ, maxZ));
        player.transform.position = randomPosition;
        LivesScore.instance.Lives();
    }
}

内容的提问来源于stack exchange,提问作者Alexander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:27:01