lcy
2026-03-17 01a6a9d95daa7d650f29b867baa437b8b1e38697
Main/System/HeroUI/HeroUIManager.Collect.cs
@@ -30,25 +30,10 @@
            var newHeroData = netPack.HeroInfoList[i];
            int heroID = (int)newHeroData.HeroID;
            // ---- 新增:对比旧数据,检测皮肤状态变化 ----
            if (heroCollectInfoDic.TryGetValue(heroID, out var oldHeroData))
            {
                if (newHeroData.SkinList != null)
                {
                    foreach (var newSkin in newHeroData.SkinList)
                    {
                        // 在旧数据中寻找对应的皮肤
                        var oldSkin = oldHeroData.SkinList?.FirstOrDefault(s => s.SkinID == newSkin.SkinID);
            // 1. 调用封装好的方法:检测并触发新皮肤事件
            CheckAndTriggerNewSkinEvents(heroID, newHeroData);
                        // 如果旧数据中没有这个皮肤(首次获得),或者状态发生了变化
                        if (oldSkin == null || oldSkin.State != newSkin.State)
                        {
                            OnHeroSkinStateChanged?.Invoke(heroID, (int)newSkin.SkinID, newSkin.State);
                        }
                    }
                }
            }
            // 2. 更新字典为最新的网络包数据
            heroCollectInfoDic[heroID] = newHeroData;
        }
@@ -60,6 +45,70 @@
        OnHeroCollectEvent?.Invoke();
    }
    public event Action<int, int> OnNewSkinAcquired;// 当玩家获得新皮肤(激活皮肤)时触发的事件 HeroID SkinID
    /// <summary>
    /// 检查并触发获得新皮肤的事件
    /// </summary>
    private void CheckAndTriggerNewSkinEvents(int heroID, HB122_tagSCHeroInfo.tagSCHero newHeroData)
    {
        // 如果新数据中没有皮肤信息,直接返回
        if (newHeroData?.SkinList == null || newHeroData?.SkinCnt <= 0) return;
        // 尝试获取旧数据
        bool isOldHeroExist = heroCollectInfoDic.TryGetValue(heroID, out var oldHeroData);
        for (int j = 0; j < newHeroData.SkinCnt; j++)
        {
            var newSkin = newHeroData.SkinList[j];
            // 如果新皮肤未激活,直接跳过当前循环,检查下一个皮肤
            if (newSkin.State <= 0) continue;
            bool isNewlyAcquired = false;
            if (!isOldHeroExist)
            {
                // 场景A:这是一个全新的武将,且自带了已激活的非默认皮肤
                isNewlyAcquired = true;
            }
            else
            {
                // 场景B:已有的老武将,需要对比旧数据看这个皮肤是不是刚刚才获得的
                bool foundOldSkin = false;
                if (oldHeroData.SkinList != null)
                {
                    for (int k = 0; k < oldHeroData.SkinCnt; k++)
                    {
                        var oldSkin = oldHeroData.SkinList[k];
                        if (oldSkin.SkinID == newSkin.SkinID)
                        {
                            foundOldSkin = true;
                            // 如果旧数据中该皮肤未激活 (State == 0),现在激活了,算作获得新皮肤
                            if (oldSkin.State == 0)
                            {
                                isNewlyAcquired = true;
                            }
                            break;
                        }
                    }
                }
                // 如果旧武将数据里压根没有这个皮肤的数据(现在是激活状态),也算作获得新皮肤
                if (!foundOldSkin)
                {
                    isNewlyAcquired = true;
                }
            }
            // 如果最终判定为“全新获得”的皮肤,则触发事件
            if (isNewlyAcquired)
            {
                OnNewSkinAcquired?.Invoke(heroID, (int)newSkin.SkinID);
            }
        }
    }
    // public int GetHeroCollectBookPer()
    // {