기술 자료

지원

Cloud Code

Cloud Code

모듈 구조

Understand the structure of a Cloud Code module project and how it exposes endpoints.
읽는 시간 4분최근 업데이트: 14시간 전

Cloud Code 모듈은 게임 클라이언트가 호출할 수 있는 엔드포인트를 공개하는 단순한 .NET 프로젝트입니다. 모듈은 .NET 클래스 라이브러리와 유사한 패러다임을 채택합니다. 예를 들어 일반적인 C# 클래스는 다음과 같은 형태를 띱니다.
namespace ModulesExample;public class Example{ private static string[] GetCheatCodes() { return new string[] { "LEAVEMEALONE", "ASPIRINE", "BIGBANG" }; } public void ChangeHaircut(string haircutName) { }}
컴파일하고 나면
Example
클래스에 대한 모든 레퍼런스에서
ChangeHaircut()
메서드만 사용할 수 있습니다.
using ModulesExample;class UsageExample{ public void GameLoop() { Example.ChangeHaircut("buzzcut"); // Compile error "Cannot access private method 'GetCheatCodes()' here" var cheatCodes = Example.GetCheatCodes(); }}
그러면 개발자가 액세스 한정자를 통해 라이브러리 인터페이스를 선택할 수 있습니다. Cloud Code 모듈도 동일한 방식으로 작동하나, 대신
[CloudCodeFunction("ChangeHaircut")]
속성을 사용합니다.
Cloud Code 모듈을 사용하면 독립적인 서버 권한이 있는 라이브러리를 생성할 수 있습니다. 이를 통해 서버에서 게임 로직을 실행하고 클라이언트에서 호출함으로써 클라이언트로부터 게임 로직을 분리하여 보안을 강화할 수 있습니다. 모듈에서는 코드 재사용이 가능하며 게임 로직을 관리하는 데 사용할 수 있는 인터페이스가 제공됩니다.

C# 프로젝트

Cloud Code 모듈 프로젝트는 클래스 라이브러리 C# 프로젝트이며, 프로젝트는 솔루션의 일부가 될 수도 있습니다. 가장 단순한 프로젝트 구조는 다음과 같습니다.
├─ Main.csproj└─ Dependencies└─ HelloWorld.cs
또는 솔루션 안에서는 다음과 같을 수 있습니다.
Sample.sln├─ Main.csproj └─ Dependencies └─ HelloWorld.cs
솔루션에는 서로를 참조하는 여러 프로젝트가 포함될 수 있습니다. 이를 통해 테스트 프로젝트를 쉽게 추가하고 코드를 재사용할 수 있습니다. 아래 예시는 유효한 프로젝트 구조를 보여 줍니다.
Sample.sln├─ Main.csproj └─ Dependencies └─ HelloWorld.cs├─ Tests.csproj └─ Dependencies └─ Tests.cs├─ Other.csproj └─ Dependencies └─ Class1.cs
하지만 Cloud Code 함수는 메인 프로젝트에만 포함할 수 있습니다. Cloud Code 모듈의 유닛 테스트를 작성하는 방법을 자세히 알아보려면 유닛 테스트 작성을 참고하십시오. 적용되는 스토리지 제한 사항을 확인하려면 Cloud Code 제한을 참고하십시오.

메인 프로젝트

솔루션에 여러 C# 프로젝트가 포함될 수 있지만 메인 프로젝트는 모듈당 하나만 있을 수 있습니다. 메인 프로젝트에는 모든 모듈 진입점(
CloudCodeFunction
속성을 사용한 함수)이 포함됩니다.
메인 프로젝트는 Cloud Code 서비스에 배포하는 프로젝트이기도 합니다. 메인 프로젝트에서 Cloud Code 서비스에 대해 참조되지 않은 프로젝트와 종속성은 배포하지 않습니다. 메인 프로젝트의 이름을 Cloud Code 서비스에 배포하는 아카이브의 이름과 일치시켜야 합니다.

샘플 프로젝트

가장 단순한 모듈 프로젝트에는 다음 구조가 포함될 수 있습니다.
Sample.sln├─ Main.csproj └─ Dependencies └─ HelloWorld.cs
아래 샘플은 문자열
Hello World!
를 반환하는 단일 함수
Hello
를 사용하여 Cloud Code 모듈을 정의합니다.
using Unity.Services.CloudCode.Core;namespace Sample;public class HelloWorld{ [CloudCodeFunction("Hello")] public string PrintHello() { return "Hello World!"; }}

Cloud Code NuGet 패키지

.NET 프로젝트로서 Cloud Code 모듈 프로젝트도 NuGet을 사용하여 패키징 코드를 공유합니다. NuGet에 대해 자세히 알아보려면 Microsoft 기술 자료를 참고하십시오. Cloud Code는 모듈에 포함할 수 있는 다음 두 패키지를 제공합니다.
  • com.Unity.Services.CloudCode.Core
    : 이 패키지에는
    CloudCodeFunction
    속성을 포함하여 Cloud Code의 핵심 기능이 포함되어 있습니다. 모든 Cloud Code 모듈에는 이 패키지가 필요합니다.
  • com.Unity.Services.CloudCode.Apis
    : Cloud Code 서비스와 상호 작용하는 데 사용할 수 있는 Unity Gaming Services API가 포함된 선택적 패키지입니다. 이 패키지를 사용하여 Cloud Save 등 다른 Cloud Code SDK를 호출할 수 있습니다.
자세한 내용은 Jetbrains Rider 또는 Visual Studio를 통해 프로젝트에서 NuGet 패키지를 설치하고 사용하는 방법에 관한 기술 자료를 참고하십시오.

코드 구조

다음 가이드라인을 따라 코드 구조와 관련된 문제를 피합니다.

CloudCodeFunction 속성

메서드를 Cloud Code 함수로 표시하고 실행 가능한 Cloud Code 모듈 엔드포인트로 만들려면
CloudCodeFunction
속성을 사용합니다. 모듈의 메인 클래스에서만 Cloud Code 함수 속성을 사용할 수 있습니다.
함수를 호출하려면 속성 이름을 호출해야 합니다.

메서드 서명

모듈 함수의 메서드 서명에 아래 구조를 사용합니다.
[CloudCodeFunction("FunctionName")]public async Task<ReturnType> FunctionName(IGameApiClient gameApiClient, IExecutionContext ctx, string parameter1, string parameter2){ ...}

모듈에 싱글톤 패턴 사용

Cloud Code C# 패키지 및 외부 서비스 호출과 연동하기 위해 싱글톤 패턴을 사용할 수 있습니다. 싱글톤 패턴을 사용하면 Cloud Code의 성능과 확장성이 개선되며 동일한 오브젝트의 인스턴스를 여러 개 생성하지 않아도 됩니다. 종속성 삽입을 사용하여
IGameApiClient
IPushClient
인터페이스를 모듈에 삽입할 수 있습니다.

파라미터에서 전달

파라미터에서 모듈 함수에 전달할 수 있습니다.

기본형 및 복합형

여기에는
int
,
string
,
bool
,
float
등의 기본형은 물론
List<T>
,
Dictionary<T>
,
Dictionary<string, T>
등의 복합형이 포함됩니다.
예를 들어
string
List<string>
에서 모듈 함수에 전달할 수 있습니다.
{ "params": { "parameter1": "a", "parameter2": ["b", "c"] }}
동일한 파라미터로 모듈 함수를 정의합니다.
[CloudCodeFunction("SimpleParams")]public async Task SimpleParams(IExecutionContext ctx, string parameter1, List<string> parameter2){ return parameter1 + parameter2[0] + parameter2[1];}

커스텀 유형

모듈 프로젝트에서 정의한 커스텀 유형에서 전달할 수도 있습니다. 예를 들어 JSON 객체에서 모듈 오브젝트에 전달할 수 있습니다.
{ "params": { "player": { "name": "player", "health": 50, "stamina": 20, "inventory": { "count": 5, "weight": 20 } } }}
모듈 프로젝트에서
Player
클래스와
Inventory
클래스, 함수를 정의합니다.
public class Player{ public string Name { get; set; } public int Health { get; set; } public int Stamina { get; set; } public Inventory Inventory { get; set; }}public class Inventory{ public int Count { get; set; } public int Weight { get; set; }}[CloudCodeFunction("CustomParams")]public async Task<string> CustomParams(IExecutionContext ctx, Player player){ return $"{player.Name} has {player.Health} health and {player.Stamina} stamina and {player.Inventory.Count} items in their inventory with a total weight of {player.Inventory.Weight}";}

가용 인터페이스

Cloud Code 모듈은
IGameApiClient
,
IAdminApiClient
,
IPushClient
,
IExecutionContext
인터페이스를 사용하여 모듈의 기능을 확장할 수 있습니다.
ICloudCodeSetup
인터페이스를 사용하면 모듈의 종속성을 관리할 수 있습니다. 자세한 내용은 종속성 삽입 기술 자료에서 알아보십시오.

IGameApiClient 인터페이스

IGameApiClient
인터페이스에서 Cloud Code C# Client SDK에 액세스할 수 있습니다. 종속성 삽입을 사용하여
IGameApiClient
를 모듈에 삽입할 수 있습니다.
  1. 다음과 같이
    ICloudCodeSetup
    인터페이스를 구현하는 클래스를 정의하고
    GameApiClient
    를 싱글톤으로 추가합니다.
    public class ModuleConfig : ICloudCodeSetup{ public void Setup(ICloudCodeConfig config) { config.Dependencies.AddSingleton(GameApiClient.Create()); }}
  2. IGameApiClient
    인터페이스를 함수 파라미터로 모듈 함수에 전달합니다.

IAdminApiClient 인터페이스

IAdminApiClient
인터페이스에서 Cloud Code C# Admin SDK에 액세스할 수 있습니다. 종속성 삽입을 사용하여
IAdminApiClient
를 모듈에 삽입할 수 있습니다.
  1. 다음과 같이
    ICloudCodeSetup
    인터페이스를 구현하는 클래스를 정의하고
    AdminApiClient
    를 싱글톤으로 추가합니다.
    public class ModuleConfig : ICloudCodeSetup{ public void Setup(ICloudCodeConfig config) { config.Dependencies.AddSingleton(AdminApiClient.Create()); }}
  2. IAdminApiClient
    인터페이스를 함수 파라미터로 모듈 함수에 전달합니다.

IPushClient 인터페이스

IPushClient
인터페이스에서 푸시 알림을 플레이어에게 보낼 수 있습니다. 종속성 삽입을 사용하여
IPushClient
를 모듈에 삽입할 수 있습니다.
  1. 다음과 같이
    ICloudCodeSetup
    인터페이스를 구현하는 클래스를 정의하고
    PushClient
    를 싱글톤으로 추가합니다.
    public class ModuleConfig : ICloudCodeSetup{ public void Setup(ICloudCodeConfig config) { config.Dependencies.AddSingleton(PushClient.Create()); }}
  2. PushClient
    오브젝트를 함수 파라미터로 모듈 함수에 전달합니다.
Cloud Code에서 푸시 메시지를 보내는 방법을 자세히 알아보려면 푸시 메시지를 참고하십시오.

IExecution 컨텍스트

모듈 내에서 다른 UGS 서비스에 대한 호출을 생성하기 위해
IExecutionContext
인터페이스를 사용하여 현재 호출에 대한 추가 정보를 가져올 수 있습니다. 아래 값을 사용해 service SDK에 액세스하여 요청을 생성하는 플레이어를 확인할 수 있습니다.
  • ProjectId
    : 호출자가 인증을 받은 프로젝트 ID입니다.
  • PlayerId
    : 스크립트를 실행한 플레이어 ID입니다. 참고: 서비스에서 스크립트를 호출하는 경우 플레이어 ID를 사용할 수 없습니다.
  • EnvironmentId
    : 모듈의 환경 ID입니다.
  • EnvironmentName
    : 모듈의 환경 이름입니다.
  • AccessToken
    : 플레이어가 Cloud Code에서 인증하는 데 사용한 JWT(JSON 웹 토큰) 자격 증명입니다.
  • UserId
    : 서비스 계정의 사용자 ID입니다. (참고: 서비스가 스크립트를 호출하는 경우 사용자 ID를 사용할 수 없습니다.)
  • Issuer
    : 발급자 또는 서비스 계정 토큰입니다. (참고: 플레이어가 스크립트를 호출하는 경우 발급자를 사용할 수 없습니다.) 예를 들어 Multiplay가 호출을 생성하는 경우 발급자는
    multiplay
    입니다.
  • ServiceToken
    : Cloud Code 서비스 계정 JWT 자격 증명입니다.
  • AnalyticsUserId
    : 플레이어의 Analytics 사용자 ID입니다. (참고: 서비스가 스크립트를 호출하는 경우 Analytics 사용자 ID를 사용할 수 없습니다.)
  • UnityInstallationId
    : 플레이어의 Unity 디바이스 설치 ID입니다. (참고: 서비스가 스크립트를 호출하는 경우 Unity 설치 ID를 사용할 수 없습니다.)
실행 컨텍스트를 사용하여 플레이어 ID를 확보하고 다른 Unity Gaming Services로 인증할 수 있습니다. 클래스 생성자 그리고
CloudCodeFunction
속성을 사용한 모든 메서드를 통해 실행 컨텍스트를 얻을 수 있습니다.
예를 들어 다음과 같이 실행 컨텍스트를 사용해 Cloud Save를 호출하여 플레이어 키를 가져올 수 있습니다.
using Microsoft.Extensions.DependencyInjection;using Microsoft.Extensions.Logging;using Unity.Services.CloudCode.Apis;using Unity.Services.CloudCode.Core;using Unity.Services.CloudCode.Shared;namespace Sample;public class HelloWorld{ private static ILogger<HelloWorld> _logger; public CloudSaveSdkSample(ILogger<HelloWorld> logger) { _logger = logger; } [CloudCodeFunction("GetData")] public async Task<object> GetData(IExecutionContext context, IGameApiClient gameApiClient, string key) { try { var result = await gameApiClient.CloudSaveData.GetItemsAsync(context, context.AccessToken, context.ProjectId, context.PlayerId, new List<string> { key }); return result.Data.Results.First().Value; } catch (ApiException ex) { _logger.LogError("Failed to get data from Cloud Save. Error: {Error}", ex.Message); throw new Exception($"Failed to get data for playerId {ctx.PlayerId}. Error: {e.Message}"); } } public class ModuleConfig : ICloudCodeSetup { public void Setup(ICloudCodeConfig config) { config.Dependencies.AddSingleton(GameApiClient.Create()); } }}

토큰 인증

AccessToken
ServiceToken
JWT이며 인터페이스의
IExecutionContext
프로퍼티입니다.
이 토큰을 사용하여 Cloud Code에서 다른 Unity Gaming Services로의 호출을 인증할 수 있습니다.

토큰 유형

출처

데이터 액세스

사용

accessToken
Authentication 서비스 에서 생성인증된 플레이어만
AccessToken
은 Cloud Code 호출을 인증하는 데 사용하는 JWT입니다. 인증된 플레이어의 데이터에 액세스하기 위해 다른 UGS 서비스에 이 토큰을 전달할 수 있습니다.
serviceToken
Cloud Code에서 생성크로스 플레이어 데이터 액세스
ServiceToken
은 다른 UGS 서비스를 호출하고 크로스 플레이어 데이터와 상호 작용하는 데 사용하는 토큰입니다.
사용자가 구성한 모든 액세스 제어 규칙은
AccessToken
에 영향을 미칩니다.
아래 샘플은
AccessToken
을 사용하여 Cloud Save로 인증된 플레이어 데이터에 액세스하는 방법을 보여 줍니다.
using Microsoft.Extensions.DependencyInjection;using Unity.Services.CloudCode.Apis;using Unity.Services.CloudCode.Core;using Unity.Services.CloudCode.Shared;using Unity.Services.CloudSave.Model;namespace TokenSample;public class TokenSample{ [CloudCodeFunction("GetKeysForAuthenticatedPlayer")] public Task<ApiResponse<GetKeysResponse>> GetPlayerKeys(IExecutionContext ctx, IGameApiClient gameApiClient) { try { // Using ctx.AccessToken to access the data for the player calling the function return gameApiClient.CloudSaveData.GetKeysAsync(ctx, ctx.AccessToken, ctx.ProjectId, ctx.PlayerId); } catch (ApiException e) { throw new Exception($"Failed to get keys for playerId {ctx.PlayerId}. Error: {e.Message}"); } } public class ModuleConfig : ICloudCodeSetup { public void Setup(ICloudCodeConfig config) { config.Dependencies.AddSingleton(GameApiClient.Create()); } }}
모든 플레이어의 데이터에 액세스하려면 다음과 같이
ServiceToken
을 사용하고
playerId
의 파라미터를 전달합니다.
using Microsoft.Extensions.DependencyInjection;using Unity.Services.CloudCode.Apis;using Unity.Services.CloudCode.Core;using Unity.Services.CloudCode.Shared;using Unity.Services.CloudSave.Model;namespace TokenSample;public class TokenSample{ [CloudCodeFunction("GetKeysForAnyPlayer")] public Task<ApiResponse<GetKeysResponse>> GetPlayerKeys(IExecutionContext ctx, IGameApiClient gameApiClient, string playerId) { try { // Using ctx.ServiceToken to access the data for any player return gameApiClient.CloudSaveData.GetKeysAsync(ctx, ctx.ServiceToken, ctx.ProjectId, playerId); } catch (ApiException e) { throw new Exception($"Failed to get keys for playerId {ctx.PlayerId}. Error: {e.Message}"); } } public class ModuleConfig : ICloudCodeSetup { public void Setup(ICloudCodeConfig config) { config.Dependencies.AddSingleton(GameApiClient.Create()); } }}
두 토큰의 차이점에 대한 자세한 설명은 서비스 및 액세스 토큰 기술 자료를 참고하십시오.

Cloud Code 모듈 메타데이터

Cloud Code 모듈과 해당 메타데이터를 가져오기 위해
GET
요청을 Cloud Code 서비스에 보낼 수 있습니다. 응답은 다음 구조의 JSON 객체입니다.
{ "name": "string", "language": "CS", "tags": { "property1": "string", "property2": "string" }, "signedDownloadURL": "string", "dateCreated": "2022-04-05T09:12:13Z", "dateModified": "2022-04-05T09:12:13Z"}

태그

태그는 Cloud Code 모듈에 연결할 수 있는 키-값 페어입니다. 모듈 버전, 작성자 또는 버전 관리를 사용하는 경우 커밋 해시와 같이 태그에 포함하려는 어떤 정보든 기록할 수 있습니다. 모듈에는 최대 10개의 태그를 저장할 수 있으며, 태그 키 및 태그 값당 사용할 수 있는 최대 글자 수는 128자입니다.

서명된 다운로드 URL

서명된 다운로드 URL은 모듈 아카이브를 다운로드하는 데 사용할 수 있는 임시 URL입니다.