다음을 통해 공유


플레이어 게시자 데이터를 사용하여 여러 타이틀 플레이에 대해 보상을 제공하는 방법

보상에는 일반적으로 플레이어 데이터 외부의 ‘다른’ 시스템이 필요하므로 이 예에서는 설명하기 쉽게 가상 통화로 보상하는 방법을 보여 줍니다.

요구 사항

  • 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);
}

특히 이 예제에서는 다음을 사용하는 방법을 보여 줍니다.

각 게임에서 사용할 수 있는 보상 확인

플레이되는 타이틀을 추적한 후 보상을 추적하고 제공해야 합니다. 다음 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를 사용하는 방법을 보여 줍니다.

코드 블록은 다음 단계를 나타냅니다.

결론

플레이어 게시자 데이터와 플레이어 데이터는 구조가 동일합니다.

플레이어 데이터는 ‘타이틀별’ 데이터인 반면 플레이어 게시자 데이터는 모든 타이틀에 관련된 데이터‘만’ 포함합니다.

참고 항목

간단한 인게임 상호 프로모션 보상 - 둘 이상의 게임에 참여하는 플레이어를 보상합니다.