Unity僵尸游戏开发:实现僵尸碰撞玩家时每2秒持续造成伤害
问题原因
你当前的逻辑只触发一次伤害的核心原因是:
OnCollisionEnter生命周期函数仅在两个碰撞体第一次接触的帧触发一次,只要不分开再重新碰撞,就不会再次执行该函数内的扣血逻辑。
修复方案
这里给出最容易理解的计时器方案,修改后的完整代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class PlayerHealth : MonoBehaviour { public float Health = 100f; public bool gameOver; // 可配置参数:伤害间隔、单次伤害值 public float damageInterval = 2f; public float damagePerTick = 10f; private Animator playerAnim; // 标记是否正和敌人碰撞 private bool isCollidingWithEnemy = false; // 记录上次造成伤害的时间 private float lastDamageTime; private void Start() { playerAnim = GetComponent<Animator>(); } private void Update() { if (Health <= 0) { playerAnim.SetBool("PlayerDeath", true); gameOver = true; } } // 碰撞开始时触发 void OnCollisionEnter(Collision collision) { if (collision.gameObject.tag == "Enemy") { Debug.Log("Enemy started colliding with player."); // 首次碰撞立即扣一次血 Health -= damagePerTick; // 标记碰撞状态,记录首次伤害时间 isCollidingWithEnemy = true; lastDamageTime = Time.time; } } // 碰撞持续过程中每帧触发 void OnCollisionStay(Collision collision) { if (collision.gameObject.tag == "Enemy" && isCollidingWithEnemy) { // 判断距离上次伤害的时间是否达到间隔阈值 if (Time.time - lastDamageTime >= damageInterval) { Health -= damagePerTick; // 更新上次伤害时间 lastDamageTime = Time.time; Debug.Log("持续碰撞造成一次伤害"); } } } // 碰撞结束时触发 void OnCollisionExit(Collision collision) { if (collision.gameObject.tag == "Enemy") { Debug.Log("Enemy stopped colliding with player."); // 重置碰撞标记,停止后续扣血 isCollidingWithEnemy = false; } } }
改动说明
- 新增了碰撞状态标记、时间记录变量和可配置的伤害参数,不需要调整逻辑就可以修改伤害频率和数值
- 新增
OnCollisionStay生命周期函数,会在两个物体保持接触的每一帧执行,用来判断是否满足间隔扣血的条件 - 新增
OnCollisionExit生命周期函数,当僵尸和玩家分开时自动停止扣血逻辑
内容的提问来源于stack exchange,提问作者Mike Zogheib
相关产品推荐
相关产品推荐

