본문 바로가기

게임 개발/바다 위 고양이

게임 개발 #2 Playfab 기능 테스트

시작하며

플레이팹에서 아이템 구매, 플레이어 데이터 저장, 재화 등의 기능을 사용할 예정이며, 해당 기능을 사용할 데이터들의 테이블은 정리하여 클래스까지 생성한 상태이다. 내가 정한 테이블의 모습으로 플레이팹을 사용할 수 있을지 확인할 필요성이 있었다. 

 

준비하기

플레이팹에서 아이템, 재화와 관련된 부분은 Economy에서 설정할 수 있다. Economy는 2가지 버전이 있는데, 나는 자료가 더 많은 레거시를 사용하기로 했다.

Economy > 통화(레거시)로 게임 내에서 사용할 재화를 설정하고, Economy > 카탈로그(레거시)에서 게임 내에서 사용할 아이템들을 설정해줬다.

 

화면 구성

저번에 구현한 로그인과 관련된 UI 아래에 임시로 테스트와 관련된 버튼을 생성했다. 왼쪽부터 순서대로 플레이팹에서 아이템 종류 가져오기, 아이템 구매하기, 서버에서 현재 재화 가져오기, 서버에 재화 상태 저장하기이다.

 

코드
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using PlayFab;
using PlayFab.ClientModels;

using Newtonsoft.Json;
using System;

public class test : MonoBehaviour
{
    public int serverShell = 0;
    public int shell = 0;

    public void GetShop()
    {
        var requset = new GetCatalogItemsRequest { CatalogVersion = "Main" };
        PlayFabClientAPI.GetCatalogItems(requset, GetSuccess, GetFail);
    }

    private void GetFail(PlayFabError obj)
    {
        Debug.Log("카탈로그 불러오기 실패");
    }

    //카탈로그를 불러오는데 성공했다면 콜백이 된다.
    private void GetSuccess(GetCatalogItemsResult obj)
    {
        Debug.Log("카탈로그 불러오기 성공");

        var items = obj.Catalog;

        Debug.Log("아이템 =" + items.Count);
        for (int i = 0; i < items.Count; i++)
        {
            Debug.Log("아이템 아이디 =" + items[i].ItemId);
            Debug.Log("아이템 클래스 =" + items[i].ItemClass);
            Debug.Log("아이템 디스플레이 네임 =" + items[i].DisplayName);
            Debug.Log("아이템 설명 =" + items[i].Description);
            Debug.Log("아이템 가격 =" + items[i].VirtualCurrencyPrices["SH"]);
            Debug.Log("키가 shell? =" + items[i].VirtualCurrencyPrices.ContainsKey("SH"));
            //var dic = JsonConvert.DeserializeObject<Dictionary<string, string>>(items[i].CustomData);
            //Debug.Log("커스텀 데이터 =" + dic["power"]);
        }
    }

    public void itemPurchase()
    {
        PlayFabClientAPI.PurchaseItem(new PurchaseItemRequest
        {
            // In your game, this should just be a constant matching your primary catalog
            CatalogVersion = "Main",
            ItemId = "0",
            Price = 10,
            VirtualCurrency = "SH"
        }, LogSuccess, LogFailure);
    }

    private void LogFailure(PlayFabError obj)
    {
        Debug.Log("구매 실패");
    }

    private void LogSuccess(PurchaseItemResult obj)
    {
        Debug.Log("구매 성공");
    }

    //--------------- 재화
    private void loadMoney()
    {
        PlayFabClientAPI.GetUserInventory(new GetUserInventoryRequest()
        {
        },
        success =>
        {
            serverShell = success.VirtualCurrency["SH"];
            Debug.Log("shellGet = " + serverShell);
        },
        error =>
        {
            Debug.Log("재화 로드 실패");
        });
    }

    private void AddMoney(int n, int nowShell)
    {
        var request = new AddUserVirtualCurrencyRequest() { VirtualCurrency = "SH", Amount = n };
        PlayFabClientAPI.AddUserVirtualCurrency(request, (result) => print("돈 얻기 성공! 현재 돈 : " + result.Balance), (error) => print("돈 얻기 실패"));
        serverShell = nowShell;
    }

    private void SubtractMoney(int n, int nowShell)
    {
        var request = new SubtractUserVirtualCurrencyRequest() { VirtualCurrency = "SH", Amount = n };
        PlayFabClientAPI.SubtractUserVirtualCurrency(request, (result) => print("돈 빼기 성공! 현재 돈 : " + result.Balance), (error) => print("돈 빼기 실패"));
        serverShell = nowShell;
    }

    public void getMoney()
    {
        loadMoney();
    }

    public void moneySave()
    {
        int nowShell = shell;

        if (nowShell < serverShell)
        {
            SubtractMoney(serverShell - nowShell, nowShell);
        }
        else
        {
            AddMoney(nowShell- serverShell, nowShell);
        }
    }
}

플레이팹에서 상점 아이템 카탈로그를 가져올 때 어떤 모습으로 가져오는지, 구매는 어떤 형식으로 이루어지는 지 확인했다. 재화가 여러 종류일 때 이를 어떻게 구분할까 고민했는데, ContainsKey()로 구분하면 될 것 같다는 생각을 하게 되었다.

 

재화 중 값의 변동이 잦은 경우 이 변동사항을 매번 서버에 저장하지 않고 특정 시간마다 서버에 저장하는 기능이 구현 가능한지 확인할 수 있는 코드를 작성했다. 서버의 값을 변수에 미리 저장해놓은 뒤 현재 재화와 비교해서 서버에서 재화를 증가/감소시키는 함수를  호출하게끔 했다.

 

 

 

 

상점기능

플레이팹에서 경제탭으로 이동후 카탈로그 만들기를 선택한다. 카탈로그는 게임에서의 상점 같은 기능이다. 카탈로그에 원하는 아이템에 대한 정보를 입력해놓고 카탈로그를 불러오면 카탈로

stealnewspaper.tistory.com

 

 

가상화폐 상점 아이템 인벤토리ㅣPlayFab

PlayFabManager.Cs 소스입니다 using System.Collections; using System.Collections.Generic; using UnityEngine; using PlayFab; using Pl...

goraniunity2d.blogspot.com

 

'게임 개발 > 바다 위 고양이' 카테고리의 다른 글

게임 개발 #1 Playfab + google 로그인 기능  (0) 2023.08.07
게임 구상 #0  (0) 2022.04.09