You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:30:59