hch
2025-07-03 336a7828ba80bfd74fc8d5629badbaac115b5011
69 【常规】排行榜
3个文件已修改
2个文件已删除
1 文件已复制
3个文件已添加
2 文件已重命名
424 ■■■■ 已修改文件
Main/Component/UI/Effect/EffectPlayer.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/BillboardRank/PlayerRankCell.cs 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/BillboardRank/PlayerRankCell.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/BillboardRank/PlayerRankWin.cs 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/BillboardRank/PlayerRankWin.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/BillboardRank/PlayerTop3Cell.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/BillboardRank/PlayerTop3Cell.cs.meta 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/BillboardRank/RankModel.cs 113 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/BillboardRank/Top3Cell.cs 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Boss/MainBossEnterWin.cs 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Boss/MainBossRankWin.cs 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Component/UI/Effect/EffectPlayer.cs
@@ -10,9 +10,9 @@
    public float destroyDelay = 0f;
    public Canvas canvas = null;
    [HideInInspector] public Canvas canvas = null;
    public GameObject effectTarget = null;
    [HideInInspector] public GameObject effectTarget = null;
    protected void Start()
    {
@@ -47,7 +47,7 @@
        
        // 实例化特效
        effectTarget = Instantiate(effectPrefab, transform);
        effectTarget.name = $"Effect_{effectCfg.packageName}";
        effectTarget.name = $"Effect_{effectCfg.fxName}";
        
        if (null == canvas)
            canvas = GetComponentInParent<Canvas>();
Main/System/BillboardRank/PlayerRankCell.cs
New file
@@ -0,0 +1,75 @@
//--------------------------------------------------------
//    [Author]:           玩个游戏
//    [  Date ]:           Wednesday, September 26, 2018
//--------------------------------------------------------
using UnityEngine;
using UnityEngine.UI;
//玩家通用排名
public class PlayerRankCell : MonoBehaviour
{
    [SerializeField] AvatarCell avatarCell;
    [SerializeField] Text rankText;
    [SerializeField] Text rankValueText;    //排名比较内容
    [SerializeField] Text nameText;
    [SerializeField] OfficialTitleCell officialTitleCell;
    [SerializeField] Button queryPlayerBtn; //后续添加点击查看玩家详情
    // rank 为0 代表玩家自己
    public void Display(int rankType, int rank, string valueFormat)
    {
        RankData rankData = null;
        if (rank != 0)
        {
            rankData = RankModel.Instance.GetRankDataByRank(rankType, rank);
        }
        else
        {
            rankData = RankModel.Instance.GetMyRank(rankType);
            if (rankData == null)
            {
                //取玩家自己的数据
                avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                                PlayerDatas.Instance.baseData.face,
                                                PlayerDatas.Instance.baseData.facePic));
                rankText.text = Language.Get("L1045");
                rankValueText.text = valueFormat;
                nameText.text = PlayerDatas.Instance.baseData.PlayerName;
                officialTitleCell.InitUI(PlayerDatas.Instance.baseData.realmLevel, PlayerDatas.Instance.baseData.TitleID);
                return;
            }
            rank = rankData.rank;
        }
        if (rankData == null)
        {
            officialTitleCell.SetActive(false);
            avatarCell.SetActive(false);
            nameText.text = Language.Get("L1124");
            rankValueText.text = "0";//Language.Get("L1125");
        }
        else
        {
            officialTitleCell.SetActive(true);
            officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2);
            avatarCell.SetActive(true);
            avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4));
            nameText.text = rankData.name1;
            rankValueText.text = string.Format(valueFormat, rankData.cmpValue, rankData.cmpValue2, rankData.cmpValue3);
        }
        rankText.text = rank.ToString();
        if (queryPlayerBtn != null)
        {
            queryPlayerBtn.AddListener(() =>
            {
            });
        }
    }
}
Main/System/BillboardRank/PlayerRankCell.cs.meta
File was renamed from Main/System/Boss/MainBossRankWin.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 7e7e900f52142524a9ffc5db6c48c478
guid: 82782c30954476f409ed7ba5a4b12285
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
Main/System/BillboardRank/PlayerRankWin.cs
New file
@@ -0,0 +1,111 @@
//--------------------------------------------------------
//    [Author]:           玩个游戏
//    [  Date ]:           Tuesday, July 24, 2018
//--------------------------------------------------------
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
//通用玩家个人排行榜
public class PlayerRankWin : UIBase
{
    [SerializeField] List<PlayerTop3Cell> playerTop3Cells;
    [SerializeField] ScrollerController scrollerController;
    [SerializeField] Text cmpStrText;   //排行榜排名内容,如战力,通过层数等
    [SerializeField] PlayerRankCell myRankCell;
    [SerializeField] Button btnClose;
    [HideInInspector] public int rankType;
    [HideInInspector] public string valueFormat = "{0}";
    [HideInInspector] public int groupValue1 = 0;   //一般用于跨服
    [HideInInspector] public int groupValue2 = 0;   //一般用于跨服
    protected override void InitComponent()
    {
        btnClose.AddListener(()=>
        {
            CloseWindow();
        });
    }
    protected override void NextFrameAfterOpen()
    {
        RankModel.Instance.onRankRefresh += OnRankRefresh;
        RankModel.Instance.onMyRankRefresh += OnMyRankRefresh;
        scrollerController.OnRefreshCell += OnRefreshCell;
        Refresh();
    }
    protected override void OnPreClose()
    {
        RankModel.Instance.onRankRefresh -= OnRankRefresh;
        RankModel.Instance.onMyRankRefresh -= OnMyRankRefresh;
        scrollerController.OnRefreshCell -= OnRefreshCell;
    }
    protected override void OnClose()
    {
        base.OnClose();
    }
    public override void Refresh()
    {
        cmpStrText.text = Language.Get("RankTypeName_" + rankType);
        ShowTop3();
        CreateScroller();
        ShowMyRank();
    }
    void CreateScroller()
    {
        scrollerController.Refresh();
        var cnt = RankModel.Instance.GetRankShowMaxCnt(rankType);
        for (int i = 3; i < cnt; i++)
        {
            scrollerController.AddCell(ScrollerDataType.Header, i);
        }
    }
    void OnRefreshCell(ScrollerDataType type, CellView cell)
    {
        var _cell = cell.GetComponent<PlayerRankCell>();
        _cell.Display(rankType, cell.index + 1, valueFormat);
        RankModel.Instance.ListenRankPage(rankType, cell.index, groupValue1, groupValue2);
    }
    void ShowTop3()
    {
        for (int i = 0; i < playerTop3Cells.Count; i++)
        {
            playerTop3Cells[i].Display(functionOrder, i + 1);
        }
    }
    void ShowMyRank()
    {
        myRankCell.Display(rankType, 0, valueFormat);
    }
    void OnRankRefresh(int type)
    {
        ShowTop3();
        scrollerController.m_Scorller.RefreshActiveCellViews();
    }
    void OnMyRankRefresh(int type)
    {
        ShowMyRank();
    }
}
Main/System/BillboardRank/PlayerRankWin.cs.meta
copy from Main/System/Boss/MainBossRankWin.cs.meta copy to Main/System/BillboardRank/PlayerRankWin.cs.meta
File was copied from Main/System/Boss/MainBossRankWin.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 7e7e900f52142524a9ffc5db6c48c478
guid: 9c456f61d9549794896a813f4f3d4247
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
Main/System/BillboardRank/PlayerTop3Cell.cs
New file
@@ -0,0 +1,38 @@
//--------------------------------------------------------
//    [Author]:           玩个游戏
//    [  Date ]:           Wednesday, September 26, 2018
//--------------------------------------------------------
using UnityEngine;
using UnityEngine.UI;
//玩家通用的前3排名
public class PlayerTop3Cell : MonoBehaviour
{
    //[SerializeField] Model 显示NPC 武将模型
    [SerializeField] Text rankValueText;    //排名比较内容
    [SerializeField] Text nameText;
    [SerializeField] OfficialTitleCell officialTitleCell;
    [SerializeField] Button queryPlayerBtn; //后续添加点击查看玩家详情
    public void Display(int rankType, int rank, string valueFormat = "{0}")
    {
        var rankData = RankModel.Instance.GetRankDataByRank(rankType, rank);
        if (rankData == null)
        {
            rankValueText.text = "0";//Language.Get("L1125");
            nameText.text = Language.Get("L1124");
            officialTitleCell.SetActive(false);
            return;
        }
        officialTitleCell.SetActive(true);
        rankValueText.text = string.Format(valueFormat, rankData.cmpValue, rankData.cmpValue2, rankData.cmpValue3);
        nameText.text = rankData.name1;
        officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2);
    }
}
Main/System/BillboardRank/PlayerTop3Cell.cs.meta
Main/System/BillboardRank/RankModel.cs
@@ -1,5 +1,4 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
@@ -8,10 +7,33 @@
{
    public event Action<int> onRankRefresh;
    public event Action<int> onMyRankRefresh;
    //排行榜滚动显示的最大数量 类型
    Dictionary<int, int> ranksShowMaxCnt = new Dictionary<int, int>();
    //分页查询
    Dictionary<int, int> queryRankCD = new Dictionary<int, int>(); //首次查询CD,不影响后续的分页查询
    //分页查询 排名索引按字段存储 1代表第一名
    Dictionary<int, Dictionary<int, RankData>> m_RankPageDatas = new Dictionary<int, Dictionary<int, RankData>>();
    //类型:ID -排名索引,通过ID进行排重删除 不同名次 同ID的数据
    Dictionary<int, Dictionary<int, int>> m_RankIDToIndex = new Dictionary<int, Dictionary<int, int>>();
    Action completeEvent = null;    //查询完成事件
    //监听排行榜显示名次,用于分页查询,第一页查询由外部触发
    //使用场景 如界面排行榜滚动的时候每次查询30个排名名额,在显示大于m*30 +20名时,监听下一页,查询m+1页
    int pageCnt = 20; //每页查询条数
    int queryPointNum = 12;  //查询点
    int queryPageCD = 60; //内部查询点CD 避免不断上下滑动的时候过于频繁查询,外部使用重新打开的时候可以重置CD
    Dictionary<int, float> queryPageTimes = new Dictionary<int, float>(); //查询页CD
    Dictionary<int, int> ranksServerMaxCnt = new Dictionary<int, int>();    //服务器排行榜当前总数量(动态变化),分页查询的时候过滤用
    public override void Init()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
        ParseConfig();
    }
    public void OnBeforePlayerDataInitialize()
@@ -19,6 +41,21 @@
        m_RankPageDatas.Clear();
        m_RankIDToIndex.Clear();
        queryRankCD.Clear();
    }
    void ParseConfig()
    {
        var config = FuncConfigConfig.Get("BillboardSet");
        ranksShowMaxCnt = ConfigParse.ParseIntDict(config.Numerical3);
    }
    public int GetRankShowMaxCnt(int type)
    {
        if (ranksShowMaxCnt.ContainsKey(type))
        {
            return ranksShowMaxCnt[type];
        }
        return 100;
    }
    public override void Release()
@@ -53,11 +90,6 @@
    #region 分页查询
    Dictionary<int, int> queryRankCD = new Dictionary<int, int>(); //首次查询CD,不影响后续的分页查询
    //分页查询 排名索引按字段存储 1代表第一名
    Dictionary<int, Dictionary<int, RankData>> m_RankPageDatas = new Dictionary<int, Dictionary<int, RankData>>();
    //类型:ID -排名索引,通过ID进行排重删除 不同名次 同ID的数据
    Dictionary<int, Dictionary<int, int>> m_RankIDToIndex = new Dictionary<int, Dictionary<int, int>>();
    //!!!本服分页查询使用说明
@@ -66,12 +98,15 @@
    //
    //  startIndex 和 count 配对,与watchID无关联
    //  watchID;    //查看指定ID名次前后,查询范围服务端已固定,如果只要查指定目标,count可以设置1减少附加信息
    public void QueryRankByPage(int type, int startIndex = 0, int count = 20, int watchID = 0, bool forceQuery = false, int groupValue1 = 0, int groupValue2 = 0)
    public void QueryRankByPage(int type, int startIndex = 0, int count = 20, int watchID = 0, bool forceQuery = false, int groupValue1 = 0, int groupValue2 = 0, Action complete = null)
    {
        completeEvent = complete;
        if (queryRankCD.ContainsKey(type) && !forceQuery)
        {
            if (Time.time - queryRankCD[type] < 2f)
            {
                completeEvent?.Invoke();
                completeEvent = null;
                return;
            }
        }
@@ -88,12 +123,7 @@
        queryRankCD[type] = (int)Time.time;
    }
    //监听排行榜显示名次,用于分页查询,第一页查询由外部触发
    //使用场景 如界面排行榜滚动的时候每次查询30个排名名额,在显示大于m*30 +20名时,监听下一页,查询m+1页
    int pageCnt = 20; //每页查询条数
    int queryPointNum = 12;  //查询点
    int queryPageCD = 60; //内部查询点CD 避免不断上下滑动的时候过于频繁查询,外部使用重新打开的时候可以重置CD
    Dictionary<int, float> queryPageTimes = new Dictionary<int, float>(); //查询页CD
    public void ListenRankPage(int type, int index, int groupValue1 = 0, int groupValue2 = 0)
    {
        int page = index / pageCnt;
@@ -101,6 +131,14 @@
        {
            if (queryPageTimes.ContainsKey(page) && Time.realtimeSinceStartup - queryPageTimes[page] < queryPageCD)
                return;
            if (ranksServerMaxCnt.ContainsKey(type))
            {
                if(index >= ranksServerMaxCnt[type])
                {
                    //超过服务器已上榜的总数量,比如总榜单是100名,当前只有8名玩家上榜,往下滚动就不再查询
                    return;
                }
            }
            Debug.LogFormat("分页查询:{0} - {1}", index, page);
            QueryRankByPage(type, pageCnt * (page + 1), pageCnt, 0, true, groupValue1, groupValue2);
            queryPageTimes[page] = Time.realtimeSinceStartup;
@@ -171,6 +209,12 @@
            m_RankIDToIndex.Add(rankType, new Dictionary<int, int>());
        }
        if (!ranksServerMaxCnt.ContainsKey(rankType))
        {
            ranksServerMaxCnt.Add(rankType, package.DataTotal);
        }
        ranksServerMaxCnt[rankType] = package.DataTotal;
        for (int i = 0; i < package.PageDataCnt; i++)
        {
            int id = (int)package.PageDataList[i].ID;
@@ -232,9 +276,12 @@
        {
            onRankRefresh?.Invoke(package.Type);
        }
        completeEvent?.Invoke();
        completeEvent = null;
    }
    //排名从0 开始
    //排名从1 开始
    //如果是跨服排行榜 类型可能因跨服功能不同 由分组分赛季等情况组合
    public Dictionary<int, RankData> GetRankPageDatas(int type)
    {
@@ -244,6 +291,18 @@
            return datas;
        }
        return null;
    }
    //查询指定目标排名的数据
    public RankData GetRankDataByRank(int type, int rank)
    {
        Dictionary<int, RankData> rankDatas = null;
        RankData rankData = null;
        if (m_RankPageDatas.TryGetValue(type, out rankDatas))
        {
            rankDatas.TryGetValue(rank, out rankData);
        }
        return rankData;
    }
@@ -265,7 +324,7 @@
        return null;
    }
    public RankData GetMyRankByID(int type, int queryID)
    public RankData GetRankByID(int type, int queryID)
    {
        Dictionary<int, RankData> rankDatas = null;
        if (m_RankPageDatas.TryGetValue(type, out rankDatas))
@@ -283,6 +342,30 @@
    #endregion
}
// 默认情况,各个榜可能有所变化
// 玩家个人榜
// ID            -             玩家ID
// Name1    -             玩家名
// Name2    -             游戏账号
// Type2      -             职业
// Value1     -             官职
// Value2     -             称号ID
// Value3     -             头像
// Value4     -             头像框
// Value5     -             主角形象
// ---------------------------------------
// 仙盟榜
// ID            -             仙盟ID
// ID2          -             盟主ID
// Name1    -             仙盟名
// Name2    -             盟主名
// Value1     -             总战力,整除亿部分
// Value2     -             总战力,求余亿部分
// Value3     -             徽章
// Value4     -             仙盟等级
// Value5     -             仙盟ServerID
public class RankData
{
    public int type;    //排行榜类型
Main/System/BillboardRank/Top3Cell.cs
File was deleted
Main/System/Boss/MainBossEnterWin.cs
@@ -21,9 +21,14 @@
    {
        CloseBtn.AddListener(CloseWindow);
        rankBtn.AddListener(()=>
        {
            RankModel.Instance.QueryRankByPage(1);
            UIManager.Instance.OpenWindow<MainBossRankWin>();
        {
            RankModel.Instance.ResetQueryParam();
            RankModel.Instance.QueryRankByPage(1, watchID:(int)PlayerDatas.Instance.baseData.PlayerID, complete:()=>
            {
                var win = UIManager.Instance.OpenWindow<PlayerRankWin>();
                win.rankType = 1;
            });
        });
    }
Main/System/Boss/MainBossRankWin.cs
File was deleted