リーダーボード
自動リセット、過去の期間のアーカイブ、サーバー側のチート対策を備えたスコアランキングです。
コードのコメントと API 名は、SDK と一致させるため英語のままにしています。
リーダーボードを作成する#
プロジェクトのリーダーボードページでリーダーボードを作成し、コードではそのスラッグを使用します。
| 設定 | オプション |
|---|---|
| スラッグ | コードで使用する小文字の識別子(例: coins)。 |
| 並び順 | DESC(高い順)または ASC(低い順。レースのタイムなど)。 |
| スコアモード | BEST は各プレイヤーのベストスコアを保持し、LATEST は常に最新のスコアで置き換えます。 |
| リセット | NONE、DAILY、WEEKLY、MONTHLY のいずれか。 |
| 最小 / 最大スコア | 受け付けるスコアの最小値と最大値(任意)。 |
| 送信クールダウン | 同じプレイヤーが 2 回送信する際に必要な最小間隔(秒、任意)。 |
スコアを送信する#
プレイヤー名はアカウントから取得されるため、クライアントがほかのプレイヤーとしてスコアを送信することはできません。
var submit = await Majacloud.Leaderboards.SubmitScoreAsync("coins", 340);
if (submit.Ok && submit.Value.Accepted)
Debug.Log("New rank #" + submit.Value.Entry.Rank);var submit := await Majacloud.leaderboards.submit_score("coins", 340)
if submit.ok and submit.value.accepted:
print("New rank #", submit.value.entry.rank)const submit = await mc.leaderboards.submitScore('coins', 340);
if (submit.ok && submit.value.accepted) console.log('New rank #' + submit.value.entry.rank);curl -X POST https://majacloud.majanite.com/v1/leaderboards/coins/scores -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" -d '{"score": 340}'ランキングを読み取る#
上位のエントリーはログインなしで取得できます。プレイヤー自身の順位とその前後のエントリーを取得するには、プレイヤーがログインしている必要があります。
var top = await Majacloud.Leaderboards.GetTopAsync("coins", limit: 10);
var me = await Majacloud.Leaderboards.GetMyRankAsync("coins");
var around = await Majacloud.Leaderboards.GetAroundMeAsync("coins", radius: 3);
if (me.Ok && me.Value.Entry != null) Debug.Log("You are #" + me.Value.Entry.Rank + " of " + me.Value.Total);var top := await Majacloud.leaderboards.get_top("coins", 10)
var me := await Majacloud.leaderboards.get_my_rank("coins")
var around := await Majacloud.leaderboards.get_around_me("coins", 3)
if me.ok and me.value.entry != null:
print("You are #%d of %d" % [me.value.entry.rank, me.value.total])const top = await mc.leaderboards.getTop('coins', { limit: 10 });
const me = await mc.leaderboards.getMyRank('coins');
const around = await mc.leaderboards.getAroundMe('coins', { radius: 3 });
if (me.ok && me.value.entry) console.log(`You are #${me.value.entry.rank} of ${me.value.total}`);curl "https://majacloud.majanite.com/v1/leaderboards/coins/entries?limit=10" -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY"
curl https://majacloud.majanite.com/v1/leaderboards/coins/me -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H "Authorization: Bearer $TOKEN"
curl "https://majacloud.majanite.com/v1/leaderboards/coins/around-me?radius=3" -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H "Authorization: Bearer $TOKEN"リセットと過去の期間#
毎日、毎週(月曜日)、毎月のリーダーボードは 00:00 UTC にリセットされます。終了した期間はアーカイブされ、previous 期間として読み取れます。
var yesterday = await Majacloud.Leaderboards.GetTopAsync("coins", 10, 0, MajacloudLeaderboardPeriod.Previous);var yesterday := await Majacloud.leaderboards.get_top("coins", 10, 0, "previous")const yesterday = await mc.leaderboards.getTop('coins', { limit: 10, period: 'previous' });curl "https://majacloud.majanite.com/v1/leaderboards/coins/entries?period=previous" -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY"保持される過去の期間の数と、リーダーボードが返すエントリー数はプランによって異なります(制限を参照)。
チート対策#
- 最小値または最大値の範囲外のスコアは
validationで拒否されます。 - クールダウンより短い間隔で送信すると、
rate_limitedが返されます。 - クライアントは、ログイン中のプレイヤーのスコアしか送信できません。
- 競技性の高いゲームでは、サーバーでスコアを決定し、シークレットキーを使って送信してください。
サーバーから送信する#
シークレットキーを使い、player_id とスコアを送信します。プレイヤーがすでに存在している必要があります。
// Node.js with secretKey: submit after your server validated the match
await admin.server.submitScore('coins', 'player_3f9c…', 980);curl -X POST https://majacloud.majanite.com/v1/leaderboards/coins/scores \
-H "X-Project-ID: $PROJECT_ID" -H "X-Secret-Key: $SECRET_KEY" \
-H "Content-Type: application/json" -d '{"player_id": "player_3f9c…", "score": 980}'