Unity C#如何实现正确的金币累加计分计数器
Unity C# 金币收集计数器修正方案
原代码核心错误
- 计数变量写在碰撞方法内部的for循环中,属于局部临时变量,每次触发碰撞都会从0重置,无法实现多次碰撞间的数值累计
- 无意义的for循环完全不符合业务逻辑:单次碰撞事件仅对应一个碰撞对象,循环3次会导致单次拾取金币时重复输出3次日志,属于冗余逻辑
- 没有全局持久化的计数存储变量,收集数无法在游戏运行过程中持续累加
修正后可直接运行的代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Script : MonoBehaviour { // 声明为类成员变量,在脚本整个生命周期内保留数值,初始收集数为0 private int coinCount = 0; void OnCollisionEnter(Collision collision) { // 判定碰撞对象是否为金币 if (collision.collider.CompareTag("coin")) { // 收集数累加1 coinCount++; // 销毁被收集的金币对象 Destroy(collision.gameObject); // 输出当前累计收集数量 Debug.Log("Coins collected: " + coinCount); } } }
配置注意事项
- 请提前在Unity编辑器中将金币预制体/场景对象的Tag设置为
coin,字符串大小写完全匹配才能正常触发判定 - Unity普通碰撞生效的前置条件:碰撞双方都挂载Collider组件,且至少一方挂载非动力学Rigidbody组件
如果你的金币碰撞体勾选了
Is Trigger选项(用于实现无物理阻挡的拾取),请将碰撞回调替换为触发器版本,代码如下:private int coinCount = 0; void OnTriggerEnter(Collider other) { if (other.CompareTag("coin")) { coinCount++; Destroy(other.gameObject); Debug.Log("Coins collected: " + coinCount); } }
内容的提问来源于stack exchange,提问作者hmirza
相关产品推荐
相关产品推荐

