Unity C#脚本i=i+1自增计数失效 多物体计数异常问题
问题根因
- 计数变量
i为实例成员,每个挂载ActionObjet的物体都会独立持有一份i的副本,修改互不影响,无法实现全局累计。 - 收集逻辑写在
Update中监听全局空格键事件,所有激活的脚本实例会在同一帧同步执行判断:只要任意一个物体的image1处于启用状态,所有挂了该脚本的物体都会同时执行计数、切换UI、播放音频的逻辑,直接导致UI状态被互相覆盖、计数重复或丢失,这是偶发仅2个物体可正常触发计数的核心原因。 - 缺少必要约束:没有防重复收集标记、没有多UI同时弹出的拦截,且完全没有实现计数达3后显示通关界面的判断逻辑。

修复方案
直接替换原有脚本代码即可,原有Inspector公开字段引用全部保留,不需要重新拖拽赋值:
using UnityEngine; using UnityEngine.UI; public class ActionObjet : MonoBehaviour { public Image image1; public Image image2; public Image image3; // 静态全局计数,所有脚本实例共享同一份值 private static int collectCount = 0; // 静态交互锁,同一时间仅允许一个物体弹出交互UI private static bool isInteracting = false; // 单个物体收集标记,防止重复计数 private bool isCollected = false; void Start() { image1.enabled = false; image2.enabled = false; // 仅首次初始化时隐藏通关界面 if (collectCount == 0) image3.enabled = false; } void Update() { // 仅当前物体弹出了交互UI、且未被收集时,才响应空格完成收集 if (Input.GetKeyDown(KeyCode.Space) && image1.enabled && !isCollected) { isCollected = true; collectCount++; print($"已收集物体数:{collectCount}"); // 切换UI状态 image2.enabled = true; image1.enabled = false; // 释放交互锁,允许交互下一个物体 isInteracting = false; // 播放收集音效 FindObjectOfType<AudioManager>().Play("bruit_recuperer_objet"); // 计数达标显示通关界面 if (collectCount >= 3) { image3.enabled = true; } } } void OnMouseDown() { // 已收集、或正在交互其他物体时不响应点击 if (isCollected || isInteracting) return; image1.enabled = true; isInteracting = true; } }
关键改动说明
- 将计数变量改为
static静态类型,所有实例共享计数值,解决独立计数问题 - 新增静态交互锁,避免同时弹出多个交互UI、多实例同时触发逻辑的冲突
- 为每个可收集物体增加收集状态标记,杜绝重复计数
- 收窄空格事件的触发范围,仅当前激活交互UI的实例会执行收集逻辑,消除全局监听带来的逻辑混乱
- 补全计数阈值判断,收集满3个物体自动显示通关界面
- 将硬编码的按键字符串替换为
KeyCode枚举,避免字符串拼写错误导致的按键失效
内容的提问来源于stack exchange,提问作者Desperadow
相关产品推荐
相关产品推荐

