Unity C#成就系统协程重复触发问题求助
问题分析与解决方案
无限重复输出"Test B"和"Test C"的核心原因是成就触发逻辑被每帧重复执行,且没有正确的“已解锁”状态锁来阻止重复触发。以下是针对性的排查和解决步骤:
修复布尔值判断逻辑
确保成就触发后立即标记为已解锁,且每次判断前先检查解锁状态。错误写法会在每帧满足条件时重复输出日志,正确的逻辑应该是:// 定义解锁标记 private bool isAchievementBUnlocked = false; private bool isAchievementCUnlocked = false; void Update() { // 检查Test B成就 if (!isAchievementBUnlocked && cookieCount >= 触发阈值) { isAchievementBUnlocked = true; Debug.Log("Test B"); // 执行成就弹出动画、菜单文本更新 } // 检查Test C成就 if (!isAchievementCUnlocked && 其他触发条件) { isAchievementCUnlocked = true; Debug.Log("Test C"); // 执行对应成就逻辑 } }避免在Update中轮询,改用事件驱动
如果成就触发依赖饼干数量变化,不要在Update里每帧检查,而是绑定到数量变化的事件回调上,只在数值更新时检查一次:// 饼干数量变化时调用此方法 public void OnCookieCountUpdated(int newCount) { CheckAchievements(newCount); } private void CheckAchievements(int currentCookies) { if (!isAchievementBUnlocked && currentCookies >= 100) { isAchievementBUnlocked = true; Debug.Log("Test B"); TriggerAchievementAnimation(); } if (!isAchievementCUnlocked && currentCookies >= 500) { isAchievementCUnlocked = true; Debug.Log("Test C"); TriggerAchievementAnimation(); } }排查布尔值是否被意外重置
检查脚本中是否有场景加载、数据初始化等逻辑,把解锁标记的布尔值重新设为false,导致触发条件再次满足。统一管理成就状态
可以将所有成就封装为结构体或类,集中管理解锁状态,避免分散的布尔值导致逻辑混乱:[System.Serializable] public class Achievement { public string name; public int requiredCookies; public bool isUnlocked; public string logText; } public List<Achievement> achievements; void Start() { // 初始化所有成就为未解锁状态 foreach (var ach in achievements) { ach.isUnlocked = false; } } public void CheckAllAchievements(int currentCookies) { foreach (var ach in achievements) { if (!ach.isUnlocked && currentCookies >= ach.requiredCookies) { ach.isUnlocked = true; Debug.Log(ach.logText); TriggerAchievementPopup(ach); } } }
内容的提问来源于stack exchange,提问作者MS Paint
相关产品推荐
相关产品推荐

