プッシュメッセージの送信
Push messages to clients over a WebSocket connection from Cloud Code modules.
読み終わるまでの所要時間 5 分最終更新 23日前
Cloud Code C# モジュールでは、WebSocket を介してメッセージをクライアントにプッシュできます。このページでは、この機能の概要と、Cloud Code モジュールおよび Cloud Code SDK で使用する方法について説明します。
プッシュメッセージを送信するには、モジュールエンドポイントを呼び出す必要があります。Unity エディターからプッシュメッセージをサブスクライブできます。
ユースケースと利点
プッシュメッセージは、以下のようなさまざまな目的に使用できます。用途 | 例 | 利点 |
|---|---|---|
| サーバーからクライアントにリアルタイムでメッセージをプッシュし、ゲームのインタラクティビティを強化します。 | ゲームイベント、更新、非同期マルチプレイヤーゲーム (例えば、競争型カードゲームなど) についてプレイヤーに通知できます。 | リアルタイムインタラクション |
| 更新と通知をクライアントに直接プッシュすることにより、ゲーム内の最新のイベント、変更、またはアクションでユーザーを最新に保ちます。 | 新しいデータが使用可能になるとすぐにユーザーに通知できるため、手動でリフレッシュしたり、更新を確認したりする必要がありません。これは、リアルタイムストラテジーゲームなど、頻繁な更新が必要なゲームで特に役立つ可能性があります。 | ユーザー体験 |
| WebSocket を使用して、従来のポーリング手法よりも効率よくメッセージをプッシュします。 | クライアントは、新しいデータについて継続的にサーバーに尋ねるかわりに、新しいデータが使用可能になったときに、サーバーがそれを送信するのを待つことができます。これにより、不必要なネットワークトラフィックが削減され、待ち時間の短縮につながる可能性があります。 | 効率的なネットワーク使用状況 |
| プッシュモデルのスケーラビリティを使用して、ユーザー数の多いゲームをサポートします。 | Cloud Code でプッシュメッセージを使用して、接続されているすべてのクライアントに更新を一度に送信し、プレイヤー数の多いマルチプレイヤーゲームの運用コストとリクエストの量を削減できます。 | スケーラビリティとコスト |
| イベント主導モデルでさまざまなタイプのメッセージへのゲームのレスポンスをカスタマイズします。 | 受信したメッセージの MessageType プロパティに基づいて異なるゲームアクションをトリガーできます。 | カスタマイズ可能性 |
| Unity エコシステムの一部として、Cloud Code の使用は他の Unity サービスとシームレスに行われます。 | Unity の Authentication サービスでプレイヤー認証を処理し、Unity ゲームエンジン内でメッセージを処理できます。 | シームレスなインテグレーション |
モジュールの作成
以下のコード例は、2 つのメソッドを含むモジュールの基本構造を示します。- : 特定の接続済みプレイヤーにメッセージを送信します。
SendPlayerMessage - : プロジェクト内のすべての接続済みプレイヤーにメッセージをブロードキャストします。
SendProjectMessage
Unity.Services.CloudCode.ApisPushClientモジュールのデプロイ方法を学習するには、Hello World のデプロイ ページを参照してください。using Microsoft.Extensions.DependencyInjection;using Unity.Services.CloudCode.Core;using Unity.Services.CloudCode.Apis;namespace PushExample{ public class PushExample { [CloudCodeFunction("SendPlayerMessage")] public async Task<string> SendPlayerMessage(IExecutionContext context, PushClient pushClient, string message, string messageType, string playerId) { var response = await pushClient.SendPlayerMessageAsync(context, message, messageType, playerId); return "Player message sent"; } // Recommended to use access control to limit access to this endpoint [CloudCodeFunction("SendProjectMessage")] public async Task<string> SendProjectMessage(IExecutionContext context, PushClient pushClient, string message, string messageType) { var response = await pushClient.SendProjectMessageAsync(context, message, messageType); return "Project message sent"; } } public class ModuleConfig : ICloudCodeSetup { public void Setup(ICloudCodeConfig config) { config.Dependencies.AddSingleton(PushClient.Create()); } }}
Unity エディターの設定
Cloud Code SDK は、メッセージをサブスクライブするためのインターフェースを提供します。特定のプレイヤーまたはプロジェクト全体のメッセージをサブスクライブできます。 Unity エディターで Cloud Code を使用するには、最初に Cloud Code SDK をインストールし、Unity Gaming Services プロジェクト を Unity エディターにリンクする必要があります。プロジェクトのリンク
Unity Gaming Services プロジェクト を Unity エディターにリンクします。UGS プロジェクト ID は Unity Cloud Dashboard にあります。- Unity エディターで、Edit (編集) > Project Settings (プロジェクト設定) > Services (サービス) の順に選択します。
-
プロジェクトをリンクします。
プロジェクトに Unity プロジェクト ID がない場合:- Create a Unity Project ID (Unity プロジェクト ID の作成) > Organizations (組織) の順に選択し、ドロップダウンから組織を選択します。
- Create project ID (プロジェクト ID を作成) を選択します。
既存の Unity プロジェクト ID がある場合:- Use an existing Unity project ID (既存の Unity プロジェクト ID を使用) を選択します。
- ドロップダウンから組織とプロジェクトを選択します。
- Link project ID (プロジェクト ID をリンク) を選択します。
UnityEditor.CloudProjectSettings.projectIdSDK のインストール
Unity エディターの最新の Cloud Code パッケージをインストールします。- Unity エディターで、Window (ウィンドウ) > Package Manager (パッケージマネージャー) を開きます。
- Package Manager で、Unity Registry (Unity レジストリ) のリストビューを選択します。
- を検索するか、リストから Cloud Code パッケージを探します。
com.unity.services.cloudcode - このパッケージを選択し、Install (インストール) をクリックします。
SDK の設定
Cloud Code SDK の使用を準備します。- Cloud Code サービスダッシュボードページを介してサービスが有効になっていることを確認します。
- Cloud Code と Authentication SDK の両方をインストールしたことを確認します。
- Edit (編集) > Project Settings (プロジェクト設定) > Services (サービス) を選択して、Unity エディター内からクラウドプロジェクトにサインインします。
- Unity エディターで新しい C# Monobehaviour スクリプトを作成します。Unity マニュアルの スクリプトの作成と使用 を参照してください。
- スクリプトで、await を使用して Core SDK を初期化します。
UnityServices.InitializeAsync() - スクリプトで、Authentication SDK を初期化します。
await AuthenticationService.Instance.SignInAnonymouslyAsync();
メッセージのサブスクライブ
特定のプレイヤーまたはプロジェクト全体のメッセージをサブスクライブできます。以下のコードスニペットを、Unity プロジェクトのMonoBehaviourusing 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 SubscribeToPlayerMessages(); await SubscribeToProjectMessages(); } // This method creates a subscription to player messages and logs out the messages received, // the state changes of the connection, when the player is kicked and when an error occurs. Task SubscribeToPlayerMessages() { // Register callbacks, which are triggered when a player message is received var callbacks = new SubscriptionEventCallbacks(); callbacks.MessageReceived += @event => { Debug.Log(DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ss.fffK")); Debug.Log($"Got player subscription Message: {JsonConvert.SerializeObject(@event, Formatting.Indented)}"); }; callbacks.ConnectionStateChanged += @event => { Debug.Log($"Got player subscription ConnectionStateChanged: {JsonConvert.SerializeObject(@event, Formatting.Indented)}"); }; callbacks.Kicked += () => { Debug.Log($"Got player subscription Kicked"); }; callbacks.Error += @event => { Debug.Log($"Got player subscription Error: {JsonConvert.SerializeObject(@event, Formatting.Indented)}"); }; return CloudCodeService.Instance.SubscribeToPlayerMessagesAsync(callbacks); } // 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); } }}
プレイヤーへのメッセージの送信
プレイヤーにメッセージを送信するには、モジュールからSendPlayerMessageSendProjectMessageUnity Runtime からの実行
CloudCodeServiceCallModuleEndpointAsyncvar sendPlayerMessageResult = await CloudCodeService.Instance.CallModuleEndpointAsync<string>("PushExample", "SendPlayerMessage",new Dictionary<string, object> {{"message", "hello with a player message from PushExample!"}, {"messageType", "testType"}, {"playerId", "<other-unity-player-ID>"}});
イベント
プレイヤー固有とプロジェクト固有の両方のサブスクリプションには、4 つのイベントハンドラーがあります。- : プレイヤーが新しいメッセージを受信したときにトリガーします。
MessageReceived - : 接続の状態が変わったときにトリガーします。
ConnectionStateChanged - : サーバーがプレイヤーのメッセージのサブスクライブを強制的に解除したときにトリガーします。これにより WebSocket 接続はクローズされず、ゲームクライアントがメッセージを再びサブスクライブすることも阻止されません。
Kicked - : 接続の処理時またはプレイヤーがメッセージを受信したときにトリガーします。
Error
メッセージエンベロープ
IMessageReceivedEventIMessageReceivedEventプロパティ | 説明 | 例 |
|---|---|---|
| 受信したメッセージのエンベロープの仕様バージョン。このプロパティを使用して、クライアントがメッセージを正しく処理できることを確認します。 | 1.0 |
| メッセージの一意の識別子。このプロパティを使用して、メッセージを追跡またはログに記録します。 | |
| メッセージのエンベロープのソース。これは、メッセージが発生した場所を示し、メッセージのデバッグまたはルーティングに使用できます。ソースは常に Cloud Code のドメインです。 | |
| メッセージのエンベロープタイプ。このプロパティは、メッセージに含まれるデータのタイプを示し、クライアントがその処理方法を決定するのに役立ちます。値は常に Cloud Code メッセージタイプです。 | |
| メッセージ作成の日付と時間。このプロパティを使用して、メッセージをログに記録したり、待ち時間を計算したりできます。 | |
| メッセージが関連付けられているプロジェクトの ID。 | |
| メッセージが対象としている環境の ID。このプロパティを使用して、開発、ステージング、運用などのさまざまな環境を区別できます。 | |
| 関連メッセージの順序を追跡するために使用できる識別子。例えば、複数のメッセージが会話またはワークフローを形成する場合、それらは相関 ID を共有します。 | |
| Cloud Code からプレイヤーに送信された実際のメッセージコンテンツ。 | "hello world!" |
| プレイヤーが受信するメッセージのタイプ。これは | "Information" |