# ユースケースサンプル: プレイヤーに新年の挨拶をする

> 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 設定編集者)、**Triggers Configuration Viewer** (Triggers 設定閲覧者)、**Scheduler Configuration Editor** (Scheduler 設定編集者)、**Scheduler Configuration Viewer** (Scheduler 設定閲覧者) を選択します。
   * Admin (管理者) ドロップダウンから **Unity Environments Viewer** (Unity 環境閲覧者) を選択します。
3. **Save** (保存) を選択します。
4. **Add Key** (キーの追加) を選択します。
5. base64 エンコードを使用して **Key ID** (キー ID) と **Secret key** (秘密鍵) をエンコードします。形式は "key\_id:secret\_key" です。この値をメモしておきます。

詳細については、[Authentication](../../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 エディターにリンクします。UGS プロジェクト ID は [Unity Dashboard](https://cloud.unity.com) にあります。

1. Unity エディターで、**Edit** (編集) > **Project Settings** (プロジェクト設定) > **Services** (サービス) を選択します。

2. プロジェクトをリンクします。

* プロジェクトに Unity プロジェクト ID がない場合:

1. **Create a Unity Project ID** (Unity プロジェクト ID の作成) > **Organizations** (組織) の順に選択し、ドロップダウンメニューから組織を選択します。
2. **Create project ID** (プロジェクト ID を作成) を選択します。

* 既存の Unity プロジェクト ID がある場合:

1. **Use an existing Unity project ID** (既存の Unity プロジェクト ID を使用) を選択します。
2. ドロップダウンメニューから組織とプロジェクトを選択します。
3. **Link project ID** (プロジェクト ID をリンク) を選択します。

Unity プロジェクト ID が表示され、プロジェクトが Unity サービスにリンクされました。また、`UnityEditor.CloudProjectSettings.projectId` を使用して Unity エディタースクリプトのプロジェクト ID にアクセスすることもできます。

#### SDK のインストール##sdkinstallation

Unity エディターの最新の Cloud Code パッケージをインストールするには、以下を行います。

1. Unity エディターで、**Window** (ウィンドウ) > **Package Manager** (パッケージマネージャー) を開きます。
2. Package Manager で、**Unity Registry** (Unity レジストリ) のリストビューを選択します。
3. `com.unity.services.cloudcode` を検索するか、リストから Cloud Code パッケージを探します。
4. このパッケージを選択し、**Install** (インストール) をクリックします。

> **Note:**
>
> [Unity - マニュアル: Package Manager ウィンドウ](https://docs.unity3d.com/Manual/upm-ui.html) を参照し、Unity Package Manager インターフェースについて理解してください。

> **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"
}
```
