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

Unity中killedZombies击杀计数不增加问题排查求助

问题原因分析

你的核心问题是击杀计数没有全局共享:

  • killedZombies是zombieScript的实例变量,每个僵尸对象都有自己独立的这个变量。当你销毁僵尸时,自增的只是当前被销毁僵尸对象里的killedZombies,对象销毁后这个值就消失了。下一个僵尸被击杀时,它自己的killedZombies还是初始值0,自增后变成1,所以控制台永远只会输出1,无法累计到10。
  • 虽然Destroy(gameObject)之后的代码会被执行完,但这个变量属于即将被销毁的对象,没有任何持久化或共享机制,完全起不到全局计数的作用。
解决方案

有三种常见的修复方式,根据你的项目需求选择:

方案1:将计数放到玩家脚本(推荐)

把全局击杀计数托管给玩家脚本,因为玩家对象通常不会随僵尸被销毁,适合存储全局状态:

  1. 在playerScript中添加全局计数变量:
public class playerScript : MonoBehaviour
{
    // 保留你原有的其他代码
    public int killedZombies = 0; // 全局僵尸击杀计数
}
  1. 修改zombieScript的TakeDamage方法,更新玩家脚本里的计数:
void TakeDamage(int damageAmount)
{
    leven -= damageAmount;
    if(leven <= 0)
    {
        // 先更新玩家的全局计数
        playerScript.killedZombies++;
        Debug.Log(playerScript.killedZombies);

        if(playerScript.killedZombies == 10)
        {
            SceneManager.LoadScene(2);
        }

        // 最后销毁当前僵尸对象
        Destroy(gameObject);
    }
}
  1. 确保zombieScript中的playerScript变量正确赋值:
    • 要么在Unity编辑器的Inspector面板中,把玩家对象拖到zombieScript的playerScript字段上;
    • 要么在Start方法中补充获取逻辑:
      void Start()
      {
          speler = FindObjectOfType<playerScript>().transform;
          playerScript = speler.GetComponent<playerScript>(); // 获取玩家脚本组件
      }
      

方案2:使用静态变量

把killedZombies改成静态变量,让所有僵尸实例共享同一个值:

public class zombieScript : MonoBehaviour
{
    // 其他变量保留,把killedZombies改成静态
    public static int killedZombies = 0;

    // ...其他代码...

    void TakeDamage(int damageAmount)
    {
        leven -= damageAmount;
        if(leven <= 0)
        {
            killedZombies++;
            Debug.Log(killedZombies);

            if(killedZombies == 10)
            {
                SceneManager.LoadScene(2);
            }

            Destroy(gameObject);
        }
    }
}

注意:静态变量不会随场景切换自动重置,如果你的场景2回到主菜单或其他场景,需要手动在场景加载时重置killedZombies = 0,避免影响后续游戏流程。

方案3:使用游戏管理器单例(适合复杂项目)

创建一个专门的GameManager单例类,统一管理游戏的全局状态(击杀数、分数、关卡进度等):

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    public int killedZombies = 0;

    void Awake()
    {
        // 单例逻辑,确保全局只有一个GameManager实例
        if(Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject); // 跨场景保留
        }
        else
        {
            Destroy(gameObject);
        }
    }

    // 可以添加重置计数的方法
    public void ResetKilledCount()
    {
        killedZombies = 0;
    }
}

然后在zombieScript的TakeDamage中调用:

void TakeDamage(int damageAmount)
{
    leven -= damageAmount;
    if(leven <= 0)
    {
        GameManager.Instance.killedZombies++;
        Debug.Log(GameManager.Instance.killedZombies);

        if(GameManager.Instance.killedZombies == 10)
        {
            SceneManager.LoadScene(2);
        }

        Destroy(gameObject);
    }
}
额外注意点
  • 尽量把Destroy(gameObject)放到计数逻辑之后,虽然Unity会执行完当前函数再销毁对象,但这样的代码逻辑更清晰,避免潜在的意外问题。
  • 如果使用方案1或3,确保对应的脚本对象在场景中存在,避免空引用错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:35:00