기타

[Playfab]PlayerData

Aostols 2024. 7. 14. 15:32
반응형

Playfab AzureFunction 에서 PlayerData를 조작하기 위해서는 호출자의 PlayfabID 를 알아야 합니다.

Playfab 내부에는 Master player accountID라고 표현되어 있고 API 상에서는 그냥 PlayFab ID라고 표현되어 있습니다.

서버 입장에서는 누가 호출한 것인지 모르기 때문에 누구 데이터를 수정해야 하는지 확인 해야 하는데 필요합니다.

 

FunctionExecutionContext<dynamic> context
 = JsonConvert.DeserializeObject<FunctionExecutionContext<dynamic>>(await req.ReadAsStringAsync());
 
 string playfabID = context.CallerEntityProfile.EntityChain.Split("/")[2];

지난 포스트에서도 써 있었지만 context에서는 많은 정보가 있습니다.

context내부에는 CallerEntityProfileBody 라는 클래스가 있고 그 속에는 EntityChain 이라는 string타입의 변수가 있습니다.

이 변수는 몇가지 정보를 나타내고 있는데 Title Player Account ID도 있고 Master Player Account ID도 있습니다.

여기서 [2]가 Master Account ID이기 떄문에 이것을 사용해 줍니다.

 

dynamic args = context.FunctionArgument;
string valueType = args.valueType;
int addValue = args.addValue;

int currentValue = 0;
GetUserDataRequest getUserDataRequest = new GetUserDataRequest
{
    Keys = new List<string>() { valueType },
    PlayFabId = playfabID,

};
PlayFabResult<GetUserDataResult> getUserData = await serverAPI.GetUserDataAsync(getUserDataRequest);

if (getUserData.Result.Data.ContainsKey(valueType))
{
    currentValue = int.Parse(getUserData.Result.Data[valueType].Value.ToString());
}

Dictionary<string, string> updateParam = new Dictionary<string, string>();
currentValue += addValue;
updateParam.Add(valueType, currentValue.ToString());

UpdateUserDataRequest updateUserDataRequest = new UpdateUserDataRequest
{
    Data = updateParam,
    PlayFabId = playfabID,
};

PlayFabResult<UpdateUserDataResult> result = await serverAPI.UpdateUserDataAsync(updateUserDataRequest);

 

전반적인 구조는 간단합니다.

GetUserDataAsync(getUserDataRequest) 로 내가 가진 UserData를 가져 옵니다.

여기에 필요한것은 뭘 가져올지 키 리스트와 PlayFabID입니다.

가져온 이후에 항상 확인해야 할것은 데이터가 없을수도 있기 때문에 ContainsKey()를 체크 합니다.

키가 없다면 처음 넣는 값이기 때문에 0부터 시작 해야 합니다.

 

이후 currentValue += addValue로 내가 가진 값에 추가될 값을 더해줍니다.

최종적으로 serverAPI.UpdateUserDataAsync(updateUserDataRequest)를 호출해서 실제 값을 업데이트 해 줍니다.

 

여기서 중요한 것이 UpdateUserDataRequest로 넣을때는 Dictionary<string, string>인데 GetUserDataRequest로 받을 떄는 Dictionary<string, UserDataRecord>입니다.

실수하기 쉬운부분이고 저도 여기서 한참을 헤매게 되었습니다.

 

실제 PlayFab 콘솔에 가서 보게되면 데이터가 정상으로 들어간 것을 볼 수 있습니다.

반응형

'기타' 카테고리의 다른 글

[PlayFab]CloudScript - AzureFunction  (0) 2024.07.07
[기타]뒤끝서버 사용기  (0) 2024.06.30
콘솔 게임 개발 과정에서 느낀점  (0) 2022.12.03
Flutter - showModalBottomSheet  (0) 2022.07.14
[링크]머신러닝  (0) 2022.07.12