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

如何在Unity的OnTriggerEnter函数中实现分数累加 修复数值不增长问题

问题解决:Unity触发器碰撞后分数无法累加、始终停在100

常见原因及对应解决方案

  • 原因1:计分脚本挂载位置错误

你大概率是把这段脚本直接挂在了每一个带IsTrigger属性的墙对象上。每个墙对象的脚本都持有独立的score变量,初始值都是0,每次碰到墙只会给当前墙脚本的score加100,所以每次触发都会显示100,不会累加。
解决方法:把计分逻辑抽成独立的全局管理脚本,只挂载在场景中唯一的全局管理对象上:

// 单独的ScoreManager脚本,挂在场景唯一的全局管理对象上
public class ScoreManager : MonoBehaviour
{
    public static ScoreManager Instance;
    public Text scoreText;
    public int score = 0;

    void Awake()
    {
        // 单例保证全局只有一个计分实例
        if(Instance == null) Instance = this;
        else Destroy(gameObject);
    }

    void Start()
    {
        scoreText.text = score.ToString();
    }

    // 提供公共的加分方法给触发器调用
    public void AddScore(int addValue)
    {
        score += addValue;
        scoreText.text = score.ToString();
        Debug.Log(score);
    }
}

再给每个触发墙单独挂触发检测脚本:

// 挂在每一个带IsTrigger的墙对象上的脚本
public class CheckPointTrigger : MonoBehaviour
{
    // 可自定义每个触发器的加分数值
    public int addScoreValue = 100;
    // 避免同一个触发器被多次触发重复加分
    private bool hasTriggered = false;

    void OnTriggerEnter(Collider collider)
    {
        if (!hasTriggered && collider.CompareTag("Player"))
        {
            hasTriggered = true;
            ScoreManager.Instance.AddScore(addScoreValue);
            // 不需要保留触发器的话可以直接销毁
            // Destroy(gameObject);
        }
    }
}
  • 原因2:身份判断逻辑不稳定,未做触发去重

不要用collider.name == "Player"做身份判断,只要玩家对象名修改就会失效,建议给玩家对象添加Player标签,用CompareTag判断兼容性更高。同时给触发器加hasTriggered标记,避免同一个触发器因为多碰撞体接触、帧内多次调用导致的逻辑异常。

  • 原因3:Inspector面板覆盖了变量初始值

score是public修饰的公共变量,Unity Inspector面板中设置的数值优先级高于代码里的初始赋值。检查你挂载脚本的对象Inspector面板中score属性是不是被手动修改,或者每次场景加载时脚本被重复初始化重置了score。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:06:03