はじめに
近年のPvPゲームではシーズンごとにランクマッチが実施され、ブロンズ→シルバー→ゴールド→プラチナ のように昇格していくスタイルが一般化しました。
GS2 も元々レーティング機能は持っていましたが、シーズンで区切ることはできず、ランクではなくレート値の増減のみで表現するレートマッチのみの提供でした。
そこで、近年増えてきたランクマッチ用に GS2-SeasonRating 機能の提供を開始しました。
機能の概要
まずはシーズンを定義します。シーズンにはランクごとの情報を表す複数ティアーと、開催期間を設定します。
ティアーには勝負によって変動するポイントの増減量のレンジと、ティアーに昇格した際に得られるボーナスポイントを持つことができます。
また、ティアーごとに試合に参加するだけでポイントが減算される参加料を設定することも可能です。
ポイントは GS2-Experience の経験値として管理され、ティアーの閾値も GS2-Experience のランクアップ経験値閾値をつかって管理します。
つまり、GS2-SeasonRating は GS2-Experience の経験値を試合結果に応じて増減するインターフェースということになります。
機能の詳細
API仕様は従来のレーティング機能と対して変わりません。
プレイヤーは対戦開始時に投票用紙(Ballot)を取得し、対戦終了時に Ballot を使って投票(Vote)します。
全員の試合結果投票を受け付けるか、最初の投票を受け付けてから5分が経過すると集計処理が実行されます。
集計処理は受け付けた試合結果の内容を多数決で判定し、多数派が報告した結果を採用します。
結果に応じて ティアーの変動幅を参加人数(順位のパターン数)で均等に分け、各プレイヤーの順位に基づいてポイントの変動量を決定し、GS2-Experience の経験値を加減算します。
使い方
ランクマッチを開始
GS2-Matchmaking のネームスペース設定に GS2-SeasonRating との連携設定が増えています。
ここを有効化し、対象となる GS2-SeasonRating のネームスペースを設定することで、マッチメイキング完了時に GS2-SeasonRating に GS2-Matchmaking のギャザリング名と同じ名前でランクマッチセッションが作成されます。
以降は GS2-Matchmaking のギャザリング名を sessionName として指定してAPIを呼び出してください。
投票用紙を取得
var item = await gs2.SeasonRating.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).Ballot(
seasonName: "rating-0001",
sessionName: gathering.Name,
numberOfPlayer: 4
).ModelAsync();
var body = item.Body;
var signature = item.Signature;
投票を実行
var result = await gs2.SeasonRating.Namespace(
namespaceName: "namespace-0001"
).VoteAsync(
ballotBody: ballot.Body,
ballotSignature: ballot.Signature,
gameResults: new List<Gs2.Unity.Gs2SeasonRating.Model.EzGameResult> {
new Gs2.Unity.Gs2SeasonRating.Model.EzGameResult() {
Rank = 1,
UserId = "user-0001",
},
new Gs2.Unity.Gs2SeasonRating.Model.EzGameResult() {
Rank = 2,
UserId = "user-0002",
},
new Gs2.Unity.Gs2SeasonRating.Model.EzGameResult() {
Rank = 2,
UserId = "user-0003",
},
new Gs2.Unity.Gs2SeasonRating.Model.EzGameResult() {
Rank = 3,
UserId = "user-0004",
},
}
);
レート値の変化のハンドリング
GS2-Experience のステータスを Subscribe して判定できます。
var item = await gs2.Experience.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).Status(
experienceName: "rating",
propertyId: seasonModel.SeasonModeld,
).Subscribe(
changedStatus => {
var experienceValue = changedStatus.ExperienceValue;
var experienceValue = changedStatus.RankValue;
}
);