首页 > 其他分享 >【Unity】绘制表格:排行榜

【Unity】绘制表格:排行榜

时间:2024-10-08 09:01:00浏览次数:8  
标签:name 表格 entryTransform 排行榜 Unity score HighscoreEntry highscoreEntryList Find

绘制一款表格,表格特征为头行颜色不同、间隔行不同背景色、滚动视图;表格内容是分数排行榜,前三名有奖牌图标前缀。

成果展示

Scene部分

标题和背景
滚动视图:表头、表格行模板

效果图

脚本部分

脚本绑定在滚动组件的Viewport物体上。

public class HighscoreTable : MonoBehaviour
{

    private Transform entryContainer;
    private Transform entryTemplate;

    private List<HighscoreEntry> highscoreEntryList;
    private List<Transform> highscoreEntryTransformList;
    private void Awake()
    {
        entryContainer = transform.Find("highscoreEntryContainer");
        entryTemplate = entryContainer.Find("highscoreEntryTemplate");
        
		//模板行隐藏
        entryTemplate.gameObject.SetActive(false);

        highscoreEntryTransformList = new List<Transform>();

        //数据
        highscoreEntryList = new List<HighscoreEntry>() {
        new HighscoreEntry{ score = 43421,name="nckla"},
        new HighscoreEntry{ score = 5634,name="dsc"},
        new HighscoreEntry{ score = 765,name="cxaccs"},
        new HighscoreEntry{ score = 3412,name="asasxa"},
        new HighscoreEntry{ score = 5321,name="cdwqdas"},
        new HighscoreEntry{ score = 76544,name="gtrgf"},
        new HighscoreEntry{ score = 863423,name="bbfbtg"},
        new HighscoreEntry{ score = 323123,name="bgbnhn"},
        new HighscoreEntry{ score = 643,name="tetrwe"},
        };
        Highscores highscores = new Highscores { highscoreEntryList = highscoreEntryList };
        
        //数据排序
        for (int i = 0; i < highscores.highscoreEntryList.Count; i++)
        {
            for (int j = i + 1; j < highscores.highscoreEntryList.Count; j++)
            {
                if (highscores.highscoreEntryList[j].score > highscores.highscoreEntryList[i].score)
                {
                    HighscoreEntry tmp = highscores.highscoreEntryList[i];
                    highscores.highscoreEntryList[i] = highscores.highscoreEntryList[j];
                    highscores.highscoreEntryList[j] = tmp;
                }
            }
        }

        //数据显示到UI
        foreach (var item in highscores.highscoreEntryList)
        {
            CreateHighscoreEntryTransform(item, entryContainer, highscoreEntryTransformList);
        }
    }

    [System.Serializable]
    private class HighscoreEntry
    {
        public int score;
        public string name;
    }

    private class Highscores
    {
        public List<HighscoreEntry> highscoreEntryList;
    }

    private void CreateHighscoreEntryTransform(HighscoreEntry highscoreEntry, Transform container, List<Transform> transformList)
    {
        //实例化新的行
        Transform entryTransform = Instantiate(entryTemplate, container);
        entryTransform.gameObject.SetActive(true);

        //计算排名并显示:前三名特别
        int rank = transformList.Count + 1;
        string rankString;
        switch (rank)
        {
            default: rankString = rank + "TH"; break;
            case 1: rankString = "1ST"; break;
            case 2: rankString = "2ND"; break;
            case 3: rankString = "3RD"; break;
        }
        entryTransform.Find("posText").GetComponent<TextMeshProUGUI>().SetText(rankString);

        //显示分数和姓名
        int score = highscoreEntry.score;
        entryTransform.Find("scoreText").GetComponent<TextMeshProUGUI>().SetText(score.ToString());

        string name = highscoreEntry.name;
        entryTransform.Find("nameText").GetComponent<TextMeshProUGUI>().SetText(name);

        //间隔行不同背景色
        entryTransform.Find("background").gameObject.SetActive(rank%2==1);

        //第一名文本内容颜色不同
        if (rank == 1) {
            entryTransform.Find("nameText").GetComponent<TextMeshProUGUI>().color = Color.green;
            entryTransform.Find("posText").GetComponent<TextMeshProUGUI>().color = Color.green;
            entryTransform.Find("scoreText").GetComponent<TextMeshProUGUI>().color = Color.green;
        }

        //前三名前缀不同颜色的奖牌
        switch (rank)
        {
            default:
                entryTransform.Find("troph").gameObject.SetActive(false);
                break;
            case 1: entryTransform.Find("troph").GetComponent<Image>().color = UtilsClass.GetColorFromString("FFD200"); break;
            case 2: entryTransform.Find("troph").GetComponent<Image>().color = UtilsClass.GetColorFromString("C6C6C6"); break;
            case 3: entryTransform.Find("troph").GetComponent<Image>().color = UtilsClass.GetColorFromString("876F56"); break;
        }

        //所有行整理到表格
        transformList.Add(entryTransform);
    }
} 

排行榜内容可以使用PlayerPrefs实现数据持久化

标签:name,表格,entryTransform,排行榜,Unity,score,HighscoreEntry,highscoreEntryList,Find
From: https://www.cnblogs.com/sitarblogs/p/18450964

相关文章

  • Unity 二维数组序列化
    unity中,二维以上的数量是不支持序列化的,如:usingSystem.Collections.Generic;usingUnityEngine;publicclassTestArray:MonoBehaviour{//不支持序列化(在Inspector面板无法显示)publicRect[][]rect2Ds;//不支持序列化(在Inspector面板无法显示)//pub......
  • pbootcms基本调用标签大全已经整理成表格
    PbootCMS基本调用标签大全类型标签参数及说明示例效果内容详情页{content:id}输出当前内容的编号123 {content:scode}输出当前内容所属栏目的编码news {content:subscode}输出当前内容所属副栏目的编码subnews {content:sortname}输出当前内容......
  • WPS股票价格查询EXCEL表格
    第一步在表格内使用公式=GetStockSource(Stock_code)查询股票的即时交易信息,Stock_code表示股票代码;第二步通过公式从Source中提取所需要的数据,可以提取股票名称、价格、涨跌幅、收盘价格、成交额、成交量、换手率等。公式如下:GetStockSource(Stock_code),查询股票即时交易信息G......
  • 【春秋招必看】Unity相关笔试面试题(内有完整答案)第12期
    欢迎来到光光的奇妙冒险,我是你们的煎饼光子老师。今天是我们的第12期试题总结。C#部分:(前四题为字节跳动面试问题)1、List是链表还是数组答案:数组2、上一题追问:当list满了的时候,我再加入一个元素它的效率会比较低啊,它内部大概是一个什么样的执行过程呢?答案:数组搬家,会......
  • unity性能优化(有关图集)
    1.什么是图集?首先,你必须把你的美术资源TextureType改为Sprite(精灵类型),因为SpriteAltas只支持Sprite这种TextureType格式。官方:2D项目使用精灵和其他图形来创建其场景的视觉效果。这意味着单个项目可能包含许多纹理文件。Unity通常会为场景中的每个纹理发出一个绘制调用;但是,......
  • NUS:LLM表格推理增强框架TART
    ......
  • Unity实战案例全解析:RTS游戏的框选和阵型功能(5)阵型功能 优化一
    前篇:Unity实战案例全解析:RTS游戏的框选和阵型功能(4)阵型功能-CSDN博客本案例来源于unity唐老狮,有兴趣的小伙伴可以去泰克在线观看该课程我只是对重要功能进行分析和做出笔记分享,并未无师自通,吃水不忘打井人本案例的实现流程图 兵种排序  首先在一个阵型中,我们希望远......
  • 表格控件QTableWidget
    下面说一下表格的常用方法行列数目、行表头、列表头行表头:就是表格控件的第一行,用于设置每一列的标题列表头:就是表格控件的第一列,用于设置每一行的标题,通常缺省则默认显示行号设置和获取行列的数目在添加n行或者n列数据之前,需要先把行设置为n或者列设置为n,开辟好空间,才能......
  • ​Excel只能打印一部分表格的原因、解决方法
    怎么办?Excel文件打开之后,正常编辑完了,但是打印文件的时候只打印出表格文件的一部分数据,这是什么原因呢?怎么解决呢?原因一:如果你在打印界面,预览打印内容的时候发现,内容是空的或者只有一个单元格,但是工作表中的表格数据并没有消失,就是没办法打印出整个表格。这是因为在打印设......
  • unity编辑器绘制扇形
    使用UnityEditor.Handles.DrawSolidArc usingUnityEngine;usingUnityEditor;publicclassDrawSectorHandles:MonoBehaviour{publicfloatradius=5f;//扇形半径publicfloatangle=90f;//扇形角度publicColorarcColor=Color.red;/......