# 수동 워크플로

> Create a C# module manually with control over the module deployment process.

이 섹션에서는 프로젝트에서 C# 모듈을 생성하는 데 필요한 단계를 설명합니다.

> **Important:**
>
> **중요**: 수동 워크플로는 모듈을 생성하고 배포하는 상세한 접근 방식입니다. 이 워크플로는 모듈 배포 프로세스를 더 많이 제어해야 하는 고급 사례에 적합합니다. 대부분의 사용 사례에서 [Unity 에디터](./write-modules/unity-editor.md)나 [UGS CLI](./write-modules/cli.md)를 사용하여 경험을 한층 간소화할 수 있습니다. 빠르게 시작하려면 [시작하기](../getting-started) 가이드를 참고하십시오.

Cloud Code 모듈을 시작하려면 다음 단계를 따라야 합니다.

1. [.NET 프로젝트 생성:](#create-a-net-project) Cloud Code 모듈은 게임 클라이언트가 호출할 수 있는 엔드포인트를 공개하는 단순한 .NET 프로젝트입니다.
2. [Cloud Code Authoring 패키지 임포트:](#import-the-cloud-code-authoring-package) Cloud Code Authoring 패키지를 설치하여 호출 가능한 엔드포인트를 만듭니다.
3. [프로젝트 내부에 모듈 엔드포인트 생성:](#create-a-module-endpoint) 게임 클라이언트에서 호출할 수 있는 게임 로직을 정의합니다.
4. [코드 패키징:](#package-code) 프로젝트용 어셈블리를 생성하고 아카이브로 패키징합니다.
5. [프로젝트 배포:](#deploy-a-module-project) Cloud Code 서비스에 아카이브를 배포합니다.
6. [모듈 엔드포인트 호출:](#call-a-module-function-from-your-game) 게임 클라이언트에서 모듈 엔드포인트를 호출합니다.

### .NET 프로젝트 생성##create-a-net-project

Cloud Code 모듈은 게임 클라이언트가 호출할 수 있는 엔드포인트를 공개하는 단순한 .NET 프로젝트입니다. 시작하려면 선택한 IDE에서 새 .NET 프로젝트를 만듭니다. Cloud Code 모듈의 구조에 대해 자세히 알아보려면 [모듈 구조](./module-structure.md)를 참고하십시오.

다음 섹션에서는 JetBrains Rider와 Microsoft Visual Studio IDE에서 프로젝트를 만드는 방법을 설명합니다.

#### JetBrains Rider##jetbrains-rider

다음 단계를 따라 JetBrains Rider에서 새 프로젝트를 만듭니다.

1. **File** > **New**를 선택합니다.
2. Class Library로 **.NET Core** 또는 **.NET Framework**를 선택합니다.
3. 모듈의 이름을 지정합니다.
4. **Create**를 선택합니다.

#### Microsoft Visual Studio##microsoft-visual-studio

다음 단계를 따라 Microsoft Visual Studio에서 새 프로젝트를 만듭니다.

1. **File** > **New Solution**을 선택합니다.
2. .Net Class Library를 선택합니다.
3. **Next**를 선택합니다.
4. 모듈의 이름을 지정합니다.
5. **Create**를 선택합니다.

### Cloud Code Authoring 패키지 임포트##import-the-cloud-code-authoring-package

Cloud Code 모듈은 .NET 프로젝트이므로 [NuGet 패키지 관리자](https://docs.microsoft.com/en-us/nuget/what-is-nuget)를 사용하여 종속성을 관리합니다.

호출 가능한 엔드포인트를 만들려면 Cloud Code 모듈에 Cloud Code Authoring 패키지가 필요합니다. 이 패키지는 프로젝트에 설치할 수 있는 NuGet 패키지입니다.

다음 섹션에서는 IDE에 따라 패키지를 임포트하는 방법을 설명합니다.

#### JetBrains Rider##jetbrains-rider

다음 단계에 따라 JetBrains Rider를 사용하여 Cloud Code Authoring 패키지를 설치합니다.

1. **Tools** > **NuGet** > **Show NuGet Packages**를 선택합니다.
2. `Com.Unity.Services.CloudCode.Core`를 검색합니다.
3. 최신 버전을 프로젝트에 설치합니다.

#### Microsoft Visual Studio##microsoft-visual-studio

다음 단계에 따라 Microsoft Visual Studio를 사용하여 Cloud Code Authoring 패키지를 설치합니다.

1. 프로젝트를 오른쪽 클릭하고 **Manage NuGet Packages**를 선택합니다.
2. `Com.Unity.Services.CloudCode.Core`를 검색합니다.
3. **Add Package**를 선택합니다.

### 모듈 엔드포인트 생성##create-a-module-endpoint

C# 모듈 내에서 엔드포인트를 만들려면 외부에서 호출 가능한 함수를 생성한 다음 `CloudCodeFunction` 속성을 부여하고 공개 이름을 지정해야 합니다.

함수 이름을 다르게 지정하면 게임 클라이언트에서 기존에 호출하던 함수를 변경하지 않고 나중에 코드를 리팩터링할 수 있습니다.

모듈 함수의 간단한 다음 예시를 레퍼런스로 사용할 수 있습니다. 이 예시에서는 `name`이라는 문자열 파라미터를 사용하여 문자열을 반환하는 `SayHello`라는 모듈 엔드포인트를 만듭니다.

```cs
using Unity.Services.CloudCode.Core;

namespace ExampleModule;

public class MyModule
{
    [CloudCodeFunction("SayHello")]
    public string Hello(string name)
    {
        return $"Hello, {name}!";
    }
}
```

### 코드 패키징##package-code

모듈을 배포하려면 먼저 코드를 아카이브로 패키징해야 합니다.

이 아카이브에는 Cloud Code 서비스에서 모듈을 실행하는 데 필요한 어셈블리가 포함되어야 합니다.

이러한 어셈블리를 생성하려면 [프로젝트를 퍼블리시](https://learn.microsoft.com/en-us/dotnet/core/deploying/deploy-with-cli)합니다.

`linux-x64` 타겟 런타임에 대한 어셈블리를 빌드해야 합니다. 성능을 향상시키려면 `ReadyToRun` 컴파일을 활성화합니다.

* 어셈블리 생성 방법에 관한 자세한 내용은 [코드 패키징](./package-code.md)을 참고하십시오.
* 이 프로세스를 자동화하는 방법에 관한 자세한 내용은 [로컬 배포 자동화](./automate-local-deployment.md)를 확인하시기 바랍니다.

아래 단계를 따라 어셈블리를 생성하도록 IDE를 구성합니다.

#### JetBrains Rider##jetbrains-rider

아래 단계를 따라 JetBrains Rider IDE를 사용하여 어셈블리를 생성합니다.

1. **Run** > **Edit Configurations**를 선택합니다.
2. **+** 를 선택합니다.
3. **Publish to folder**를 선택합니다.
4. 구성의 이름을 지정합니다.
5. **Target location**을 빌드 출력을 저장할 위치로 설정합니다.
6. **Release | Any CPU** 구성을 선택합니다.
7. **linux-x64** 타겟 런타임을 선택합니다.
8. (선택 사항) **Enable ReadyToRun compilation**을 활성화합니다.
9. **Apply**를 선택합니다.

#### Microsoft Visual Studio##microsoft-visual-studio

아래 단계를 따라 Microsoft Visual Studio IDE를 사용하여 어셈블리를 생성합니다.

1. 솔루션을 오른쪽 클릭한 다음 **Publish**를 선택합니다.
2. 화면에 표시된 단계에 따라 파일을 로컬에 저장합니다.
3. **Show All Settings**를 선택합니다.
4. 타겟 런타임을 **linux-x64**로 설정합니다.
5. **Save**를 선택합니다.
6. **Publish**를 선택합니다.

#### 어셈블리 압축##zip-the-assemblies

기본적으로 퍼블리시 프로세스를 통해 루트 프로젝트 디렉토리의 `bin/Release/net6.0/linux-x64/publish` 경로 아래에 폴더가 생성됩니다. 이 폴더의 콘텐츠를 아카이브로 압축해야 합니다.

[UGS CLI를 사용하여 모듈을 배포](./write-modules/cli.md#deploy-modules)하려는 경우에는 아카이브의 확장자를 .ccm으로 변경하는 것이 좋습니다.

> **Note:**
>
> **참고**: Windows의 파일 탐색기를 사용하는 경우 [일반 파일 이름 확장자](https://support.microsoft.com/en-us/windows/common-file-name-extensions-in-windows-da4a4430-8e76-89c5-59f7-1cdbbc75cb01)를 활성화하여 아카이브의 확장자를 .ccm으로 변경해야 합니다.

Unix 시스템에서 다음 커맨드를 실행합니다.

`zip ExampleModule.ccm *`

Windows 시스템에서 다음 커맨드를 실행합니다.

`zip -r ExampleModule.ccm path/to/your/project/bin/Release/net6.0/linux-x64/publish/*`

### 모듈 프로젝트 배포##deploy-a-module-project

모듈 엔드포인트에서 게임 클라이언트에 액세스할 수 있도록 하려면 Cloud Code 서비스에 아카이브를 배포해야 합니다.

모듈 배포에 대해 자세히 알아보려면 [모듈 작성](./write-modules.md)을 참고하십시오.

UGS CLI를 사용하여 배포하려면 아카이브 파일 확장자를 .ccm으로 변경해야 합니다.

#### UGS CLI 구성##configure-the-ugs-cli

다음 단계를 따라 UGS CLI를 시작합니다.

1. [UGS CLI를 설치합니다](https://services.docs.unity.com/guides/ugs-cli/latest/general/get-started/install-the-cli/).
2. 다음 커맨드를 사용하여 프로젝트 ID와 환경을 구성합니다.
   `ugs config set project-id <your-project-id>`
   `ugs config set environment-name <your-environment-name>`
3. [Cloud Code](https://services.docs.unity.com/docs/service-account-auth/index.html#cloud-code-editor)와 [환경 관리](https://services.docs.unity.com/docs/service-account-auth/index.html#unity-environments-admin)에 필요한 역할을 사용하여 서비스 계정을 구성합니다. [인증 받기](https://services.docs.unity.com/guides/ugs-cli/latest/general/get-started/get-authenticated/)를 참고하십시오.

#### 모듈 배포##deploy-the-module

모듈을 배포하려면 다음 커맨드를 실행합니다.

`ugs deploy <path-to-ccm-file>`

### 게임에서 모듈 함수 호출##call-a-module-function-from-your-game

모듈을 배포하고 나면 게임 클라이언트에서 모듈 함수를 호출할 수 있습니다.

#### 필수 조건##prerequisites

Unity 에디터에서 Cloud Code를 사용하려면 먼저 Cloud Code SDK를 설치하고 [Unity Gaming Services 프로젝트](/cloud/projects.md)를 Unity 에디터에 연결해야 합니다.

##### 프로젝트 연결##link-project

Unity Dashboard에서 UGS 프로젝트 ID를 확인할 수 있습니다. 다음 단계에 따라 [Unity Gaming Services 프로젝트](/cloud/projects.md)를 Unity 에디터와 연결합니다.

1. Unity 에디터에서 **Edit** > **Project Settings** > **Services**를 선택합니다.

2. 프로젝트를 연결합니다.
   프로젝트에 Unity 프로젝트 ID가 없는 경우 다음 단계를 진행합니다.

   1. **Create a Unity Project ID** > **Organizations**를 선택한 다음 드롭다운에서 조직을 선택합니다.
   2. **Create project ID**를 선택합니다.

   Unity 프로젝트 ID가 있는 경우 다음 단계를 진행합니다.

   1. **Use an existing Unity project ID**를 선택합니다.
   2. 드롭다운에서 조직과 프로젝트를 선택합니다.
   3. **Link project ID**를 선택합니다.

Unity 프로젝트 ID가 표시되고 이제 Unity 서비스에 프로젝트가 연결됩니다. `UnityEditor.CloudProjectSettings.projectId`를 사용하여 Unity 에디터 스크립트에서 프로젝트 ID에 액세스할 수도 있습니다.

##### SDK 설치##sdk-installation

다음 단계를 따라 Unity 에디터용 최신 Cloud Code 패키지를 설치합니다.

1. Unity 에디터에서 **Window** > **Package Manager**를 엽니다.
2. Package Manager에서 **Unity Registry** 목록 뷰를 선택합니다.
3. `com.unity.services.cloudcode`를 검색하거나 목록에서 Cloud Code 패키지를 찾습니다.
4. 패키지를 선택하고 **Install**을 클릭합니다.

> **Note:**
>
> **참고**: Unity 패키지 관리자 인터페이스를 익히려면 [Package Manager 창](https://docs.unity3d.com/Manual/upm-ui.html)(Unity 매뉴얼)을 참고하십시오.

##### SDK 설정##sdk-setup

다음 단계를 따라 Cloud Code SDK를 시작합니다.

1. [Unity Dashboard](https://cloud.unity.com)의 Cloud Code 페이지를 통해 서비스를 활성화합니다.
2. Cloud Code와 Authentication SDK를 모두 설치합니다.
3. **Edit** > **Project Settings** > **Services**를 선택하여 Unity 에디터 내에서 클라우드 프로젝트에 로그인합니다.
4. Unity 에디터에서 새 C# Monobehaviour 스크립트를 생성합니다. Unity 매뉴얼의 [스크립트 생성 및 사용](https://docs.unity3d.com/Manual/CreatingAndUsingScripts.html)을 참고하십시오.
5. 스크립트에서 await `UnityServices.InitializeAsync()`를 사용하여 Core SDK를 초기화합니다.
6. 스크립트에서 Authentication SDK를 초기화합니다.

> **Note:**
>
> **참고**: Cloud Code 서비스에 액세스하려면 플레이어에게 유효한 플레이어 ID와 액세스 토큰이 있어야 합니다. Cloud Code API를 사용하려면 먼저 Authentication SDK로 플레이어를 인증해야 합니다. 다음 코드 스니핏을 사용하여 익명으로 인증하거나 [Authentication](./authentication.md) SDK 기술 자료에서 자세한 내용과 기타 로그인 방법을 확인할 수 있습니다.

\###**C#**

```cs
await AuthenticationService.Instance.SignInAnonymouslyAsync();
```

#### 모듈 함수 호출##call-a-module-function

게임 클라이언트에서 모듈 함수를 호출하려면 호출을 인증하고 [Services Core SDK를 초기화](/services/getting-started.md#initialize-unity-services-in-your-game-code)한 다음 서비스 기능을 호출하고 모듈 함수를 호출해야 합니다.

게임 클라이언트를 사용하여 모듈을 호출하는 방법에 대한 자세한 내용은 [Unity Runtime에서 모듈 실행](./run-modules/unity-runtime.md)을 참고하십시오.

아래 단계를 따라 모듈 함수를 호출합니다.

1. Services Core SDK를 초기화합니다. Cloud Code를 호출하기 전에 Services Core 네임스페이스(`Unity.Services.Core`)를 임포트하여 게임 코드에서 Unity 서비스를 초기화한 다음 `InitializeAsync` 메서드를 호출합니다.
2. 호출을 인증합니다. Cloud Code 서비스에 액세스하려면 Cloud Code에 대한 각 호출을 인증해야 하며 플레이어에게 유효한 플레이어 ID와 액세스 토큰이 있어야 합니다. [인증](./authentication.md)을 참고하십시오. `SignInAnonymouslyAsync` 메서드를 호출하여 익명 인증으로 시작하는 것이 좋습니다.
3. 모듈 함수를 호출합니다. Cloud Code SDK를 통해 `CallEndpointModuleAsync` 메서드를 사용하여 모듈 함수를 호출합니다.

> **Note:**
>
> **참고**: `CallEndpointModuleAsync` 함수는 Cloud Code SDK 버전 2.3.0 이상에서 사용할 수 있습니다.

##### 연동 샘플##integration-sample

다음은 게임 클라이언트 내에 있는 `ExampleModule` 모듈에서 `SayHello` 모듈 함수를 호출하는 방법의 예시입니다.

*C#*

```cs
using System.Collections.Generic;
using Unity.Services.Authentication;
using Unity.Services.CloudCode;
using Unity.Services.Core;
using UnityEngine;

public class TestModule : MonoBehaviour
{
    private async void Start()
    {
        // Initialize the Unity Services Core SDK
        await UnityServices.InitializeAsync();

        // Authenticate by logging into an anonymous account
        await AuthenticationService.Instance.SignInAnonymouslyAsync();

        try
        {
            // Call the function within the module and provide the parameters we defined in there
            string result = await CloudCodeService.Instance.CallModuleEndpointAsync("ExampleModule", "SayHello", new Dictionary<string, object> {{"name", "World"}});

            Debug.Log(result);
        }
        catch (CloudCodeException exception)
        {
            Debug.LogException(exception);
        }
    }
}
```

> **Important:**
>
> **중요**: 모듈 함수를 처음 호출하면 응답을 시작하기까지 시간이 다소 걸릴 수 있습니다. 타임아웃을 수신하면 콘솔에 `Hello, World!`가 출력될 때까지 코드를 다시 실행합니다.
