笔记 【冒泡算法】升序降序排列玩家各项数据以及DOTween和LeanTween的使用介绍与缺点(附:泛型,模板方法,SWAP问题,十大常用Array方法,富文本等)
持续更新ing 【未完待续......】
B站Up BeaverJoe 视频传送门:【冒泡算法】升序降序排列玩家各项数据以及DOTween和LeanTween的使用介绍与缺点(附:泛型,模板方法,SWAP问题,十大常用Array方法,富文本等)
上期视频 【UI游戏界面】上下页切换,委托类型作为方法的参数和LAMBDA表达式的实际使用
对应笔记笔记【UI游戏界面】上下页切换,委托类型作为方法的参数和LAMBDA表达式的实际使用
如何通过比较热门的【插件】,不通过动画窗口,实现UI界面的动画交互呢?
怎样通过「冒泡算法」结合【委托作为参数】超进化到「泛型」,实现任意一组数据,进行【升序】或者降序的排列。
「Static关键字」在实际项目中,体现什么优势和劣势呢?
首先,先会延续上期的内容,将计算出的各个数据的最高玩家,所对应的称号,显示在右侧UI面板当中,并且通过「回调方法」显示各自的通用时间。
第二步:通过「冒泡算法」排列玩家击杀数的数据,再通过 委托作为参数,将这个方法拓展到 能够排列所有的数据。
第三步,实现数据的【倒置Reverse】,完成整个项目的基本功能实现。 最后呢,小Joe会介绍两个比较实用的插件,DoTween和LeanTween,对项目中的一些动画交互,进行补充。
既然我们已经可以通过模板方法,去计算出各个数据(击杀、阵亡、夺旗)的玩家的【最高玩家姓名】 (参看上期视频) 那么,我们先去完成那些获取最高数据的玩家,他们的称号,
显示在右侧的UI面板当中, 并且 我们希望:我们的方法会根据自己的逻辑,来调用某个方法。 如果我们这个玩家获取到了【任何称号】,那么再左侧UI面板中,我们会显示获得称号的通用时间,这其中,就包含着一种 回调关系。
某个方法,我可以调用它,也可以不调用它。 用得着的时候就调用,用不着就不调用,给我们一种动态的选择。
由于我们之后会记录我们的时间,在很多软件中呢,都会有一个Logger类型。这个Logger会把我们程序的运行状态记录下来。有时候呢,用户在使用程序的时候会发现一些问题,但是程序又没崩溃,这时候 我们就需要去通过Logger记录下来程序运行状态,来判断程序到底哪里出问题了。
我们先简单去创建一个方法来记录每个玩家获取称号的通用时间,我们创建一个Logger类,用来记录程序的运行状态,由于我们将会使用通用时间,所以我们要引入System名称空间。
我们就直接创建一个 静态方法,返回我们的时间。参数列表在录制之后发现,参数列表这里可以为空的,可以不传入任何类型的参数,我们整个Log方法,返回通用时间就可以了。也可以像屏幕中一样 传入一个PlayerStatus类型的参数,方便我们直接在Console窗口中,直接观察,“XX玩家在YY时间获得了ZZ称号”。我们把通用时间 赋值给DateTime类型的变量:currentTime,
如果想把数据存储到数据库,我们应该存储【不带时区】的时间:DateTime.UtcNow
[HideInInspector] 保持public但是在Inspector窗口隐藏。
如果想写成【年/月/日】格式,也可以调用ToShortDateString的方法。
如果想要显示 【07:34:45,AM/PM】, 可以调用ToShortTimeString方法。
这两个方法都可以通过 点操作符 也就是访问成员操作符,直接编译的时候,现学现用的,
我们希望 所有的玩家,如果有哪个玩家「击杀数」或者「其他数据」最高的话,才会显示当前的时间。
换句话说,并不是所有的玩家,都会显示时间。我们只会记录下,获取称号的玩家,他们的时间。所以怎么做呢,
我们刚才已经创建了UpdatePlayerTitle方法,这里呢,我们先创建两个形式参数类型。
......
有空格的话 会调不出 富文本的。
需要注意的是 GameManager和UIManager都是单例 (自己忘记写UIManger里awake方法中的单例内容了,卡了好久。)
GameManager.instance.playerStatus[i].title += title;
+=可以使同一个人获得一个以上的称号,让称号 加一起。
........
[对应视频时间21:50 ] 这里也遇到了 一个问题。我们现在只能通过这个冒泡方法,完成killNum有关的排序,deathNum/flagNum的排序,又该怎么完成呢?小joe说,我们在上一期,也遇到过相同的问题。(上期计算完「击杀数」最高玩家以后,怎么计算的「阵亡数」「夺旗数」) 也就是通过BubbleSort,当做一个模板方法, 将方法中唯一不确定的部分,用委托类型作为参数来替代。
判断我们要比较的是「击杀数」还是「阵亡数」还是我们的「夺旗数」 所以委托要指向一个【参数列表】为两个PlayerStatus类型 【返回值】为布尔类型的方法。
如果【_playerA的击杀数】大于【_playerB的击杀数】的话,直接return true
如果【先前的玩家击杀数】小于【之后的玩家击杀数】,那么我们AB玩家在数组中的位置,就要进行互换了。
我们的静态方法只需要去判断_playerA和_playerB的击杀数,给出一个判断结果,传入IF语句即可,在else语句中return false;
[视频时间 24:24] 因为我们要传入的是一个有【返回值】,两个参数的【参数列表】方法,所以使用的是Func委托,(有返回值用Func)
我们能使用这个模板方法去排列更多的数据(比如加下来的阵亡数和夺旗数),运行游戏,依旧是可以正常排列的。
Collections.Generic 泛型就是,泛化的数据类型。
“我要去玩游戏啦”这里的游戏是泛化的,“我要玩大镖客2啦” 大镖客2是特化的
在程序设计中,泛化和具体化或者说特化,是相对的。我们在创建类、接口、委托、方法、属性、字段的时候呢,都是可以设置为泛型的。当我们要具体使用这些泛型的时候呢,我们不能直接拿来使用,因为我们必须特化之后,才可以去使用。比如说之前的学习之中,我们其实已经接触了很多泛型类型了,
比如说我们这几期一直强调的Fun
有很多时候,我们为了防止类型膨胀、成员膨胀,都会去使用泛型,所以我们将BubbleSort方法 改为泛型方法。 加上一对尖括号来,尖括号里面的呢,叫做【类型参数】,也就是我们泛化的类型,一个标识符,记住我们尖括号里的呢,叫做类型参数,而不是我们方法圆括号里的,经常说的那个参数类型。 一般我们使用T来表示的,它呢,表示为Type,也可以使用其他的单词都是可以的。然后我们将所有具体化的【PlayerStatus类型】换成【类型参数T】。
!!!∑(゚Д゚ノ)ノ 寄寄,这边已经开始听不懂了。 首先首先,先把 呃呃呃,先把问题记下来,单例模式那个,妈的,什么东西啊,懵批。 ????怎么就排序了?而且还排序了,选中的行数是没有变化的。
List方法中有一个方法叫做Reverse() 可以实现所有元素倒置的功能、在Array类中有一个静态方法,也能完成这样的功能,它叫做Array.Reverse(T[]) 在[]中填入想要倒置的数组(集合)。
private void ReverseArray()
{
Array.Reverse(playerStatus);
}
也就是我们的PlayerStatus,也就变相完成了降序排序
(这个前提是 我们第一次按按钮一定是升序为前提,如果不是就老老实实扩展BubbleSort方法) (????为什么要升序为前提 OMG 哦哦哦,就是把原来的逆序了而已,如果原来的是从小到大,那么逆序后正好从大到小,但是如果本来是无序,逆序之后也是无序的。)
private bool isAscending01, isAscending02, isAscending03; // 用来表示当前是【升序】还是【降序】的状态
我们点击任何一个排序按钮,我们先要重置其余两个按钮的升序和降序的状态。这一步是为了保证我们所有的按钮,第一次点击的时候呢,一定是进行升序排序的,每次点击之后呢,都会在升序和降序之间呢,进行切换,在布尔烈性的变量之前呢,取反(A=!A) 如果isAscending=true 那么我们就进行【升序】操作,调用Bullesort。
//鼠标进入【上下页按钮】触发,按钮变大
public void ScaleIn(RectTransform _trans)
{
_trans.DOScale(new Vector3(2f, 2f, 2f), 0.2f).SetEase(Ease.InSine);
}
DOScale方法的第一个参数,表示的是【缩放】的程度,
new Vector3(2f, 2f, 2f) 第一个参数,表示放大原来的两倍。
DOScale方法的第二个参数,表示到达这个程度,从1倍放大到两倍,所需要的时间,这里写的是0.2秒。
我们这里可以使用链式的方法:Chain Function(也叫链函数),在之后呢,通过【点操作符】继续去操作,我们这一行,想让我们的效果,变成什么样子的方法。设置这个动画的运动曲线(动画曲线)。不同的运动曲线,在单位时间上产生的速度呢,也是各不相同的。
DotWeen的官方网站Documentation这个菜单当中,来找到对应的解释和例子。
DotWeen的官方网站Documentation链接
之后用到的效果是Document文件当中的【DOShakeScale方法】和【DOShakeRotation方法】,和渐变效果【DOFade方法】。
小Joe提示,使用插件要多多测试! 无论是使用【Dotween】还是【LeanTween】
在使用任何一个不是很熟悉的插件的时候呢,要多多进行一些测试。 不管是Dotween还是LeanTween,如果再动画达到他的效果之内的这段时间内进行【多次的点击】或者多次去触发,它们插件当中的这个动画的话,就会导致这个UI对象产生偏移,就像↓这样。
解决的方法呢,小Joe使用的是协程函数。
结合视频和例子,解释「委托」和「事件」的“爱恨情仇”,将【事件系统】运用在90%甚至95%的游戏中,结合【MavMesh自动导航系统】等Unity的功能开始新的篇章。快去支持小Joe,催更!