経緯
Unityでランキングを表示する機能を実装する際、今までランキングのリストの要素全てを一度に表示するようにしていました。ぶっちゃけそんなにユーザーもいないからそのままでも良かったのですが、すぐ実装できる気がしたのでやってみました。
実装した機能
ランキング全体の中から一部の範囲に絞って表示する。
1ページ目は1位〜30位まで表示して、次のページボタンを押すと31位〜60位まで表示される的な奴。
流れ
- ランキングの元になるリストを取得(サーバーなどから)
- 取得したリストを並べ替える(レートの高い順など)
- 何番目から何番目まで表示するかのインデックスリストを作る(例:そのリストが[0,30,60]の場合、1ページ目で1位〜30位,2ページ目で31位〜60位までが表示される)
- 3で作成したインデックスリストを利用してランキングを表示する
コード
SetRanking
引数start
の数からend
の数までリストを回す。
ここでランキング表示用のprefabを生成しています。SetContent
メソッドでそのprefab内のテキストを変更していますが、今回はそこがメインではないので割愛します。
public void SetRanking(int start, int end, List<UserData> list)
{
end = (end>list.Count)?list.Count:end;
for(int i=start;i<end;i++){
Transform prefab = Instantiate(original, content).transform;
UserData data = all[i];
SetContent(data,prefab);
}
}
SplitIndex
引数splitCount
はランキングを何個ごとに分けるかを決めます。
引数listCount
にはランキングの元となるリストの長さを与えます。
splitCount:30, listCount:120
みたいな感じにすると
[0,30,60,90,120]
というリストが得られます。
これをindexList
という変数に保持しておきます。
List<int> SplitIndex(int splitCount, int listCount)
{
List<int> list = new List<int>();
int num = 0;
while(true){
list.Add(num);
num += splitCount;
if(num>=listCount) {
list.Add(listCount);
break;
}
}
return list;
}
ChangeIndex
上二つを実装できればあとは単純です。
現在のページ番号を保持する currentIndex
みたいな変数を用意します。そしてSetRanking(indexList[currentIndex],indexList[currentIndex+1],all);
とすることで[0,30,60,90,120]
というリストがあり、例えば1ページ目を表示したいときはcurrentIndex = 0
とすることでリストの0番目から29番目を取得できます、
public void ChangeIndex(int n)
{
currentIndex += n;
if(currentIndex<0)currentIndex=0;
else if(currentIndex>indexList.Count-2) currentIndex = indexList.Count-2;
SetRanking(indexList[currentIndex],indexList[currentIndex+1],all);
}