大抵のゲームにはあるハイスコアを表示する機能を作ってみた。
値は Float, 上位10件まで保存, オフラインで完結する, という仕様で行う。
スコアの保存
Unityで端末にデータを保存するには PlayerPrefs というクラスを使うと簡単にできる。
ところがこの PlayerPrefs で保存できるデータは String, Int, Float の3種類しかない。ランキングのように複数のデータを取得する必要がある場合はどうしようかなやんだが今回はランキング情報を文字列に変換して保存する事にする。というか多分これが一番楽だと思う。
ランキングを読み書きするコード
ランキングを PlayerPrefs から取得、スコアの保存とランキングの再構成、ランキングの削除、の3つの関数を作成。
private var RANKING_PREF_KEY:String = 'ranking';
private var RANKING_NUM:int = 10;
private var ranking:float[] = new float[RANKING_NUM];
/**
* ランキングを PlayerPrefs から取得して ranking に格納
*/
function getRanking() {
var _ranking = PlayerPrefs.GetString(RANKING_PREF_KEY);
if (_ranking.length > 0) {
var _score = _ranking.Split(","[0]);
ranking = new float[RANKING_NUM];
for (var i=0; i<_score.length && i<RANKING_NUM; i++) {
ranking[i] = parseFloat(_score[i]);
}
}
}
/**
* 新たにスコアを保存する
*/
function saveRanking(new_score:float) {
if (ranking) {
var _tmp:float = 0.0;
for (var i=0; i<ranking.length; i++) {
if (ranking[i] < new_score) {
_tmp = ranking[i];
ranking[i] = new_score;
new_score = _tmp;
}
}
} else {
ranking[0] = new_score;
}
// 配列を文字列に変換して PlayerPrefs に格納
var ranking_string:String = Array(ranking).join(',');
PlayerPrefs.SetString(RANKING_PREF_KEY, ranking_string);
}
/**
* delete ranking
*/
function deleteRanking() {
PlayerPrefs.DeleteKey(RANKING_PREF_KEY);
}
ランキングを表示する
取得した文字列を処理しやすいように配列に戻してから再度文字列にして表示してる。
function screen_ranking() {
var label_ranking:Vector2 = getVector2(DEFAULT_SCREEN.x, DEFAULT_SCREEN.y);
var rect_ranking:Rect = Rect(
getXCenter(label_ranking.x),
getYCenter(label_ranking.y),
label_ranking.x, label_ranking.y);
var ranking_string:String = '';
for (var i=0; i<ranking.length; i++) {
ranking_string = ranking_string + (i + 1) + '位 ' + ranking[i] + "秒\n";
}
GUI.Label(rect_ranking, ranking_string, rankingLabelStyle);
}