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

