lcy
2 天以前 8d803b39550addad50fc46255c1ab0af07634356
59 子 【常规】邮件系统 / 【常规】邮件系统-客户端
4个文件已删除
4个文件已修改
1 文件已复制
1个文件已添加
2 文件已重命名
518 ■■■■ 已修改文件
Main/System/Mail/MailCell.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Mail/MailCell.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Mail/MailInfoAwardCell.cs 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Mail/MailInfoAwardCell.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Mail/MailInfoAwardItemCell.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Mail/MailInfoAwardItemCell.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Mail/MailInfoWin.cs 106 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Mail/MailManager.cs 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Mail/MailPersonalCell.cs 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Mail/MailPersonalCell.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Mail/MailWin.cs 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Main/HomeWin.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Mail/MailCell.cs
File was renamed from Main/System/Mail/MailGlobalCell.cs
@@ -1,9 +1,11 @@
using UnityEngine;
using System;
using UnityEngine;
using UnityEngine.UI;
public class MailGlobalCell : CellView
public class MailCell : CellView
{
    [SerializeField] ButtonEx btnMail;
    [SerializeField] ImageEx imgState;
    [SerializeField] Button btnMail;
    [SerializeField] ImageEx imgMask;
    [SerializeField] ImageEx imgRed;
    [SerializeField] TextEx txtTitle;
    [SerializeField] TextEx txtDate;
@@ -18,18 +20,19 @@
        uuid = list[index];
        if (!model.TryGetMailData(uuid, out var mailData) || mailData == null)
            return;
        //mailData.MailState 邮件状态: 0-未知;1-未读;2-已读;3-已领;
        imgRed.SetActive(mailData.MailState == 1);
        txtTitle.text = mailData.Title;
        imgState.SetSprite(mailData.MailState == 2 || mailData.MailState == 3 ? "MailRead" : "MailNoRead");
        if (mailData.Items != null)
        imgMask.SetActive(mailData.MailState == 2 || mailData.MailState == 3);
        if (mailData.IsTemplateMail() && MailConfig.HasKey(mailData.GetTemplateKey()))
        {
            txtDate.text = model.FormatCreateMailTime(mailData.CreateDateTime);
            txtTitle.text = MailConfig.Get(mailData.GetTemplateKey()).Title;
        }
        else
        {
            int expiryDay = model.GetMailExpiryDays(mailData.CreateDateTime, mailData.LimitDays);
            txtDate.text = expiryDay > 0 ? Language.Get("Mail07", expiryDay) : model.FormatCreateMailTime(mailData.CreateDateTime);
            txtTitle.text = mailData.Title;
        }
        txtDate.text = model.FormatMailExpiryDays(mailData.CreateDateTime, mailData.LimitDays);
        btnMail.SetListener(OnClickButtonMail);
    }
Main/System/Mail/MailCell.cs.meta
copy from Main/System/Mail/MailGlobalCell.cs.meta copy to Main/System/Mail/MailCell.cs.meta
File was copied from Main/System/Mail/MailGlobalCell.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: baaef1e2dac4e30499722be1d4c60bb4
guid: 540496bd35ab2f44fa3c043f3b748969
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
Main/System/Mail/MailInfoAwardCell.cs
New file
@@ -0,0 +1,26 @@
using System;
using UnityEngine;
using UnityEngine.UI;
public class MailInfoAwardCell : CellView
{
    [SerializeField] ItemCell itemCell;
    [SerializeField] ImageEx imgHave;
    [SerializeField] ImageEx imgMask;
    MailManager model { get { return MailManager.Instance; } }
    public void Display(int index, CellView cellView)
    {
        string uuid = cellView.info.Value.infoStr1;
        if (!model.TryGetMailData(uuid, out MailData mailData) || mailData == null || mailData.Items == null)
            return;
        if (index < 0 || index >= mailData.Items.Count)
            return;
        int mailState = mailData.MailState;//0-未知;1-未读;2-已读;3-已领;
        MailItemData data = mailData.Items[index];
        itemCell.Init(new ItemCellModel((int)data.ItemID, true, data.Count));
        itemCell.button.SetListener(() => ItemTipUtility.Show((int)data.ItemID, true));
        float expiryDays = model.GetMailExpiryDays(mailData.CreateDateTime, mailData.LimitDays);
        imgHave.SetActive(mailState == 3);
        imgMask.SetActive(mailState == 3 || expiryDays <= 0);
    }
}
Main/System/Mail/MailInfoAwardCell.cs.meta
File was renamed from Main/System/Mail/MailGlobalCell.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: baaef1e2dac4e30499722be1d4c60bb4
guid: c60bb6aac93423e46b3dfa2c1c457d0d
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
Main/System/Mail/MailInfoAwardItemCell.cs
File was deleted
Main/System/Mail/MailInfoAwardItemCell.cs.meta
File was deleted
Main/System/Mail/MailInfoWin.cs
@@ -1,4 +1,5 @@
using UnityEngine;
using System;
using UnityEngine;
public class MailInfoWin : UIBase
{
    [SerializeField] TextEx txtDate;
@@ -7,7 +8,7 @@
    [SerializeField] RichText txtNoAwardInfo;
    [SerializeField] Transform transAward;
    [SerializeField] RichText txtAwardInfo;
    [SerializeField] ScrollerController scrAwardItem;
    [SerializeField] ScrollerController scrAward;
    [SerializeField] TextEx txtExpiryDate;
    [SerializeField] ButtonEx btnHave;
    [SerializeField] ButtonEx btnDelete;
@@ -24,23 +25,28 @@
    protected override void OnPreOpen()
    {
        scrAwardItem.OnRefreshCell += OnRefreshLowRewardCell;
        base.OnPreOpen();
        scrAward.OnRefreshCell += OnRefreshLowRewardCell;
        model.OnUpdateMailListEvent += OnUpdateMailListEvent;
        model.OnUpdateMailStateChangeEvent += OnUpdateMailStateChangeEvent;
    }
    protected override void OnOpen()
    {
        UpdateDataInfo();
        GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
        Display();
        CreateScrAward();
    }
    protected override void OnPreClose()
    {
        scrAwardItem.OnRefreshCell -= OnRefreshLowRewardCell;
        base.OnPreClose();
        scrAward.OnRefreshCell -= OnRefreshLowRewardCell;
        model.OnUpdateMailListEvent -= OnUpdateMailListEvent;
        model.OnUpdateMailStateChangeEvent -= OnUpdateMailStateChangeEvent;
        GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
    }
    private void OnSecondEvent()
    {
        txtDate.text = model.FormatCreateMailTime(nowMailData.CreateDateTime);
        txtExpiryDate.text = model.FormatMailExpiryDays(nowMailData.CreateDateTime, nowMailData.LimitDays);
        txtExpiryDate.color = model.GetMailExpiryDays(nowMailData.CreateDateTime, nowMailData.LimitDays) >= 0 ? UIHelper.GetUIColor(TextColType.DarkGreen) : UIHelper.GetUIColor(TextColType.Red);
    }
    private void OnClickHaveButton()
@@ -67,64 +73,65 @@
    private void OnUpdateMailStateChangeEvent()
    {
        UpdateDataInfo();
        Display();
        CreateScrAward();
    }
    private void OnUpdateMailListEvent()
    {
        UpdateDataInfo();
        Display();
        CreateScrAward();
    }
    private void OnRefreshLowRewardCell(ScrollerDataType type, CellView cell)
    {
        var _cell = cell.GetComponent<MailInfoAwardItemCell>();
        var _cell = cell.GetComponent<MailInfoAwardCell>();
        _cell?.Display(cell.index, cell);
    }
    private void CreateScrAward()
    {
        scrAwardItem.Refresh();
        if (isHasAward)
        {
            for (int i = 0; i < nowMailData.Items.Count; i++)
            {
                CellInfo cellInfo = new CellInfo();
                cellInfo.infoInt1 = nowMailData.MailState;
                scrAwardItem.AddCell(ScrollerDataType.Header, i);
            }
        }
        scrAwardItem.Restart();
    }
    private void Display()
    {
        if (nowMailData == null)
        if (!model.TryGetMailData(model.nowUuid, out nowMailData))
        {
            UIManager.Instance.CloseWindow<MailInfoWin>();
            return;
        }
        isHasAward = nowMailData != null && nowMailData.HasAward();
        transNoAward.SetActive(!isHasAward);
        transAward.SetActive(isHasAward);
        btnHave.SetActive(isHasAward && nowMailData.MailState != 3);
        txtDate.text = model.FormatCreateMailTime(nowMailData.CreateDateTime);
        if (nowMailData.IsTemplateMail())
        string key = nowMailData.GetTemplateKey();
        if (nowMailData.IsTemplateMail() && MailConfig.HasKey(key))
        {
            string key = nowMailData.GetTemplateKey();
            if (MailConfig.HasKey(key))
            MailConfig config = MailConfig.Get(key);
            var templateParams = nowMailData.GetTemplateParams();
            // 打印出即将用于格式化的所有信息
            //         Debug.Log($"[邮件调试] GUID: {nowMailData.GUID}");
            // Debug.Log($"[邮件调试] 原始参数JSON (nowMailData.Text): '{nowMailData.Text}'");
            // Debug.Log($"[邮件调试] 解析后的参数数量: {templateParams.Count}");
            // if (templateParams.Count > 0)
            // {
            //     for(int i = 0; i < templateParams.Count; i++)
            //     {
            //         Debug.Log($"[邮件调试] 参数[{i}]: {templateParams[i]}");
            //     }
            // }
            try
            {
                MailConfig config = MailConfig.Get(key);
                var templateParams = nowMailData.GetTemplateParams();
                string content = string.Format(config.Content, templateParams.ToArray());
                txtTitle.text = config.Title;
                txtNoAwardInfo.text = content;
                txtAwardInfo.text = content;
                txtTitle.text = config.Title;
            }
            else
            catch (System.Exception ex)
            {
                txtTitle.text = nowMailData.Title;
                txtNoAwardInfo.text = nowMailData.Text;
                txtAwardInfo.text = nowMailData.Text;
                Debug.LogError($"MailInfoWin 解析邮件参数失败! GUID: {nowMailData.GUID}, " +
                                 $"原始参数JSON: '{nowMailData.Text}', 错误: {ex.Message}");
            }
        }
        else
@@ -133,19 +140,20 @@
            txtNoAwardInfo.text = nowMailData.Text;
            txtAwardInfo.text = nowMailData.Text;
        }
        int expiryDays = model.GetMailExpiryDays(nowMailData.CreateDateTime, nowMailData.LimitDays);
        txtExpiryDate.text = expiryDays > 0 ? Language.Get("Mail07", expiryDays) : string.Empty;
    }
    private void UpdateDataInfo()
    {
        if (!model.TryGetMailData(model.nowUuid, out nowMailData))
        txtExpiryDate.text = model.FormatMailExpiryDays(nowMailData.CreateDateTime, nowMailData.LimitDays);
        txtExpiryDate.color = model.GetMailExpiryDays(nowMailData.CreateDateTime, nowMailData.LimitDays) >= 0 ? UIHelper.GetUIColor(TextColType.DarkGreen) : UIHelper.GetUIColor(TextColType.Red);
        scrAward.Refresh();
        if (isHasAward)
        {
            UIManager.Instance.CloseWindow<MailInfoWin>();
            for (int i = 0; i < nowMailData.Items.Count; i++)
            {
                CellInfo cellInfo = new CellInfo();
                cellInfo.infoStr1 = nowMailData.GUID;
                scrAward.AddCell(ScrollerDataType.Header, i, cellInfo);
            }
        }
        isHasAward = nowMailData != null && nowMailData.Items != null;
        scrAward.Restart();
    }
}
Main/System/Mail/MailManager.cs
@@ -2,6 +2,8 @@
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using LitJson;
public class MailManager : GameSystemManager<MailManager>
{
@@ -17,13 +19,15 @@
    public Redpoint tabRedpoint1;
    public event Action OnUpdateMailListEvent;// 更新邮件列表数据
    public event Action OnUpdateMailStateChangeEvent;// 更新邮件状态变更
    public readonly string dateFormat = "yyyy-MM-dd";
    public readonly string dateFormat = "yyyy.MM.dd";
    public string nowUuid = string.Empty;
    public int personalMailMaxLimitCount;
    public override void Init()
    {
        tabRedpoint0 = new Redpoint(MainRedDot.MailRepoint, GetTabRedpointId(MailCategory.Personal));
        tabRedpoint1 = new Redpoint(MainRedDot.MailRepoint, GetTabRedpointId(MailCategory.Global));
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitializeEvent;
        personalMailMaxLimitCount = int.Parse(FuncConfigConfig.Get("PersonalMail").Numerical1);
    }
    public override void Release()
@@ -103,11 +107,50 @@
        }
    }
    //返回有效期天数(正数=已过期天数,负数=剩余天数)
    public int GetMailExpiryDays(DateTime createDateTime, int limitDays)
    //返回有效期天数(正数=剩余天数,负数=已过期天数)
    public float GetMailExpiryDays(DateTime createDateTime, int limitDays)
    {
        DateTime expiryDate = createDateTime.AddDays(limitDays);
        return (int)(TimeUtility.ServerNow - expiryDate).TotalDays;
        TimeSpan remainingTime = expiryDate - TimeUtility.ServerNow;
        return (float)remainingTime.TotalDays;
    }
    public string FormatMailExpiryDays(DateTime createDateTime, int limitDays)
    {
        string result = string.Empty;
        float days = GetMailExpiryDays(createDateTime, limitDays);
        // 防护:处理因客户端与服务器时间戳的微小差异,导致剩余时间略大于有效期上限的情况。
        // 将计算出的剩余天数限制在邮件的有效期天数之内。
        if (days > limitDays)
        {
            days = limitDays;
        }
        if (days > 1.0f)
        {
            // 大于1天:按向上取整的天数显示。
            // MathF.Ceiling(1.01f) -> 2.0f
            int daysRounded = (int)MathF.Ceiling(days);
            result = Language.Get("Mail07", (int)MathF.Ceiling(days));
        }
        else if (days > 0.0f)
        {
            // 小于1天(但未过期):按精确的小时/分钟显示。
            TimeSpan t = TimeSpan.FromDays(days);
            result = Language.Get("Mail12",StringUtility.Contact( " ", Language.Get("Mail13", t.Hours, t.Minutes)));
        }
        else
        {
            // (预留)已过期:按负数向下取整(向更小的负数取整,以获得已过期天数的整数绝对值)
            // MathF.Floor(-1.01f) -> -2.0f
            // MathF.Floor(-0.5f)  -> -1.0f
            // float expiredDaysFloor = MathF.Floor(days);
            // int expiredDays = (int)expiredDaysFloor;
            //直接显示已过期
            result = Language.Get("Mail11"); ;
        }
        return result;
    }
@@ -123,6 +166,20 @@
        }
        return result;
    }
    public int GetMailCount(MailCategory mailCategory)
    {
        var result = new List<string>();
        foreach (var kvp in mailDataDict)
        {
            if (kvp.Value.Category == mailCategory)
            {
                result.Add(kvp.Key);
            }
        }
        return result.Count;
    }
    public List<string> GetSortMailScrList(MailCategory mailCategory)
    {
@@ -161,6 +218,16 @@
                IsBind = i.IsBind,
                UserData = i.UserData
            }).ToList();
            if (!mailData.Items.IsNullOrEmpty())
            {
                mailData.Items = mailData.Items
                    .Where(item => ItemConfig.HasKey((int)item.ItemID)) // 防护,确保物品存在
                    .OrderByDescending(item => ItemConfig.Get((int)item.ItemID).ItemColor) // 按品质降序
                    .ThenBy(item => item.Count) // 品质相同按数量升序
                    .ToList();
            }
            mailDataDict[mail.GUID] = mailData;
        }
@@ -239,7 +306,7 @@
        pack.ReqType = ReqType;
        GameNetSystem.Instance.SendInfo(pack);
    }
    //没有一个可领取的个人邮件
    public bool IsCanHaveMail()
    {
@@ -273,12 +340,17 @@
    public string GUID;        //邮件GUID
    public byte Type;        //邮件类型,暂时默认0
    public string CreateTime;        //创建时间
    public DateTime CreateDateTime;
    public DateTime CreateDateTime;//创建时间
    public byte LimitDays;        //有效天数
    public string Title;        //标题
    public string Text;        //内容
    public byte MailState;        //邮件状态: 0-未知;1-未读;2-已读;3-已领;
    public List<MailItemData> Items;        //物品信息
    public bool HasAward()
    {
        return Items != null && Items.Count > 0;
    }
    /// <summary>
    /// 判断是否为模板类型邮件
@@ -320,12 +392,15 @@
        try
        {
            // 参数格式为JSON数组:[参数1, 参数2, ...]
            return JsonUtility.FromJson<List<string>>(Text);
            List<string> result = JsonMapper.ToObject<List<string>>(Text);
            // 如果解析结果为null(例如Text的内容是 "null" 字符串),则返回一个空列表以防后续出错
            return result ?? new List<string>();
        }
        catch
        catch (Exception ex)
        {
            Debug.LogError($"使用 LitJson 解析邮件参数失败。 Text: {Text}, 错误: {ex.Message}");
            return new List<string>();
        }
    }
}
Main/System/Mail/MailPersonalCell.cs
File was deleted
Main/System/Mail/MailPersonalCell.cs.meta
File was deleted
Main/System/Mail/MailWin.cs
@@ -1,89 +1,87 @@
using System;
using UnityEngine;
public class MailWin : UIBase
public class MailWin : FunctionsBaseWin
{
    [SerializeField] Transform transPersonal;
    [SerializeField] Transform transGlobal;
    [SerializeField] ScrollerController scrPersonal;
    [SerializeField] ScrollerController scrGlobal;
    [SerializeField] ButtonEx btnDeleteRead;
    [SerializeField] ScrollerController scrMail;
    [SerializeField] ButtonEx btnDeleteAllRead;
    [SerializeField] ButtonEx btnClaimAll;
    [SerializeField] ToggleEx togTab0;
    [SerializeField] RedpointBehaviour rpTab0;
    [SerializeField] ToggleEx togTab1;
    [SerializeField] RedpointBehaviour rpTab1;
    [SerializeField] Transform transNoMail;
    [SerializeField] Transform transCurrentMailCount;
    [SerializeField] TextEx txtCurrentMailCount;
    MailManager model { get { return MailManager.Instance; } }
    protected override void InitComponent()
    {
        base.InitComponent();
        btnDeleteRead.SetListener(OnDeleteRead);
        btnDeleteAllRead.SetListener(OnDeleteRead);
        btnClaimAll.SetListener(OnClaimAll);
        togTab0.SetListener(OnTab0);
        togTab1.SetListener(OnTab1);
    }
    protected override void OnPreOpen()
    {
        model.OnUpdateMailListEvent += OnUpdateMailListEvent;
        model.OnUpdateMailStateChangeEvent += OnUpdateMailStateChangeEvent;
        scrPersonal.OnRefreshCell += OnRefreshPersonalCell;
        scrGlobal.OnRefreshCell += OnRefreshGlobalCell;
        base.OnPreOpen();
        tabButtons[functionOrder].SelectBtn(true);
        model.nowMailCategory = MailCategory.Personal;
        rpTab0.redpointId = model.GetTabRedpointId(MailCategory.Personal);
        rpTab1.redpointId = model.GetTabRedpointId(MailCategory.Global);
        transNoMail.SetActive(false);
        transNoMail.SetActive(true);
        btnDeleteAllRead.SetActive(true);
        btnClaimAll.SetActive(true);
        transCurrentMailCount.SetActive(true);
        model.OnUpdateMailListEvent += OnUpdateMailListEvent;
        model.OnUpdateMailStateChangeEvent += OnUpdateMailStateChangeEvent;
        scrMail.OnRefreshCell += OnRefreshCell;
        GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
        DisPlay();
    }
    protected override void OnPreClose()
    {
        base.OnPreClose();
        model.OnUpdateMailListEvent -= OnUpdateMailListEvent;
        model.OnUpdateMailStateChangeEvent -= OnUpdateMailStateChangeEvent;
        scrPersonal.OnRefreshCell -= OnRefreshPersonalCell;
        scrGlobal.OnRefreshCell -= OnRefreshGlobalCell;
        scrMail.OnRefreshCell -= OnRefreshCell;
        GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
    }
    private void OnTab0(bool value)
    private void OnSecondEvent()
    {
        if (value)
        scrMail.m_Scorller.RefreshActiveCellViews();
        int personalMailCount = MailManager.Instance.GetMailCount(MailCategory.Personal);
        txtCurrentMailCount.text = StringUtility.Contact(personalMailCount, "/", MailManager.Instance.personalMailMaxLimitCount);
    }
    protected override void OpenSubUIByTabIndex()
    {
        switch (functionOrder)
        {
            transPersonal.SetActive(true);
            transGlobal.SetActive(false);
            model.nowMailCategory = MailCategory.Personal;
            CreatePersonalScr(model.nowMailCategory);
            case 0:
                model.nowMailCategory = MailCategory.Personal;
                btnDeleteAllRead.SetActive(true);
                btnClaimAll.SetActive(true);
                transCurrentMailCount.SetActive(true);
                int personalMailCount = MailManager.Instance.GetMailCount(MailCategory.Personal);
                txtCurrentMailCount.text = StringUtility.Contact(personalMailCount, "/", MailManager.Instance.personalMailMaxLimitCount);
                DisPlay();
                break;
            case 1:
                model.nowMailCategory = MailCategory.Global;
                btnDeleteAllRead.SetActive(false);
                btnClaimAll.SetActive(false);
                transCurrentMailCount.SetActive(false);
                DisPlay();
                break;
            default:
                Debug.LogWarning("未知的标签索引: " + functionOrder);
                break;
        }
    }
    private void OnTab1(bool value)
    private void OnRefreshCell(ScrollerDataType type, CellView cell)
    {
        if (value)
        {
            transPersonal.SetActive(false);
            transGlobal.SetActive(true);
            model.nowMailCategory = MailCategory.Global;
            CreateGlobalScr(model.nowMailCategory);
        }
    }
    protected override void OnOpen()
    {
        togTab0.isOn = true;
        togTab1.isOn = false;
        model.nowMailCategory = MailCategory.Personal;
        CreatePersonalScr(model.nowMailCategory);
    }
    private void OnRefreshPersonalCell(ScrollerDataType type, CellView cell)
    {
        var _cell = cell.GetComponent<MailPersonalCell>();
        _cell?.Display(cell.index, cell);
    }
    private void OnRefreshGlobalCell(ScrollerDataType type, CellView cell)
    {
        var _cell = cell.GetComponent<MailGlobalCell>();
        var _cell = cell.GetComponent<MailCell>();
        _cell?.Display(cell.index, cell);
    }
@@ -113,50 +111,24 @@
        model.ClaimMail();
    }
    public void CreatePersonalScr(MailCategory mailCategory)
    {
        scrPersonal.Refresh();
        var list = model.GetSortMailScrList(mailCategory);
        if (list != null)
        {
            for (int i = 0; i < list.Count; i++)
            {
                CellInfo cellInfo = new CellInfo();
                cellInfo.infoInt1 = (int)mailCategory;
                scrPersonal.AddCell(ScrollerDataType.Header, i, cellInfo);
            }
        }
        scrPersonal.Restart();
    }
    public void CreateGlobalScr(MailCategory mailCategory)
    {
        scrGlobal.Refresh();
        var list = model.GetSortMailScrList(mailCategory);
        if (list != null)
        {
            for (int i = 0; i < list.Count; i++)
            {
                CellInfo cellInfo = new CellInfo();
                cellInfo.infoInt1 = (int)mailCategory;
                scrGlobal.AddCell(ScrollerDataType.Header, i, cellInfo);
            }
        }
        scrGlobal.Restart();
    }
    private void OnUpdateMailStateChangeEvent()
    {
        RefreshScr();
        DisPlay();
    }
    private void OnUpdateMailListEvent()
    {
        RefreshScr();
        DisPlay();
    }
    private void RefreshScr()
    {
        var list = model.GetSortMailScrList(model.nowMailCategory);
    private void DisPlay()
    {
        scrMail.Refresh();
        scrMail.Restart();
        MailCategory mailCategory = model.nowMailCategory;
        var list = model.GetSortMailScrList(mailCategory);
        if (list.IsNullOrEmpty())
        {
            transNoMail.SetActive(true);
@@ -164,9 +136,20 @@
        else
        {
            transNoMail.SetActive(false);
            scrPersonal.m_Scorller.RefreshActiveCellViews();
            scrGlobal.m_Scorller.RefreshActiveCellViews();
            scrMail.Refresh();
            for (int i = 0; i < list.Count; i++)
            {
                CellInfo cellInfo = new CellInfo();
                cellInfo.infoInt1 = (int)mailCategory;
                scrMail.AddCell(ScrollerDataType.Header, i, cellInfo);
            }
            scrMail.Restart();
        }
        int personalMailCount = MailManager.Instance.GetMailCount(MailCategory.Personal);
        txtCurrentMailCount.text = StringUtility.Contact(personalMailCount, "/", MailManager.Instance.personalMailMaxLimitCount);
    }
}
Main/System/Main/HomeWin.cs
@@ -49,6 +49,7 @@
    [SerializeField] UIEffectPlayer autoOpenEffect;
    [SerializeField] Button blessLVBtn;
    [SerializeField] Text blessLVText;
    [SerializeField] Button mailBtn;
    //其他功能入口
    [SerializeField] Button monthCardBtn;
@@ -87,6 +88,11 @@
            UIManager.Instance.OpenWindow<BlessLVWin>();
        });
        mailBtn.AddListener(() =>
        {
            UIManager.Instance.OpenWindow<MailWin>();
        });
        officialUpBtn.AddListener(() =>
        {
            if (RealmConfig.GetKeys().Count <= PlayerDatas.Instance.baseData.realmLevel)