플레이어 게시자 데이터를 사용하여 여러 타이틀 플레이에 대해 보상을 제공하는 방법
보상에는 일반적으로 플레이어 데이터 외부의 ‘다른’ 시스템이 필요하므로 이 예에서는 설명하기 쉽게 가상 통화로 보상하는 방법을 보여 줍니다.
요구 사항
- PlayFab 개발자 계정
- 플레이어는 같은 자격 증명을 사용하여 두 타이틀 ‘모두’에 로그인해야 합니다. 한 가지 방법은 로그인 기본 사항 및 모범 사례 자습서에 설명된 대로 복구 가능 자격 증명을 사용하는 것입니다. 복구 가능 로그인을 익명의 계정에 추가하려면 계정 연결 자습서를 참조하세요.
- 이 예제를 수행하려면 CloudScript에 대한 실무 지식이 필요합니다.
- 이 예제에서는 플레이어 부정 행위를 방지하기 위한 기본적인 데이터 보안을 설명합니다. 마찬가지로 타이틀에서 사용하는 경우 서버 API를 사용자 지정 게임 서버에서 사용할 수 있습니다.
- PlayFab을 통해 트리거된 보상을 받으려면 적절한 PlayFab 기능을 사용해야 합니다. PlayFab 보상은 가상 통화, 인벤토리 항목, 사용자 지정 플레이어 데이터, 통계 등의 형식일 수 있습니다. PlayFab 시스템 외부에서 보상 배포는 고급 항목으로 이 자습서에서 다루지 않습니다.
또한 개발자는 CloudScript를 통해 수행하는 모든 서버 API 호출에서 적절한 오류 처리를 사용하는 것이 좋습니다.
각 게임에서 게시자 데이터에 로그인 보고
각 게임에서는 로그인이 발생했음을 보고해야 합니다. 편의를 위해 이 예제에서는 각 타이틀에 대해, 플레이된 각 게시자 타이틀에 대해 보상을 ‘하나’만 제공합니다.
카운터, 타임스탬프, 기타 메커니즘으로 개념을 자유롭게 확장하여 점진적이거나 순차적인 보상을 제공할 수 있습니다.
다음 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);
}
특히 이 예제에서는 다음을 사용하는 방법을 보여 줍니다.
- server.GetUserPublisherInternalData
- server.UpdateUserPublisherInternalData.
각 게임에서 사용할 수 있는 보상 확인
플레이되는 타이틀을 추적한 후 보상을 추적하고 제공해야 합니다. 다음 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;
};
참고 항목
이 특정 예제에서는 server.GetUserPublisherInternalData(여러 키 요청), server.UpdateUserPublisherInternalData, server.AddUserVirtualCurrency를 사용하는 방법을 보여 줍니다.
코드 블록은 다음 단계를 나타냅니다.
- PlayFab에서 데이터를 가져와서 로컬 데이터 구조로 구문 분석(GetUserPublisherInternalData 호출)
- 데이터를 검사하고 보상되지 않은 타이틀 ID 검색
- 보상 제공(AddUserVirtualCurrency 호출)
- 요청된 보상 업데이트(UpdateUserPublisherInternalData 호출)
- 보상된 금액을 클라이언트에서 사용할 수 있도록 함(CloudScript의 return 문 사용)
결론
플레이어 게시자 데이터와 플레이어 데이터는 구조가 동일합니다.
플레이어 데이터는 ‘타이틀별’ 데이터인 반면 플레이어 게시자 데이터는 모든 타이틀에 관련된 데이터‘만’ 포함합니다.
참고 항목
간단한 인게임 상호 프로모션 보상 - 둘 이상의 게임에 참여하는 플레이어를 보상합니다.