(PlayFab) Azure 샘플 코드 분석
포스트
취소

(PlayFab) Azure 샘플 코드 분석

분석 사이트 : PlayFab-Sample : Tic Tac Toe Azure Functions App (Unity Game)

협업에 경험이 없어서.. 샘플 코드에 자주 쓰이는 코드를 분석한 글입니다.

기본 지식 (혹시라도!)

서버와 클라이언트는 서로 소통하기 위해 송수신 하는 양식이 같아야 합니다.

예를 들어서 LoginInfo Class라는 양식이 있으면 서버와 클라이언트 모두 그 양식을 구현해야 합니다.

이제 서버와 클라이언트 각각 자주 쓰이는 패턴을 알아보겠습니다.

서버

1. 필수 설치!


2. Server Function Code

먼저 샘플 코드를 확인해봅시다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// Models
public class PlayFabIdRequest
{
    public string PlayFabId { get; set; }
}

public class WinCheckResult
{
    public GameWinnerType Winner { get; set; }
}

// Function
[FunctionName("WinCheck")]
public static async Task<WinCheckResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage entityRequest, ILogger log)
{
    // Extract the context from the incoming request
    var context = await FunctionContext<PlayFabIdRequest>.Create(entityRequest);

    string playFabId = context.FunctionArgument.PlayFabId;

    Settings.TrySetSecretKey(context.ApiSettings);
    Settings.TrySetCloudName(context.ApiSettings);

    // Grab the current player's game state
    var state = await GameStateUtil.GetCurrentGameState(playFabId, context.ApiSettings, context.AuthenticationContext);
    
    var winCheckResult = WinCheckUtil.Check(state);

    if (winCheckResult.Winner != GameWinnerType.NONE)
    {
        // Update the leaderboard accordingly
        await LeaderboardUtils.UpdateLeaderboard(playFabId, winCheckResult.Winner);

        // Store the game history
        await GameStateUtil.AddGameStateHistory(state, playFabId, context.ApiSettings, context.AuthenticationContext);

        // Clear the current game state
        await GameStateUtil.UpdateCurrentGameState(new TicTacToeState(), playFabId, context.ApiSettings, context.AuthenticationContext);
    }

    return winCheckResult;
}


코드의 흐름으로 봤을 때는 플레이어의 Id를 수신 받고 승리 여부 상태를 확인 후 WinCheckResult를 송신하는 것으로 보입니다.

먼가 어렵고 복잡해 보이지만.. 자주 쓰이는 코드를 확인해보겠습니다.

1
2
3
4
5
6
7
8
9
[FunctionName("WinCheck")]
public static async Task<WinCheckResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage entityRequest, ILogger log)
{
    // Extract the context from the incoming request
    var context = await FunctionContext<PlayFabIdRequest>.Create(entityRequest);

    string playFabId = context.FunctionArgument.PlayFabId;
}


우선 차례차례 읽어보면!

  • 함수의 반환값은 WinCheckResult

  • post 송수신하기 때문에 RequestHttpRequestMeeage로 사용

  • context에 수신 요청된 PlayFabIdRequest 양식을 추출

  • context에서 playFabId 추출

샘플 Function 코드가 대부분 이렇게 시작합니다!

제일 필요한 플레이어의 ID를 추출했으니 상황에 맞게 사용해주시면 됩니다.


3. 패턴

폴더나 코드 패턴은 사람마다 다르지만 샘플 코드같은 경우 폴더가 Functions, Models, Util로 나뉘어져 있었습니다.

참고하시면 좋을 것 같아요! :D

  • Functions : 클라이언트로 부터 요청받을 함수가 있는 폴더

  • Models : 변수, 타입을 담는 클래스 폴더

  • Util : 서버안에서 연산을 수행할 기능 폴더


클라이언트

Unity 클라이언트 같은 경우 자주 쓰이는 방식입니다.

1. Client Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 수신할 정보 작성
var request = new ExecuteFunctionRequest
{
    FunctionName = "함수 이름",
    FunctionParameter = new PlayFabIdRequest    // 자체 양식
    {
        PlayFabId = "PlayFab ID"
    },
    AuthenticationContext = new PlayFabAuthenticationContext
    {
        EntityToken = "PlayFab EntityToken"
    }
};

// 발송!
PlayFabCloudScriptAPI.ExecuteFunction(request,
    (result) =>
    {
        ExecutionCompleted = true;
    },
    (error) =>
    {
        throw new Exception($"WinCheck request failed. Message: ${error.ErrorMessage}, Code: ${error.HttpCode}");
    });


마무리

저 같은 경우 샘플코드를 간단하게 분석해보면서 처음의 막막했던 마음이 사라졌습니다.

이래서 샘플코드 보는구나 싶고 그러네요..! 글이 자세하진 못했지만 링크타고 들어가셔서 보시면 도움이 될겁니다!

감사합니다 :D


💡 참고

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.