プレイヤーのパブリッシャー データを使用して複数のタイトルをプレイするためのリワード付与する方法
リワードは、通常プレイヤー データの外部にある他のシステムであり、この例では、分かりやすくするための仮想通貨の賞金を示します。
要件
- PlayFab 開発者アカウント。
- プレイヤーは、同じ資格情報を使う両方のタイトルにログインする必要があります。 1 つのアプローチは回復する資格情報を使用することです。これについては、ログインの基本とベスト プラクティスチュートリアルで説明しています。 回復可能なログインを匿名アカウントに追加するには、アカウントの結合チュートリアルをご覧ください。
- この例では、CloudScript の実用的な知識が必要です。
- この例では、プレイヤーの不正行為を防止する基本のデータ セキュリティについて説明します。 タイトルがカスタム ゲーム サーバーのサーバー API 使用している場合に、同様にその API を使用できます。
- PlayFab によってトリガーされたリワードは、適切な PlayFab 機能を使用する必要があります。 PlayFab リワードが指定できる形式は、仮想通貨、インベントリー アイテム、カスタム プレイヤー データ、統計情報などです。PlayFab システム以外でリワードを配布する高度なトピックは、このチュートリアルでは扱いません。
また、デベロッパーが CloudScript から作成された全サーバー API 呼び出しで、うまくエラーを処理することをお勧めします。
パブリッシャー データへのログインの、各ゲームからのレポート
各ゲームは、ログインが発生したことを報告する必要があります。 わかりやすくするため、例として、各タイトル、各パブリッシャー タイトルで 1 つだけリワードを提供するとします。
カウンター、タイムスタンプなどのメカニズムでこの概念を自由に展開し、プログレッシブまたは連続的なリワードを提供できます。
次の CloudScript は、スタジオのすべてのゲームに存在する必要があります。
// CloudScript/Javascript
var PUBLISHER_USED_TITLES_KEY = "playedTitleIds";
handlers.TrackTitleUsage = function () {
// Get the User Publisher Data for this player, and convert it into our expected format
var getRequest = { Keys: [PUBLISHER_USED_TITLES_KEY], PlayFabId: currentPlayerId };
var getResult = server.GetUserPublisherInternalData(getRequest);
var playedTitlesList = JSON.parse(getResult.Data[PUBLISHER_USED_TITLES_KEY].Value); // format is arbitrary, but this example assumes Array<string>
if (!playedTitlesList)
playedTitlesList = [];
// Check if we've played this title already
var alreadyPlayed = false;
for (var i = 0; i < playedTitlesList.length; i++)
alreadyPlayed = alreadyPlayed || playedTitlesList[i] === script.titleId;
if (alreadyPlayed)
return; // Nothing to do
// Update the list of played titles, and re-save
playedTitlesList.push(script.titleId);
var setRequest = { PlayFabId: currentPlayerId, Data: { PUBLISHER_USED_TITLES_KEY: JSON.stringify(playedTitlesList) } };
server.UpdateUserPublisherInternalData(setRequest);
}
具体的に、この例では、使用方法を示します。
各ゲームで、リワードの引き換えを確認
プレイしているタイトルを追跡した後、リワードを追跡して付与する必要があります。 この CloudScript 機能が、他のタイトルをプレイしていることに基づいて、確認し、利用可能なリワードを付与します。
// CloudScript/Javascript
var PUBLISHER_REDEEMED_TITLES_KEY = "redeemedTitleIds";
var MY_CROSS_TITLE_REWARDS = { "AU": 10 };
handlers.CheckCrossTitleRewards = function () {
// Get the publisher data concerning cross-title rewards for this player
var getRequest = { Keys: [PUBLISHER_USED_TITLES_KEY, PUBLISHER_REDEEMED_TITLES_KEY], PlayFabId: currentPlayerId };
var getResult = server.GetUserPublisherInternalData(getRequest);
var redeemedTitleRewards = JSON.parse(getResult.Data[PUBLISHER_REDEEMED_TITLES_KEY].Value); // format is arbitrary, but this example assumes { [key: string]: Array<string> }
if (!redeemedTitleRewards)
redeemedTitleRewards = {};
var playedTitlesList = JSON.parse(getResult.Data[PUBLISHER_USED_TITLES_KEY].Value); // format is arbitrary, but this example assumes Array<string>
if (!playedTitlesList)
playedTitlesList = [];
// Determine which titles are un-redeemed
var unredeemedTitleIds = [];
for (var i = 0; i < playedTitlesList.length; i++) {
if (!redeemedTitleRewards.hasOwnProperty(playedTitlesList[i]) && playedTitlesList[i] !== script.titleId)
unredeemedTitleIds.push(playedTitlesList[i]);
}
if (unredeemedTitleIds.length === 0)
return null; // Nothing to redeem
// Give the cross title rewards
var multiplier = unredeemedTitleIds.length;
var actualRewards = {}; // MY_CROSS_TITLE_REWARDS is a global constant, so don't modify it or you'll mess up future calls
// Please note that the number of API calls that may be made from CloudScript, as well as the total available processing time is limited,
// and so the number of rewards should be as small as possible (only one VC, in this case)
for (var eachKey in MY_CROSS_TITLE_REWARDS) {
actualRewards[eachKey] = MY_CROSS_TITLE_REWARDS[eachKey] * multiplier;
server.AddUserVirtualCurrency({ PlayFabId: currentPlayerId, VirtualCurrency: eachKey, Amount: MY_CROSS_TITLE_REWARDS[eachKey] }); // Can only add 1 VC at a time
}
// Save the Publisher data indicating rewards are claimed
redeemedTitleRewards[script.titleId] = playedTitlesList;
var setRequest = { PlayFabId: currentPlayerId, Data: { PUBLISHER_REDEEMED_TITLES_KEY: JSON.stringify(redeemedTitleRewards) } };
server.UpdateUserPublisherInternalData(setRequest);
// Tell the client the reward
return actualRewards;
};
注意
この具体例では、サーバーの使用について説明します。GetUserPublisherInternalData (複数キーを要求する) サーバー、UpdateUserPublisherInternalData サーバー、AddUserVirtualCurrency サーバーです。
コード ブロックは、次の手順を表します。
- PlayFab からデータを取得し、ローカルのデータ構造を解析します (GetUserPublisherInternalData の呼び出し)。
- データを確認し、リワードされていないタイトル ID を検索します。
- リワードの付与 (AddUserVirtualCurrency の呼び出し)。
- 付与済みのリワードを更新 (UpdateUserPublisherInternalData の呼び出し)。
- クライアントで利用可能な量のリワードを生成します (CloudScript のステートメントを返します)。
まとめ
プレイヤー パブリッシャー データとプレイヤー データは、構造的には同じです。
プレイヤー データがタイトル固有である必要がある一方、プレイヤー パブリッシャー データは全タイトルにまたがって関連する情報のみが含まれています。
関連項目
シンプルなゲーム内クロス プロモーション: 複数のゲームに参加しているプレイヤーにリワードを付与します。