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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:54:03