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
相关产品推荐
相关产品推荐

