我们平时玩的竞技类的小游戏一般在游戏结束的时候都会有一个排行榜来看到自己的排名,之前随手写了一个傅女神测手速小游戏,最后也需要一个排行榜。但是我却发现,由于涉及到数据的持久化存储,想了一下没想通逻辑,不知道如何来写,所以就空在那了。但是我气不过,所以就稍微研究了一下下,本文就来介绍一下用PlayerPrefs实现排行榜的一个简单模板,排序方法用的是插入排序,当然,也可以改成冒泡排序、希尔排序,那就你们自己把算法替换一下吧。
首先,打开Unity,创建两个sence,第一个sence用来产生数据并存储传递,第二部分用来接收第一个scene的数据并显示排行榜。
简单设计如下图:
第一张
第二张
第二个scene里的pannel添加一个vertical layout group,用来自动排序。OK。
然后我们来写代码。
第一个场景不需要什么太多的代码,几行就够。主要是实现随机产生一个随机数字,显示出来,然后存储传到下一个场景。UGUI的button的场景跳转我就不多说了。
[C#] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
void
Start () {
RandomMText
= GameObject.Find( "Canvas" ).transform.Find( "RandomText" ).GetComponent<Text>();
RandomM
= Random.Range(5, 15);
RandomMText.text
= RandomM.ToString();
}
//
Update is called once per frame
void
Update () {
}
public
void
RandomC()
{
PlayerPrefs.SetInt( "indexM" ,
RandomM);
SceneManager.LoadScene( "Scene2" );
}
|
第二个场景的代码逻辑有点复杂,需要注意很多地方。我大体列举一下:
1、取上一场景的数据。
2、取排行榜中已有的数据。
3、a、排行榜不满时,把上一场景数据加入并排序。
b、排行榜已满,把上一场景数据与现有数据排序并删除多余数据。
4、把当前排行榜数据存储(数据需要持久化)。
5、把当前数据显示到场景UI中。
下面列一下代码:
[C#] 纯文本查看 复制代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
|
using
UnityEngine;
using
System.Collections;
using
UnityEngine.UI;
using
UnityEngine.SceneManagement;
public
class
paixu : MonoBehaviour {
public
GameObject L0;
public
GameObject[] newIndexs;
public
GameObject Panel;
public
Text indexText;
int
indexM; //用来把取的数赋值于此
int []
save = new
int [8];
int
Num;
string
saveIntStr;
//插入排序
//
Use this for initialization
void
Start () {
//获取上一场景存储的数据
indexM
= PlayerPrefs.GetInt( "indexM" );
indexText.text
= "点击次数:"
+ indexM.ToString();
//获取存储的排行榜中的数据
for
( int
i = 0; i < 8; i++)
{
string
saveIntStrS = saveIntStr + i.ToString();
save[/font][font=微软雅黑]
= PlayerPrefs.GetInt(saveIntStrS);
}
//添加新数据并排序(从小到大)
for
( int
i = 0; i < 8; i++)
{
if
(save[/font][/size][font=微软雅黑][size=3] == null
|| save[/size][/font][font=微软雅黑][size=3] == 0)
{
save[/size][/font][font=微软雅黑][size=3]
= indexM;
Num
= i;
for
( int
m = 0; m < Num + 1; ++m)
{
int
t = save[m];
int
n = m;
while
((n > 0) && (save[n - 1] > t))
{
save[n]
= save[n - 1];
--n;
}
save[n]
= t;
}
break ;
}
else
{
int
n = 7;
if
(indexM < save[7])
{
while
(save[n - 1] > indexM)
{
save[n]
= save[n - 1];
--n;
save[n]
= indexM;
if
(n == 0)
{
break ;
}
}
break ;
}
}
}
//把当前数据存储
for
( int
j = 0; j < 8; j++)
{
string
saveIntStrI = saveIntStr + j.ToString();
PlayerPrefs.SetInt(saveIntStrI,
save[j]);
//PlayerPrefs.SetInt(saveIntStrI,
0);
}
//将数据显示到场景UI中
for
( int
i = 0; i < newIndexs.Length; i++)
{
string
saveIntStrO = saveIntStr + i.ToString();
newIndexs[/size][/font][font=微软雅黑][size=3]
= Instantiate(L0, transform.position, transform.rotation) as
GameObject;
newIndexs[/size][/font][font=微软雅黑][size=3].transform.SetParent(Panel.transform);
newIndexs[/size][/font][font=微软雅黑][size=3].GetComponent<Text>().text
= PlayerPrefs.GetInt(saveIntStrO).ToString();
}
}
//
Update is called once per frame
void
Update () {
}
public
void
reStart(){
SceneManager.LoadScene( "Scene1" );
}
}
|
代码看起来简单,但是十分考察基础与逻辑。需要一步步理清思路,不然很容易混淆。
如果想换一种排序方法只需要在第3步那里更改就行。
之后会把JSON的排行榜分享给大家。
相信这个简单的排行榜能够应付很多的小demo,易扩展,简单实用。如果有问题和建议,欢迎回复。