# 사용 사례 샘플: 플레이어에게 새해 인사 전하기

> Send a push notification to all users on January 1st at 00:00:00 UTC wishing them a happy new year.

이 샘플은 1월 1일 00:00:00(UTC)에 모든 사용자에게 새해 인사를 전하는 푸시 알림을 보내기 위한 일정을 설정하는 방법을 보여 줍니다.

> **Note:**
>
> **참고:** Cloud Code 모듈에서만 [푸시 메시지](/cloud-code/modules/how-to-guides/push-messages.md)를 사용할 수 있습니다.

## 필수 조건##prerequisites

먼저 필요한 액세스 역할로 서비스 계정을 생성하고 [UGS CLI](https://services.docs.unity.com/guides/ugs-cli/latest/general/get-started/install-the-cli/)를 구성해야 합니다.

### 서비스 계정을 사용하여 인증##authenticate-using-a-service-account

Scheduling 및 Triggers 서비스를 호출하려면 먼저 서비스 계정을 사용하여 인증해야 합니다.

1. [Unity Dashboard](https://cloud.unity.com)로 이동합니다.
2. **Administration** > **Service Accounts**를 선택합니다.
3. **New** 버튼을 선택하고 서비스 계정의 이름과 설명을 입력합니다.
4. **Create**를 선택합니다.

다음과 같이 제품 역할을 추가하고 키를 만듭니다.

1. **Manage product roles**를 선택합니다.
2. 다음 역할을 서비스 계정에 추가합니다.
   * LiveOps 드롭다운에서 **Triggers Configuration Editor**, **Triggers Configuration Viewer**, **Scheduler Configuration Editor**, **Scheduler Configuration Viewer**를 선택합니다.
   * Admin 드롭다운에서 **Unity Environments Viewer**를 선택합니다.
3. **Save**를 선택합니다.
4. **Add Key**를 선택합니다.
5. base64 인코딩을 사용하여 **Key ID**와 **Secret key**를 인코딩합니다. 포맷은 ‘key\_id:secret\_key’입니다. 이 값을 기록해 둡니다.

자세한 내용은 [인증](../../authentication)을 참고하십시오.

### 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. 이전에 생성한 서비스 계정을 사용하여 인증합니다. [인증 받기](https://services.docs.unity.com/guides/ugs-cli/latest/general/get-started/get-authenticated/)를 참고하십시오.

## Cloud Code 설정##set-up-cloud-code

순위가 떨어진 플레이어에게 푸시 알림을 보내는 모듈 엔드포인트를 정의합니다.

아래와 같은 내용으로 `WishHappyNewYear` 모듈 함수를 생성합니다.

```csharp
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Unity.Services.CloudCode.Apis;
using Unity.Services.CloudCode.Core;
using Unity.Services.CloudCode.Shared;

namespace WishHappyNewYear;

public class HappyNewYear
{
    private readonly ILogger<HappyNewYear> _logger;

    public HappyNewYear(ILogger<HappyNewYear> logger)
    {
        _logger = logger;
    }

    [CloudCodeFunction("SendProjectMessage")]
    public async Task SendProjectMessage(IExecutionContext context, PushClient pushClient, string message, string messageType)
    {
        try
        {
            await pushClient.SendProjectMessageAsync(context, message, messageType);
        }
        catch (ApiException e)
        {
            _logger.LogError("Failed to send project message. Error: {Error}",  e.Message);
            throw new Exception($"Failed to send project message. Error: {e.Message}");
        }
    }

}

public class ModuleConfig : ICloudCodeSetup
{
    public void Setup(ICloudCodeConfig config)
    {
        config.Dependencies.AddSingleton(PushClient.Create());

    }
}
```

모듈을 배포합니다.

모듈을 배포하는 방법을 알아보려면 [Hello World 배포](/cloud-code/modules/getting-started.md#deploy-the-module)를 참고하십시오.

> **Note:**
>
> **참고:** UGS CLI를 사용하여 모듈을 배포하는 경우 서비스 계정 역할 `Cloud Code Editor`를 추가해야 합니다.

## 이벤트 일정 예약##schedule-an-event

Cloud Code를 정의한 후 1월 1일 00:00:00(UTC)에 모든 사용자에게 새해 인사를 전하는 푸시 알림을 보내기 위한 일정을 생성할 수 있습니다.

`new-file` 커맨드를 실행하여 로컬에서 일정 구성을 생성합니다.

```bash
ugs scheduler new-file schedule-config
```

다음 구성을 사용하여 `schedule-config.sched` 파일을 업데이트합니다.

```json
{
  "$schema": "https://ugs-config-schemas.unity3d.com/v1/schedules.schema.json",
  "Configs": {
    "wish-happy-new-year": {
      "EventName": "send-announcement",
      "Type": "one-time",
      "Schedule": "2025-01-01T00:00:00Z",
      "PayloadVersion": 1,
      "Payload": "{\"message\": \"Happy New Year!\", \"messageType\": \"HappyNewYear\"}"
    }
  }
}
```

다음과 같이 UGS CLI 툴을 사용하여 구성을 배포합니다.

```bash
ugs deploy schedule-config.sched
```

올바른 응답은 다음과 유사합니다.

```text
Deployed:
    schedule-config.sched
```

## 트리거 구성##configure-a-trigger

Cloud Code 모듈을 스케줄러 이벤트에 연결하려면 트리거를 생성합니다. 1월 1일 00:00:00(UTC)에 이벤트가 발생하면 트리거가 Cloud Code 모듈을 실행합니다.

`new-file` 커맨드를 실행하여 로컬에서 트리거 구성을 생성할 수 있습니다.

```bash
ugs triggers new-file triggers-config
```

다음 구성을 사용하여 `triggers-config.tr` 파일을 업데이트합니다.

```json
{
  "$schema": "https://ugs-config-schemas.unity3d.com/v1/triggers.schema.json",
  "Configs": [
    {
      "Name": "happy-new-year",
      "EventType": "com.unity.services.scheduler.send-announcement.v1",
      "ActionUrn": "urn:ugs:cloud-code:WishHappyNewYear/SendProjectMessage",
      "ActionType": "cloud-code"
    }
  ]
}
```

다음과 같이 UGS CLI 툴을 사용하여 구성을 배포합니다.

```bash
ugs deploy triggers-config.tr
```

다음과 유사한 응답이 표시됩니다.

```text
Deployed:
    triggers-config.tr
```

이제 1월 1일 00:00:00(UTC)에 스케줄러 이벤트가 발생할 때 Cloud Code 모듈 함수를 실행하는 트리거를 만들었습니다.

## 결과 확인##validate-the-result

결과를 확인하려면 푸시 메시지를 구독하는 Unity 프로젝트를 설정합니다.

> **Note:**
>
> **참고:** 이벤트를 테스트하려면 `one-time` 필드의 타임스탬프를 더 가까운 시간으로 변경해야 할 수 있습니다.

### 필수 조건##prerequisites

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

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

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

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 설치##sdkinstallation

다음 단계를 따라 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 패키지 관리자 인터페이스를 익혀 두십시오.

> **Note:**
>
> Cloud Code SDK 버전 2.4.0 이상에서 메시지를 구독할 수 있습니다.

### `Monobehaviour` 스크립트 생성##create-a-monobehaviour-script

프로젝트 레벨 메시지를 구독하려면 `Monobehaviour` 스크립트를 설정합니다.

자세한 내용은 [푸시 메시지 전송](/cloud-code/modules/how-to-guides/push-messages.md)을 참고하십시오.

`MonoBehaviour` 스크립트 아래의 다음 샘플 코드를 사용할 수 있습니다.

```csharp
using System;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Unity.Services.Authentication;
using Unity.Services.CloudCode;
using Unity.Services.CloudCode.Subscriptions;
using Unity.Services.Core;
using UnityEngine;

namespace CloudCode
{
	public class CloudCodePushExample : MonoBehaviour
	{
    	async void Start()
        {
            await UnityServices.InitializeAsync();
            await AuthenticationService.Instance.SignInAnonymouslyAsync();
            Debug.Log(AuthenticationService.Instance.PlayerId);
            await SubscribeToProjectMessages();
        }

        // This method creates a subscription to project messages and logs out the messages received,
        // the state changes of the connection, when the player is kicked and when an error occurs.
        Task SubscribeToProjectMessages()
        {
            var callbacks = new SubscriptionEventCallbacks();
            callbacks.MessageReceived += @event =>
            {
                Debug.Log(DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ss.fffK"));
                Debug.Log($"Got project subscription Message: {JsonConvert.SerializeObject(@event, Formatting.Indented)}");
            };
            callbacks.ConnectionStateChanged += @event =>
            {
                Debug.Log($"Got project subscription ConnectionStateChanged: {JsonConvert.SerializeObject(@event, Formatting.Indented)}");
            };
            callbacks.Kicked += () =>
            {
                Debug.Log($"Got project subscription Kicked");
            };
            callbacks.Error += @event =>
            {
                Debug.Log($"Got project subscription Error: {JsonConvert.SerializeObject(@event, Formatting.Indented)}");
            };
            return CloudCodeService.Instance.SubscribeToProjectMessagesAsync(callbacks);
        }
}
```

Unity 에디터에서 모듈 실행 시 전송되는 푸시 메시지를 확인할 수 있습니다.

```yaml
Got project subscription Message: {
  "data_base64": <BASE64-ENCODED-DATA>,
  "time": "2023-09-27T16:01:46.468321794Z",
  "message": "Happy new year!",
  "specversion": "1.0",
  "id": <ID>,
  "source": "https://cloud-code.service.api.unity.com",
  "type": "com.unity.services.cloud-code.push.v1",
  "projectid": <PROJECT-ID>,
  "environmentid": <ENVIRONMENT-ID>,
  "correlationid": <CORRELATION-ID>,
  "messagetype": "announcement"
}
```
