计数器逻辑异常:拍照按钮需多触发一次才会禁用
问题分析与修复方案
看起来你遇到的是逻辑顺序导致的小bug——当前代码要等到第7次点击拍照按钮才会触发完成状态,因为完成逻辑是在下一次调用CapturePhoto时才会执行,而不是在达到目标步数的那次点击后立即触发。
问题根源
假设总步数driftNumSteps = 6,初始CurrentStep = 0:
- 第1-6次点击时,
CurrentStep从0递增到6,每次都满足CurrentStep <= 6-1(也就是<=5)的条件,所以只会执行拍照逻辑,不会进入else分支。 - 第7次点击时,
CurrentStep = 6,不满足<=5,才会进入else分支触发完成状态。
修复后的代码
我们调整逻辑,在每次拍照后递增步数,然后立即检查是否达到目标步数,达到的话直接触发完成逻辑,不需要等下一次点击:
public void CapturePhoto(float latitude, float longitude) { // 先判断是否已经完成,避免重复执行无效操作 if (GameManager.CurrentStep >= GameManager.instance.driftNumSteps) { GameManager.instance.driftInstructionText.text = "Drift Completed!!"; Debug.Log("Drift is already complete!"); return; } // 执行拍照相关的业务逻辑 // 获取下一个漂移步骤(用CurrentStep+1,因为还未递增步数) EventManager.GetDriftStep(GameManager.CurrentStep + 1); // 插入照片数据到SQL(替换硬编码经纬度为方法参数) GetComponent<SQLiteActions>().InsertPhotoData(GameManager.CurrentDriftID, "texture path", latitude, longitude); // 拍照保存逻辑(你的注释代码可以保留) /*if (PhoneCamera.backCam != null) { Texture2D photo = new Texture2D(PhoneCamera.backCam.width, PhoneCamera.backCam.height); photo.SetPixels(PhoneCamera.backCam.GetPixels()); photo.Apply(); SavePhotoToCameraRoll(photo); Debug.Log("Photo Captured!"); } else { Debug.Log("Phone Camera Not Found!"); }*/ // 递增步数 GameManager.CurrentStep++; // 检查是否达到目标步数,立即触发完成状态 if (GameManager.CurrentStep == GameManager.instance.driftNumSteps) { GameManager.instance.driftInstructionText.text = "Drift Completed!!"; Debug.Log("Drift is complete!!"); UIActions.EnableButton(GameManager.instance.newDriftBtn); UIActions.DisableButton(GameManager.instance.takePhotoBtn); } Debug.Log(GameManager.CurrentStep + " out of " + GameManager.instance.driftNumSteps + " steps."); }
关键调整点
- 前置判断:先检查是否已经完成,避免重复执行拍照逻辑。
- 递增后立即检查完成:每次拍照完成后递增步数,直接判断是否达到目标,达到就立即触发完成状态(禁用按钮、提示文本),不需要等下一次点击。
- 修正参数传递:把硬编码的经纬度换成方法参数
latitude和longitude,更符合业务逻辑。
这样修改后,当CurrentStep从5递增到6(刚好达到总步数6)时,就会在第6次点击拍照按钮后立即触发完成状态,不会多等一次点击。
内容的提问来源于stack exchange,提问作者greyBow




