少年修仙传客户端代码仓库
8604 子 【港台】1.0.1【BT】【长尾】新增限时集字活动 / 【港台】【BT】【长尾】【前端】新增限时集字活动 -- 优化itemcell被clone产生两份子物件问题
4个文件已修改
170 ■■■■ 已修改文件
System/KnapSack/New/CommonItemBaisc.cs 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/CollectWordsCell.cs 55 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/CollectWordsModel.cs 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/OpenServerActivity/CollectWordsWin.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/KnapSack/New/CommonItemBaisc.cs
@@ -85,7 +85,10 @@
                if (m_SuitEffect == null)
                {
                    LoadPrefab();
                    m_SuitEffect = EquipSuitEffect.Create(transform as RectTransform);
                    //clone 会造成二次创建
                    m_SuitEffect = transform.GetComponentInChildren<EquipSuitEffect>();
                    if (m_SuitEffect == null)
                        m_SuitEffect = EquipSuitEffect.Create(transform as RectTransform);
                }
                return m_SuitEffect;
            }
@@ -98,7 +101,10 @@
                if (m_ItemBaseEffect == null)
                {
                    LoadPrefab();
                    m_ItemBaseEffect = ItemBaseEffect.Create(transform as RectTransform);
                    //clone 会造成二次创建
                    m_ItemBaseEffect = transform.GetComponentInChildren<ItemBaseEffect>();
                    if (m_ItemBaseEffect == null)
                        m_ItemBaseEffect = ItemBaseEffect.Create(transform as RectTransform);
                }
                return m_ItemBaseEffect;
            }
@@ -109,6 +115,13 @@
        GameObject cellContainer;
        protected void LoadPrefab()
        {
            //clone 会造成二次创建
            var tmp = transform.Find("Container_ItemCell");
            if (tmp != null)
            {
                cellContainer = tmp.gameObject;
                return;
            }
            if (cellContainer == null)
            {
                switch (format)
System/OpenServerActivity/CollectWordsCell.cs
@@ -16,6 +16,9 @@
        ItemCell itemCell;
        Image Img_Complete;
        LayoutGroup Layout;
        Transform CollectWord;
        int updateFrame = -1;
        CollectWordsModel model
        {
@@ -35,6 +38,7 @@
            itemCell = GetWidgt<ItemCell>("itemCell");
            Img_Complete = GetWidgt<Image>("Img_Complete");
            Layout = GetWidgt<LayoutGroup>("Layout");
            CollectWord = GetWidgt<Transform>("CollectWord");
        }
@@ -69,7 +73,7 @@
                GameObject go = null;
                if (i >= CollectLayout.childCount)
                {
                    go = Instantiate(UILoader.LoadPrefab("ItemCell"));
                    go = Instantiate(CollectWord.gameObject);
                    go.transform.SetParent(CollectLayout);
                    go.transform.localScale = Vector3.one;
                    Vector3 pos = go.transform.localPosition;
@@ -80,12 +84,15 @@
                    go = CollectLayout.GetChild(i).gameObject;
                }
                go.gameObject.SetActive(true);
                ItemCell item = go.GetComponent<ItemCell>();
                item.format = ItemCellformat.Format_80x80;
                RichText richText = go.GetComponentInChildren<RichText>();
                richText.text = Language.Get("GoToGet", itemID);
                ItemCell item = go.GetComponentInChildren<ItemCell>();
                var cnt = packModel.GetItemCountByID(PackType.Item, itemID);
                ItemCellModel cellModel = new ItemCellModel(itemID);
                item.Init(cellModel);
                item.countText.text = cnt + "/" + itemCnt;
                item.countText.gameObject.SetActive(true);
                if (cnt < itemCnt)
                {
                    isEnough = false;
@@ -110,6 +117,11 @@
            ExChangeBtn.gameObject.SetActive(exchangedCnt < maxNum);
            ExChangeBtn.SetColorful(null, isEnough);
            ExChangeBtn.interactable = isEnough;
            ExChangeBtn.AddListener(() =>
            {
                model.SendExchangeWord(exchangeNum);
            });
            var tagItemID = (int)operation.exchangeWords[index].ItemID;
            ItemCellModel tagCellModel = new ItemCellModel(tagItemID, false, (ulong)operation.exchangeWords[index].ItemCount);
            itemCell.Init(tagCellModel);
@@ -120,17 +132,38 @@
            });
            ExChangeCnt.text = Language.Get("CollectWordsLimit", exchangedCnt, maxNum);
            if (this.gameObject.activeInHierarchy)
            {
                StartCoroutine(UpdateLayout(CollectLayout as RectTransform));
                StartCoroutine(UpdateLayout(Layout.GetComponent<RectTransform>()));
            }
            updateFrame = 0;
        }
        IEnumerator UpdateLayout(RectTransform rect)
        //layout contentsizefilter 镶嵌使用的情况下会发生位置未正常刷新的情况
        //调用 ForceRebuildLayoutImmediate强制刷新,必须先刷父物体再刷子物体
        //强制刷新在逻辑最后或者帧结束此处无效,故在update处理的下一帧刷新
        //仅供参考,未分析具体原因和其他测试,只在此界面测试的情况
        private void Update()
        {
            yield return new WaitForEndOfFrame();
            LayoutRebuilder.ForceRebuildLayoutImmediate(rect);
            if (updateFrame < 0) return;
            if (updateFrame >= 0)
            {
                updateFrame++;
            }
            //在之后的帧刷新
            if (updateFrame != 1)
            {
                if (updateFrame > 2)
                {
                    updateFrame = -1;
                }
                return;
            }
            LayoutRebuilder.ForceRebuildLayoutImmediate(Layout.GetComponent<RectTransform>());
            for (int i = 0; i < Layout.transform.childCount; i++)
            {
                LayoutRebuilder.ForceRebuildLayoutImmediate(Layout.transform.GetChild(i).GetComponent<RectTransform>());
            }
        }
    }
System/OpenServerActivity/CollectWordsModel.cs
@@ -37,9 +37,12 @@
        public event Action ExChangeInfoUpdate;
        public event Action<int> onStateUpdate;
        //已兑换的记录
        //已兑换的记录 编号:已兑换次数
        public Dictionary<int, int> exchangeDict = new Dictionary<int, int>();
        public List<int> wordsID = new List<int>(); //活动的所有搜集物品ID
        public byte actNum; //对应界面
        PackModel packModel { get { return ModelCenter.Instance.GetModel<PackModel>(); } }
        public override void Init()
        {
@@ -47,11 +50,15 @@
            OperationTimeHepler.Instance.operationEndEvent += OperationEndEvent;
            OperationTimeHepler.Instance.dayResetEvent += DayResetEvent;
            OpenServerActivityCenter.Instance.Register(regesitType, this);
            OperationTimeHepler.Instance.operationTimeUpdateEvent += operationTimeUpdateEvent;
            packModel.refreshItemCountEvent += RefreshItemCountEvent;
        }
        public void OnBeforePlayerDataInitialize()
        {
            exchangeDict.Clear();
            wordsID.Clear();
        }
        public void OnPlayerLoginOk()
@@ -64,6 +71,9 @@
            OperationTimeHepler.Instance.operationStartEvent -= OperationStartEvent;
            OperationTimeHepler.Instance.operationEndEvent -= OperationEndEvent;
            OperationTimeHepler.Instance.dayResetEvent -= DayResetEvent;
            OperationTimeHepler.Instance.operationTimeUpdateEvent -= operationTimeUpdateEvent;
            packModel.refreshItemCountEvent -= RefreshItemCountEvent;
        }
        private void DayResetEvent(int resetType)
@@ -102,12 +112,46 @@
            }
        }
        private void operationTimeUpdateEvent(Operation obj)
        {
            if (obj != collectWordsType)
            {
                return;
            }
            wordsID.Clear();
            OperationCollectWords operation;
            if (OperationTimeHepler.Instance.TryGetOperation(collectWordsType, out operation))
            {
                for (int i = 0; i < operation.exchangeWords.Count; i++)
                {
                    var wordList = operation.exchangeWords[i];
                    for (int j = 0; j < wordList.NeedItemCount; j++)
                    {
                        int itemID = (int)wordList.NeedItemList[j].ItemID;
                        if (!wordsID.Contains(itemID))
                            wordsID.Add(itemID);
                    }
                }
            }
        }
        #region 服务端数据
        private void RefreshItemCountEvent(PackType packType, int index, int itemId)
        {
            if (!wordsID.Contains(itemId)) return;
            UpdateRedpoint();
            if (ExChangeInfoUpdate != null)
            {
                ExChangeInfoUpdate();
            }
        }
        public void UpdateExchangeInfo(HAA41_tagMCActCollectWordsPlayerInfo package)
        {
            OperationCollectWords operation;
            if (OperationTimeHepler.Instance.TryGetOperation(Operation.CollectWords, out operation))
            if (OperationTimeHepler.Instance.TryGetOperation(collectWordsType, out operation))
            {
                if (operation.ActNum != package.ActNum)
                {
@@ -127,12 +171,21 @@
            }
        }
        //文字兑换奖励
        public void SendExchangeWord(byte exchangeNum)
        {
            var sendInfo = new CAA09_tagCMActCollectWordsExchange();
            sendInfo.ActNum = actNum;
            sendInfo.ExchangeNum = exchangeNum;
            GameNetSystem.Instance.SendInfo(sendInfo);
        }
        #endregion
        #region 红点
        public Redpoint redpoint = new Redpoint(MainRedDot.REDPOINT_OPENSERVER, 20930);
        public bool isOpenWin = false;
        public int jumpIndex = 0;
        public void UpdateRedpoint()
        {
            redpoint.state = RedPointState.None;
@@ -140,10 +193,36 @@
            {
                return;
            }
            OperationBase operationBase;
            if (OperationTimeHepler.Instance.TryGetOperationTime(collectWordsType, out operationBase))
            jumpIndex = 0;
            OperationCollectWords operation;
            if (OperationTimeHepler.Instance.TryGetOperation(collectWordsType, out operation))
            {
                redpoint.state = isOpenWin ? RedPointState.None : RedPointState.Simple;
                for (int i = 0; i < operation.exchangeWords.Count; i++)
                {
                    var wordList = operation.exchangeWords[i];
                    if (exchangeDict[wordList.ExchangeNum] >= wordList.ExchangeCountMax)
                    {
                        continue;
                    }
                    var isEnough = true;
                    for (int j = 0; j < wordList.NeedItemCount; j++)
                    {
                        int itemID = (int)wordList.NeedItemList[j].ItemID;
                        var cnt = packModel.GetItemCountByID(PackType.Item, itemID);
                        if (cnt < wordList.NeedItemList[j].ItemCount)
                        {
                            isEnough = false;
                            break;
                        }
                    }
                    if (isEnough)
                    {
                        redpoint.state = RedPointState.Simple;
                        jumpIndex = i;
                        return;
                    }
                }
            }
        }
        #endregion
System/OpenServerActivity/CollectWordsWin.cs
@@ -40,6 +40,7 @@
        protected override void OnPreOpen()
        {
            model.ExChangeInfoUpdate += OnRefresh;
            Display();
        }
@@ -49,6 +50,7 @@
        protected override void OnPreClose()
        {
            model.ExChangeInfoUpdate -= OnRefresh;
        }
        protected override void OnAfterClose()
@@ -62,7 +64,10 @@
            DisplayCollect();
        }
        void OnRefresh()
        {
            collectScroll.m_Scorller.RefreshActiveCellViews();
        }
        void DisplayCollect()
        {
            OperationCollectWords operation;