





using UnityEngine;
using UnityEngine.UI;
using Unity.Services.Core;
using Unity.Services.Authentication;
public class UGSManager : MonoBehaviour
{
[SerializeField]
Text userIDInfo;
async void Start()
{
await UnityServices.InitializeAsync();
await AuthenticationService.Instance.SignInAnonymouslyAsync(); //계정을 따로 안만들고 로그인. 기기에 종속
if(AuthenticationService.Instance.IsSignedIn) //로그인 됐을 경우
{
userIDInfo.text = "Player ID : " + AuthenticationService.Instance.PlayerId; //PlayerId는 유니티가 게스트 로그인하면 알려줌
}
else //로그인 안됏을 경우
{
Debug.Log("로그인 실패 ㅠ");
}
}
}

실행 시, 정상적으로 ID를 받아올 수 있다.


1번 설정:

2번 설정 : 재화를 설정

돈의 이름과 돈의 가치 그리고, 돈을 무한(Unlimnit)대로 설정한다.

3번 설정

4번 설정 : 인 게임 재화로 무언가를 하는것
1가차 티켓 = 100쌀

5번 설정은 skip한다.

6번 설정: Publish한다.

7번 설정: skip
최종 결과




using UnityEngine;
using UnityEngine.UI;
using Unity.Services.Core;
using Unity.Services.Economy;
using Unity.Services.Authentication;
using Unity.Services.Economy.Model;
using System.Linq;
public class UGSManager : MonoBehaviour
{
[SerializeField]
Text userIDInfo;
[SerializeField]
Text ssalInfo;
async void Start() //비동기 함수여야만 await(비동기) 사용 가능
{
await UnityServices.InitializeAsync(); //전체 초기화
await AuthenticationService.Instance.SignInAnonymouslyAsync(); //계정을 따로 안만들고 로그인. 기기에 종속
if(AuthenticationService.Instance.IsSignedIn) //로그인 됐을 경우
{
userIDInfo.text = "Player ID : " + AuthenticationService.Instance.PlayerId; //PlayerId는 유니티가 게스트 로그인하면 알려줌
GetCurrency();
}
else //로그인 안됏을 경우
{
Debug.Log("로그인 실패 ㅠ");
}
}
//Economy 관련
async void GetCurrency()
{
GetBalancesResult result = await EconomyService.Instance.PlayerBalances.GetBalancesAsync();
foreach(var balance in result.Balances)
{
Debug.Log(balance.CurrencyId + ":" + balance.Balance);
}
ssalInfo.text = result.Balances.Single(balance => balance.CurrencyId == "SSAL").Balance.ToString();
}
}

using UnityEngine;
using UnityEngine.UI;
using Unity.Services.Core;
using Unity.Services.Economy;
using Unity.Services.Authentication;
using Unity.Services.Economy.Model;
using System.Linq;
public class UGSManager : MonoBehaviour
{
[SerializeField]
Text userIDInfo;
[SerializeField]
Text ssalInfo;
async void Start() //비동기 함수여야만 await(비동기) 사용 가능
{
await UnityServices.InitializeAsync(); //전체 초기화
await AuthenticationService.Instance.SignInAnonymouslyAsync(); //계정을 따로 안만들고 로그인. 기기에 종속
if(AuthenticationService.Instance.IsSignedIn) //로그인 됐을 경우
{
userIDInfo.text = "Player ID : " + AuthenticationService.Instance.PlayerId; //PlayerId는 유니티가 게스트 로그인하면 알려줌
GetCurrency();
}
else //로그인 안됏을 경우
{
Debug.Log("로그인 실패 ㅠ");
}
}
//Economy 관련
async void GetCurrency()
{
GetBalancesResult result = await EconomyService.Instance.PlayerBalances.GetBalancesAsync();
foreach(var balance in result.Balances)
{
Debug.Log(balance.CurrencyId + ":" + balance.Balance);
}
ssalInfo.text = result.Balances.Single(balance => balance.CurrencyId == "SSAL").Balance.ToString();
}
public void GetSsalPressed()
{
AddSsal(100);
}
async void AddSsal(int amount)
{
GetBalancesResult result = await EconomyService.Instance.PlayerBalances.GetBalancesAsync();
long currentSsal = result.Balances.Single(balance => balance.CurrencyId == "SSAL").Balance;
await EconomyService.Instance.PlayerBalances.SetBalanceAsync("SSAL", currentSsal + amount);
GetCurrency();
}
}

실행 시, 버튼을 누를 때 마다 100씩 증가한다.

using UnityEngine;
using UnityEngine.UI;
using Unity.Services.Core;
using Unity.Services.Economy;
using Unity.Services.Authentication;
using Unity.Services.Economy.Model;
using System.Linq;
public class UGSManager : MonoBehaviour
{
//..생략
[SerializeField]
Text gachatTicketInfo;
//..생략
//Economy 관련
async void GetCurrency()
{
GetBalancesResult result = await EconomyService.Instance.PlayerBalances.GetBalancesAsync();
foreach(var balance in result.Balances)
{
Debug.Log(balance.CurrencyId + ":" + balance.Balance);
}
ssalInfo.text = result.Balances.Single(balance => balance.CurrencyId == "SSAL").Balance.ToString();
}
//..생략
public async void PurchaseGachaTicket() //버튼 이벤트로 추가.
{
MakeVirtualPurchaseResult result = await EconomyService.Instance.Purchases.MakeVirtualPurchaseAsync("SSALTOTHETICKET");
GetCurrency();
}
}

실행 시, 버튼을 누르면 Crystal을 가져간다.

using UnityEngine;
using UnityEngine.UI;
using Unity.Services.Core;
using Unity.Services.Economy;
using Unity.Services.Authentication;
using Unity.Services.Economy.Model;
using System.Linq;
using NUnit.Framework;
using System.Collections.Generic;
public class UGSManager : MonoBehaviour
{
[SerializeField]
Text userIDInfo;
[SerializeField]
Text ssalInfo;
[SerializeField]
Text gachatTicketInfo;
//1번@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
List<PlayersInventoryItem> items = new List<PlayersInventoryItem>(); //PlayersInventoryItem을 리스트로 관리한다.
//..생략
//Economy 관련
async void GetCurrency()
{
GetBalancesResult result = await EconomyService.Instance.PlayerBalances.GetBalancesAsync();
foreach(var balance in result.Balances)
{
Debug.Log(balance.CurrencyId + ":" + balance.Balance);
}
ssalInfo.text = result.Balances.Single(balance => balance.CurrencyId == "SSAL").Balance.ToString();
//아이템을 보여주는 코드
//2번@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
items.Clear(); //클리어 하지 않으면 계속 쌓인다.
var invenResult = await EconomyService.Instance.PlayerInventory.GetInventoryAsync();
items.AddRange(invenResult.PlayersInventoryItems);
int counter = 0;
foreach(var item in items)
{
if(item.InventoryItemId == "GACHATICKET")//인벤토리 아이디가 GachaTicket 라면 ,
//GachaTicket -> 유니티 클라우드에 인벤토리 아이디가 GachaTicket여야함
{
counter++;
}
}
gachatTicketInfo.text = counter.ToString();
}
//..생략
}



using UnityEngine;
using UnityEngine.UI;
using Unity.Services.Core;
using Unity.Services.Economy;
using Unity.Services.Authentication;
using Unity.Services.Economy.Model;
using System.Linq;
using NUnit.Framework;
using System.Collections.Generic;
using System.Threading.Tasks;
public class UGSManager : MonoBehaviour
{
[SerializeField]
Text userIDInfo;
[SerializeField]
Text ssalInfo;
[SerializeField]
Text gachatTicketInfo;
List<PlayersInventoryItem> items = new List<PlayersInventoryItem>();
async void Start() //비동기 함수여야만 await(비동기) 사용 가능
{
//..생략
}
//Economy 관련
async void GetCurrency()
{
//..생략
//아이템을 보여주는 코드
await FetchAllInventoryItems(); //1. FetchAllInventoryItems() 호출
int counter = 0;
foreach(var item in items)
{
if(item.InventoryItemId == "GACHATICKET")//인벤토리 아이디가 GachaTicket 라면 ,
//GachaTicket -> 유니티 클라우드에 인벤토리 아이디가 GachaTicket여야함
{
Debug.Log("ㅇㅁ");
counter++;
}
}
gachatTicketInfo.text = counter.ToString();
}
async Task FetchAllInventoryItems()
{
items.Clear();
GetInventoryOptions options = new GetInventoryOptions
{
ItemsPerFetch = 20 //기본은 20개로 가져오도록 하고
};
try
{
var invenResult = await EconomyService.Instance.PlayerInventory.GetInventoryAsync(options); //GetInventoryAsync () : 유니티가 우리한테 20개씩 줌
items.AddRange(invenResult.PlayersInventoryItems);
//20개를 가져오다가
while(invenResult.HasNext) //아이템이 더 있다면
{
invenResult = await invenResult.GetNextAsync(); //더 가져오기
items.AddRange(invenResult.PlayersInventoryItems);
}
}
catch(RequestFailedException e)
{
Debug.Log(e);
}
}
public void GetSsalPressed()
{
AddSsal(100);
}
async void AddSsal(int amount)
{
//..생략
}
public async void PurchaseGachaTicket() //구매하는 코드
{
//..생략
}
}




UnityServices.InitializeAsync(): Unity 게임 서비스를 초기화합니다.
AuthenticationService.Instance.SignInAnonymouslyAsync(): 게스트 계정으로 로그인합니다.
EconomyService.Instance.PlayerBalances.GetBalancesAsync(): 플레이어의 재화 잔액을 조회합니다.
EconomyService.Instance.PlayerBalances.SetBalanceAsync(): 플레이어의 특정 재화의 잔액을 설정합니다.
EconomyService.Instance.PlayerInventory.GetInventoryAsync(): 플레이어의 인벤토리 아이템을 조회합니다.
EconomyService.Instance.Purchases.MakeVirtualPurchaseAsync(): 가상 아이템을 구매합니다.
[SerializeField]
Text userIDInfo;
async void Start() //비동기 함수여야만 await(비동기) 사용 가능
{
await UnityServices.InitializeAsync(); //전체 초기화
await AuthenticationService.Instance.SignInAnonymouslyAsync(); //게스트 계정으로 로그인. 기기에 종속
if(AuthenticationService.Instance.IsSignedIn) //로그인 됐을 경우
{
userIDInfo.text = "Player ID : " + AuthenticationService.Instance.PlayerId; //PlayerId는 유니티가 게스트 로그인하면 알려줌
GetCurrency();
}
else //로그인 안됏을 경우
{
Debug.Log("로그인 실패 ㅠ");
}
}
async void GetCurrency()
{
GetBalancesResult result = await EconomyService.Instance.PlayerBalances.GetBalancesAsync();
foreach(var balance in result.Balances)
{
Debug.Log(balance.CurrencyId + ":" + balance.Balance);
}
ssalInfo.text = result.Balances.Single(balance => balance.CurrencyId == "SSAL").Balance.ToString();
//아이템을 보여주는 코드
await FetchAllInventoryItems();
int counter = 0;
foreach(var item in items)
{
if(item.InventoryItemId == "GACHATICKET")//인벤토리 아이디가 GachaTicket 라면 ,
//GachaTicket -> 유니티 클라우드에 인벤토리 아이디가 GachaTicket여야함
{
Debug.Log("ㅇㅁ");
counter++;
}
}
gachatTicketInfo.text = counter.ToString();
}
async Task FetchAllInventoryItems()
{
items.Clear();
GetInventoryOptions options = new GetInventoryOptions
{
ItemsPerFetch = 20
};
try
{
var invenResult = await EconomyService.Instance.PlayerInventory.GetInventoryAsync(options); //GetInventoryAsync () : 유니티가 우리한테 20개씩 줌
items.AddRange(invenResult.PlayersInventoryItems);
//20개를 가져오다가
while (invenResult.HasNext) //아이템이 더 있다면
{
invenResult = await invenResult.GetNextAsync(); //더 가져오기
items.AddRange(invenResult.PlayersInventoryItems);
}
}
catch (RequestFailedException e)
{
Debug.Log(e);
}
}
public void GetSsalPressed() // 재화 얻는 버튼이벤트
{
AddSsal(100);
}
async void AddSsal(int amount)
{
GetBalancesResult result = await EconomyService.Instance.PlayerBalances.GetBalancesAsync();
long currentSsal = result.Balances.Single(balance => balance.CurrencyId == "SSAL").Balance;
await EconomyService.Instance.PlayerBalances.SetBalanceAsync("SSAL", currentSsal + amount);
GetCurrency();
}
public async void PurchaseGachaTicket() // 재화 팔고 돈을 얻는 버튼이벤트
{
MakeVirtualPurchaseResult result = await EconomyService.Instance.Purchases.MakeVirtualPurchaseAsync("SSALTOTHETICKET");
GetCurrency();
}
재화의 잔액을 조회하거나 추가하는 작업이 GetCurrency, AddSsal 메서드에서 이루어집니다.
SetBalanceAsync 메서드는 특정 재화의 잔액을 직접 설정합니다.
플레이어의 아이템 목록을 FetchAllInventoryItems 메서드에서 가져옵니다.
20개씩 아이템을 조회하며, 더 조회할 아이템이 있다면 가져옵니다.
long currentSsal = result.Balances.Single(balance => balance.CurrencyId == "SSAL").Balance;








데이터를 가져올 때, 즉, 세이브 할 때 딕셔너리 방식으로 가져온다. => data의 타입이 딕셔너리

만약 데이터가 없다면 , 딕셔너리.Count == 0 이라면 데이터를 추가해줘야 할 것이다.

using System;
using UnityEngine;
[Serializable] //저장 가능하게 만듦
public class LevelData
{
public int playerLevel;
public int exp;
}
놀랍겠지만 이게 끝이다. 저장하고 싶은 것이 있다면 더 추가해도 된다.
[SerializeField]
Text playerDataInfo;
LevelData levelData;
async void LoadFromCloud()
{
try
{
var data = await CloudSaveService.Instance.Data.Player.LoadAllAsync(); //플레이어와 관계된 데이터를 다 가져옴
//세이브할 때는 딕셔너리 방식으로 저장을 한다. 그러므로 데이터가 없을 때 Count가 0이 된다.
Debug.Log(data); //아무것도 데이터가 없기 때문에 뜨질 않음.
if(data.Count == 0) //데이터가 없을 때 데이터를 추가하도록 하자.
{
SaveToCloud();
}
}
catch(Exception e)
{
}
}
async void SaveToCloud()
{
if(levelData == null) //레벨 데이타가 없다면
{
levelData = new LevelData
{
playerLevel = 1,
exp = 0
}; //위 코드처럼 초기화한다.
}
var data = new Dictionary<string, object> //데이터가 없으면 만들어서라도 세이브한다.
{
{"Player",levelData }
};
try
{
await CloudSaveService.Instance.Data.Player.SaveAsync(data);
}
catch (CloudSaveException e)
{
Debug.LogError(e.ToString());
}
}


if(levelData == null) //레벨 데이타가 없다면
{
levelData = new LevelData
{
playerLevel = 1,
exp = 0
}; //위 코드처럼 초기화한다.
}

var data = new Dictionary<string, object> //데이터가 없으면 만들어서라도 세이브한다.
{
{"Player",levelData }
};
try
{
await CloudSaveService.Instance.Data.Player.SaveAsync(data);
}
catch (CloudSaveException e)
{
Debug.LogError(e.ToString());
}
[SerializeField]
Text playerDataInfo;
LevelData levelData;
async void LoadFromCloud()
{
try
{
var data = await CloudSaveService.Instance.Data.Player.LoadAllAsync(); //플레이어와 관계된 데이터를 다 가져옴
//세이브할 때는 딕셔너리 방식으로 저장을 한다. 그러므로 데이터가 없을 때 Count가 0이 된다.
Debug.Log(data); //아무것도 데이터가 없기 때문에 뜨질 않음.
if(data.Count == 0) //데이터가 없을 때 데이터를 추가하도록 하자.
{
SaveToCloud();
}
else //⭐추가 데이터가 있다면.
{
data.TryGetValue("Player", out var playerDataJson);
levelData = playerDataJson.Value.GetAs<LevelData>();
UpdateLevelData();
}
}
catch(Exception e)
{
}
}
async void SaveToCloud()
{
if(levelData == null) //레벨 데이타가 없다면
{
levelData = new LevelData
{
playerLevel = 1,
exp = 0
}; //위 코드처럼 초기화한다.
UpdateLevelData(); //⭐추가
}
var data = new Dictionary<string, object> //데이터가 없으면 만들어서라도 세이브한다.
{
{"Player",levelData }
};
try
{
await CloudSaveService.Instance.Data.Player.SaveAsync(data);
}
catch (CloudSaveException e)
{
Debug.LogError(e.ToString());
}
}
void UpdateLevelData() //⭐추가
{
playerDataInfo.text = "Player Level : " + levelData.playerLevel + "\nExp : " + levelData.exp;
}

data.TryGetValue("Player", out var playerDataJson); //결과: playerDataJson에 JSON 형식의 데이터가 저장됩니다.
levelData = playerDataJson.Value.GetAs<LevelData>();

void UpdateLevelData()
{
playerDataInfo.text = "Player Level : " + levelData.playerLevel + "\nExp : " + levelData.exp;
}
✅ data.TryGetValue("Player", out var playerDataJson); 에서 out 키워드를 사용한 이유

이름 설정





Entries 는 현재 순위를 알려줌. 아직은 아무것도 없음.


async void GetCurrency()
{
//..생략
AddScore(ssal);
//..생략
}
public async void AddScore(long ssal)
{
var scoreResponse = await LeaderboardsService.Instance.AddPlayerScoreAsync("SSAlSUNWI", ssal); //순위 추가하기
GetScores();
}
public async void GetScores()
{
var scoreResponse = await LeaderboardsService.Instance.GetScoresAsync("SSAlSUNWI"); //스코어 받아오기
Debug.Log(JsonConvert.SerializeObject(scoreResponse));
}


var scoreResponse = await LeaderboardsService.Instance.AddPlayerScoreAsync("SSAlSUNWI", ssal); //순위 추가하기
public async void AddScore(long ssal)
{
var scoreResponse = await LeaderboardsService.Instance.AddPlayerScoreAsync("SSAlSUNWI", ssal); //순위 추가하기
GetScores();
}
var scoreResponse = await LeaderboardsService.Instance.GetScoresAsync("SSAlSUNWI"); //스코어 받아오기
Debug.Log(JsonConvert.SerializeObject(scoreResponse));
async void Start() //비동기 함수여야만 await(비동기) 사용 가능
{
//..생략
if(AuthenticationService.Instance.IsSignedIn) //로그인 됐을 경우
{
userIDInfo.text = "Player ID : " + AuthenticationService.Instance.PlayerId; //PlayerId는 유니티가 게스트 로그인하면 알려줌
//⭐ 닉네임 설정
await AuthenticationService.Instance.UpdatePlayerNameAsync("KimJin");
//..생략
}
else //로그인 안됏을 경우
{
Debug.Log("로그인 실패 ㅠ");
}
}


추가로, Deployment 패키지도 다운로드 한다.


Preferences에도 생겼다.









C# 파일도 있다.

해당 파일을 열면 아래처럼 나타난다.


결과

SayHello가 생겼다.


using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
using Unity.Services.CloudCode.Apis;
using Unity.Services.CloudCode.Core;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
namespace HelloWorld;
public class MyModule
{
ILogger<MyModule> logger; // 로그 찍는데 사용
public MyModule(ILogger<MyModule> logger)
{
this.logger = logger;
}
// Hello 함수를 서버에서 부를 때는 SayHello 함수로 불러주세요
[CloudCodeFunction("SayHello")]
public string Hello(string name)
{
return $"Hello, {name}!";
}
[CloudCodeFunction("GetGacha")]
public async Task<string> GetGacha(IExecutionContext context, IGameApiClient apiClient)
{
//IGameApiClient apiClient; // UGS 기능들을 쓰는 데 사용
var result = await apiClient.CloudSaveData.GetItemsAsync(context, context.AccessToken, context.ProjectId, context.PlayerId,
new List<string> { "Player" });
string savedData = result.Data.Results.First().Value.ToString();
logger.LogDebug(savedData);
return savedData;
}
public class ModuleConfig : ICloudCodeSetup
{
// apiClient를 사용하려면 이 클래스를 작성해주어야 합니다.
public void Setup(ICloudCodeConfig config)
{
config.Dependencies.AddSingleton(GameApiClient.Create());
}
}
}


using System;
using TMPro;
using UnityEngine;
using Unity.Services.Core;
using Unity.Services.Authentication;
using Unity.Services.Economy;
using System.Linq;
using Unity.Services.Economy.Model;
using System.Collections.Generic;
using System.Threading.Tasks;
using Unity.Services.CloudSave;
using UnityEngine.SocialPlatforms.Impl;
using Unity.Services.Leaderboards;
using Newtonsoft.Json;
using Unity.Services.CloudCode;
using Unity.Services.CloudCode.GeneratedBindings;
using UnityEngine.UI;
public class UGSManager : MonoBehaviour
{
[SerializeField]
Text userIdTmp;
[SerializeField]
Text ssalTmp;
[SerializeField]
Text gachaTicketTmp;
[SerializeField]
Text playerDataTmp;
List<PlayersInventoryItem> items = new List<PlayersInventoryItem>();
LevelData levelData;
async void Start()
{
// 유니티 서비스를 이용하기 전 초기화
await UnityServices.InitializeAsync();
// 게스트 로그인 구현, 이 기기로 로그인 하면 같은 계정으로 인식
await AuthenticationService.Instance.SignInAnonymouslyAsync();
if (AuthenticationService.Instance.IsSignedIn)
{
// 로그인 성공시
userIdTmp.text = "Player ID : " + AuthenticationService.Instance.PlayerId;
// Player Name 변경
await AuthenticationService.Instance.UpdatePlayerNameAsync("Nell");
CallCloudFunction();
}
else
{
// 로그인 실패시 초기 화면으로 돌아간다.
Debug.Log("");
}
}
async void CallCloudFunction()
{
// 서버에서 함수 호출
try
{
//var module = new CloudCodeReferenceBindings(CloudCodeService.Instance);
//var result = await module.SayHello(" World");
var module = new CloudCodeReferenceBindings(CloudCodeService.Instance);
var result = await module.GetGacha();
Debug.Log("cloud code result : " + result);
}
catch (CloudCodeException e)
{
Debug.Log(e.Message);
}
}
}
- 모든 유저에게 적용되는 설정파일
- 게임 밸런스 및 게임 전체 설정
- Cloud Code에서 저장하고 수정 가능
- 월드 세이브 데이터







publish를 한다.

다운로드 버튼을 누르면




{
"title": "Gacha Probability",
"$id": "#gacha-Probability",
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "가챠 확률표",
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"factor": {
"type": "number"
}
},
"required": ["name", "factor"]
}
}


10 . 만들고 나면 아래처럼 내가 설정한 대로 나온다.





using HelloWorld;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Unity.Services.CloudCode.Apis;
using Unity.Services.CloudCode.Core;
namespace CloudCodeReference
{
internal class GachaManager
{
// CloudCodeReference 경로에 class를 추가하면
// 서버의 가챠 데이터와 유니티의 UGSManager 코드를 불러올 수 있다.
// 이 파일은 Example.cs에서 불러와 사용할 예정
ILogger<MyModule> logger;
IGameApiClient apiClient;
[Serializable]
internal class GachaItem
{
// 서버에 저장된 JSON 데이터를 불러온다.
public string Name { get; set; }
public string Factor { get; set; }
}
public GachaManager(ILogger<MyModule> logger, IGameApiClient apiClient)
{
this.logger = logger;
this.apiClient = apiClient;
}
public async Task<string> DoGacha(IExecutionContext context)
{
var result = await apiClient.RemoteConfigSettings.AssignSettingsGetAsync(
context,
context.AccessToken,
context.ProjectId,
context.EnvironmentId,
null,
new List<string> { "GachaProbabilityTable" });
List<GachaItem> items =
JsonConvert.DeserializeObject<List<GachaItem>>(
result.Data.Configs.Settings["GachaProbabilityTable"].ToString());
foreach(GachaItem item in items)
{
logger.LogDebug(item.Name + " " + item.Factor);
}
return "";
}
}
}
[CloudCodeFunction("GetGacha")]
public async Task<string> GetGacha(IExecutionContext context, IGameApiClient apiClient)
{
//IGameApiClient apiClient; // UGS 기능들을 쓰는 데 사용
var result = await apiClient.CloudSaveData.GetItemsAsync(context, context.AccessToken, context.ProjectId, context.PlayerId,
new List<string> { "Player" });
string savedData = result.Data.Results.First().Value.ToString();
logger.LogDebug(savedData);
return savedData;
}




using Microsoft.Extensions.Logging;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Unity.Services.CloudCode.Apis;
using Unity.Services.CloudCode.Core;
using Unity.Services.CloudSave;
namespace HelloWorld
{
public class MyModule
{
ILogger<MyModule> logger; // 로그 찍는데 쓸거임
IGameApiClient apiClient; // UGS 기능들을 쓰는 데 쓸거임
public MyModule(IGameApiClient apiClient, ILogger<MyModule> logger)
{
this.apiClient = apiClient;
this.logger = logger;
}
[CloudCodeFunction("SayHello")]
public string Hello(string name)
{
return $"Hello, {name}!";
}
[CloudCodeFunction("GetGacha")]
public async Task<string> GetGacha(IExecutionContext context)
{
var result = await apiClient.CloudSaveData.GetItemsAsync(context, context.AccessToken, context.ProjectId, context.PlayerId,
new List<string> { "Player" });
string savedData = result.Data.Results.First().Value.ToString();
logger.LogDebug(savedData);
return savedData;
}
}
}





using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Unity.Services.CloudCode.Apis;
using Unity.Services.CloudCode.Core;
using Unity.Services.CloudCode;
namespace CloudeCodeReference
{
internal class GachaManager
{
ILogger<MyModule> logger; // 로그 찍는데 쓸거임
IGameApiClient apiClient;
[Serializable]
internal class GachaItem
{
public string Name
{
get;
set;
}
public string Factor
{
get;
set;
}
}
public GachaManager(ILogger<MyModule> logger,IGameApiClient apiClient)
{
this.logger = logger;
this.apiClient = apiClient;
}
public async Task<string> DoGacha(IExecutionContext context)
{
var result = apiClient.RemoteConfigSettings.AssignSettingsGetAsync(
context, context.AccessToken, context.ProjectId, context.EnvironmentId, null, new List<string> { "GachaProbabilityTable" });
List<GachaItem> Items = JsonConvert.DeserializeObject<List<GachaItem>>(result.Result.Data.Configs.Settings["GachaProbabilityTable"].ToString());
foreach(GachaItem item in Items)
{
logger.LogDebug(item.Name + "" + item.Factor);
}
return " ";
}
}
}
