Unityゲームにリアルタイムチャットを追加する方法
Published: 2024-05-16 21:14:49

リアルタイムチャットまたはゲーム内チャットは、プレイヤーのエンゲージメントを高め、ユーザーの定着を助けます。リアルタイムチャットは、プレイヤー同士のコミュニケーションを可能にし、コミュニティ意識を育み、より楽しいゲーム体験を可能にするソーシャルインタラクションのプラットフォームを提供します。

リアルタイムチャットを取り入れることは、言うは易く行うは難しです。ゼロから始めるには、構築、維持、そしてプレイヤー数の増加に伴う拡張に多くのリソースが必要です。幸いにも、PubNubは私たちのリアルタイム、低遅延APIプラットフォームでUnityゲームにリアルタイム機能を注入することがこれまで以上に簡単になりました。Windows、Mac、iOS、Android、OculusやMeta Questのようなバーチャルリアリティシステム、またはクロスプラットフォーム向けに開発しているかどうかにかかわらず、私たちの[Unity SDKは](https://www.pubnub.com/docs/sdks/unity?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)あなたをカバーしています。

PubNubを使用してUnityビデオゲームにリアルタイムチャットを追加する方法を学び、異なるチャネルパターンを設定する方法を理解することから始め、メッセージを送受信する方法を学び、モデレーション、絵文字、リアクション、GIFなどの他の機能を使用してゲーム内のチャットを強化/保護します。

PubNubを始める
----------

ゲーム内チャットの設定方法を理解する前に、PubNubプラットフォームと、プラットフォームの機能を利用するためのアプリケーションの設定方法を理解する必要があります。

### 概要

PubNubはPub/Sub（Publish/Subscribe）モデルに基づいています。ユーザーは、基本的にすべての関連情報を含むペイロードであるメッセージをPubNubネットワークに[公開](https://www.pubnub.com/docs/general/messages/publish?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)します。メッセージを受信したい、または聞きたいユーザーはPubNubネットワークに[サブスクライブ](https://www.pubnub.com/docs/general/messages/receive?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)し、メッセージを解析します。メッセージには、32KB以下であれば（そしてできればJSONであれば）、好きなものを含めることができます。

メッセージが正しい受信者に確実に届くように、あるデバイスから別のデバイスにデータが送信されるメカニズムとして[チャネルが](https://www.pubnub.com/docs/general/channels/overview?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)使用されます。チャネルは、デバイスがPubNubネットワークにパブリッシュしたりサブスクライブしたりするたびに必要になります。ユーザーが一度に発行できるメッセージは1つだけですが、ユーザーは一度に多くの異なるチャンネルを購読し、さまざまなメッセージを聞くことができます。

メッセージを公開するときには正確なチャンネル名を指定する必要がありますが、[多重化によって](https://www.pubnub.com/docs/general/channels/subscribe#channel-multiplexing?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)一度に複数のチャンネルを購読することができます。多重化とは、チャンネル名を文字列の配列として指定することによって、1つ以上のチャンネルを購読することです。

なぜこの情報が必要なのでしょうか？ゲーム内のメッセージングシステムはすべてチャンネルの概念に基づいています。_チャンネルパターン名をどのようにフォーマットして保護するかによって、どのような種類のチャットが必要に_なるかが決まります。

### PubNub Unity SDKのインストールと設定

開始するには、アプリケーションをPubNubネットワークに接続するためにPubNub Unity SDKを設定する必要があります。詳細については[Unity SDKのドキュメントを](https://www.pubnub.com/docs/sdks/unity?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)参照してください：

1.  [パッケージマネージャを介して](https://www.pubnub.com/docs/sdks/unity#install-via-package-manager?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)Unityパッケージを追加します。
2.  [無料のPubNubアカウントを](https://admin.pubnub.com/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)作成し、PubNubキーを取得します。アプリケーションに必要なキーセットの機能を有効にすることが重要です - 重要なPub/Sub機能については、単にStream Controllerを有効にする必要があります。重要なPub/Sub機能については、Stream Controllerを有効にするだけです。高度な機能のために設定する必要があるその他の設定については、後ほど説明します。
3.  前のステップで取得したPublishキーとSubscribeキーをUnityに渡してPubNub GameObjectを[設定](https://www.pubnub.com/docs/sdks/unity#configure-pubnub?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)します。すべてのPubNubオブジェクトはPubNubへの接続を確立するために一意の識別子を必要とするため、UserIdも提供する必要があります。そうしたら、PubNubオブジェクトを初期化します：

```js
using PubnubApi;
using PubnubApi.Unity;
…
PubNub pubnub = new Pubnub(pnConfiguration);
```

4.  イベントやメッセージに反応するようにゲームの[イベントリスナーを](https://www.pubnub.com/docs/sdks/unity#add-event-listeners?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)追加します。各タイプのメッセージやイベントに応答するカスタムロジックを実装できるように、さまざまなイベントリスナーがありますが、チャットメッセージを交換する中核的な機能については、単にメッセージイベントリスナーが必要です（このガイドの後半で、より魅力的にするためにリアルタイムチャットに追加機能を追加する方法を学びます）：

```js
var listener = new SubscribeCallbackListener();
pubnub.AddListener(listener);
listener.onMessage += OnPnMessage;
…
private void OnPnMessage(Pubnub pn, PNMessageResult<object> result) {
    Debug.Log($"Message received: {result.Message}");
}
```

他のデバイスにメッセージを送信するためにパブリッシュを開始し、パブリッシャーからメッセージを受信するためにサブスクライブを開始する前に、チャンネル名を定義する必要があります。覚えておいてください: チャネルパターンをどのようにフォーマットするかによって、実装するチャットの種類が決まります。

異なるチャットパターンの定義
--------------

あなたのゲームに実装するチャットの種類を検討する必要があります。このセクションは、チャンネルが従うべきパターンについて説明するものであり、ゲームやユーザーから必要な情報を取得するためのセットアップ全体について説明するものではありません。PubNubを使用するUnityプロジェクトでさまざまなチャットパターンを見たい場合は、[Unity Showcase Gameを](https://github.com/PubNubDevelopers/unity-multiplayer-shooter)ご覧ください。

### オール/グローバルチャット

オールチャットまたはグローバルチャットは、ゲーム内のすべてのプレイヤー間のコミュニケーションを可能にします。すべてのプレイヤーが購読している共通のチャンネルでメッセージを公開、購読することで一般的なチャットを設定できます。グローバルプレイヤー用のチャンネル構造を設定できます：

```js
string allChat = “global”;
```

各クライアントがチャンネルを購読することで、全員が同じメッセージをリアルタイムで受信できるようになり、全員が参加できる共有チャット体験が生まれます。

### プライベート/ウィスパーチャット

プライベートまたはウィスパーチャットでは、プレイヤー同士が一対一の会話をすることができます。 プライベートまたはウィスパーチャットチャンネルパターンでは、各ユーザーがプライベートな会話を目的としたチャンネル構造をサブスクライブします：

```js
string privateChatBase= “chat.private.*”;
```

これは、[ワイルドカードサブスクライブの](https://www.pubnub.com/docs/general/channels/subscribe#wildcard-subscribe?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)コンセプトを使用しています。この機能は、階層化されたチャネルのリストを購読するために使用することができます。

例えば、あるユーザが他のユーザにプライベートでメッセージを送信しようとする場合、PubNubネットワーク内でユーザを識別する一意な識別子を表す現在のPubNubユーザID（またはUUID/uuid）とメッセージの受信予定者のユーザIDを連結します。現在のユーザのユーザIDは（pubnub.GetCurrentUserId()で）常に取得できますが、意図する受信者のユーザIDを取得する必要があります。受信者のユーザIDを取得したら、チャネルを次のように連結することができます：

```js
string privateChatMessage = “chat.private.user-a-uuid&user-b-uuid”;
```

chat.private.\* のようなワイルドカードチャネルパターンを指定しているので、アプリはそのパターンにマッチするすべてのチャネル名を購読します。これにより、実行時にチャンネル名を常に知っておく必要がなくなります。最後に、ユーザ ID を使用することで、チャンネル名が一意になり、2人のユーザ間で会話が行われることが保証されます。

### フレンド/バディチャット

フレンドチャットやバディチャットを作成することで、プレイヤーはより親密な関係を築きたい特定のプレイヤーとプライベートなコミュニケーションをとることができます。

フレンド/バディチャットパターンでは、ユーザーIDを追加してプライベートチャットチャンネルパターンを作成するのと同じように、各デバイスやプレイヤーに固有のチャンネルパターンを作成する必要があります：

```js
string chanFriendChat = "chat.friends.” + pubnub.GetCurrentUserId();”
```

chanFriendChat文字列内のユーザーIDをpubnub.GetCurrentUserId()で置き換えます。これでチャンネルパターンは揃いましたが、単純にchat.friends.\*のようなワイルドカードパターンを使って購読することはできません。

この問題を解決するのがPubNubの[チャンネル](https://www.pubnub.com/docs/general/channels/subscribe#channel-groups?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)グループで、一度に多数のチャンネルを管理することができます。チャンネルグループは基本的にチャンネルのリストへのポインタです; この場合、チャンネルグループはプレイヤーに固有で、プレイヤーの友達全員への参照を含みます：

```js
string chanGroupFriendChat = "chanGroupFriendChat_" + pubnub.GetCurrentUserId();
```

注: チャンネルグループ名はチャンネル名と同じ規則に従いますが、名前に[ピリオドを含めることはできません](https://www.pubnub.com/docs/general/channels/subscribe#channel-group-names?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)。

pubnubオブジェクトでチャンネルをサブスクライブする方法（次のセクションで説明します）と同様に、チャンネルグループも同時にサブスクライブすることができます。つまり、プレイヤーはフレンドのChannel Groupにサブスクライブしているので、新しいフレンドが追加されるたびに、そのフレンドのChanFriendChatはプレイヤーのフレンドのChannel Groupに追加され、それらのチャネルのいずれかがメッセージをパブリッシュするたびに、Messageイベントリスナーでメッセージを受け取ることになります。Channel Group にパブリッシュすることはできませんが、Channel Group 内の関連チャンネルにメッセージをパブリッシュすることはできます。

[PubNub Unity SDKのChannel Groups APIを](https://www.pubnub.com/docs/sdks/unity/api-reference/channel-groups?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)使用すると、あなたが権限を持つチャネルグループから友人/チャネルを追加、リスト、および削除することができます。チャンネルグループ機能は、プレゼンスとして知られているフレンドもオンライン/オフラインになるタイミングを決定するためにも使用されます。これについては[Unityのフレンドリスト追加方法ガイドで](https://www.pubnub.com/how-to/add-friend-list-to-your-unity-game/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)詳しく説明します。

### ギルド/アライアンス/クランチャット

ギルド、アライアンス、クランが登場するゲームでは、専用のチャット環境がチームの連携や仲間意識に大きく役立ちます。このスタイルのグループチャットは、複数のユーザー間でのコミュニケーションを可能にし、フレンドだけでなく、より多くのプレイヤー間での協力やチームワークを促進します。ギルド/アライアンス/クランチャットでは、同じグループのメンバーが戦略を練ったり、成果を共有したり、あるいは単にゲーム内でより個人的なコミュニティを形成するために絆を深めることができます。

PubNubでこれを設定するには、フレンド/バディチャットを実装するのと同じコンセプトです。各タイプのチャンネルグループを作成し、そのチャンネルグループに登録し、承認されたらそのチャンネルグループにフレンドを追加します。これらのチャンネルグループに関連付けられたチャンネルに公開されたメッセージはイベントリスナーをトリガーし、適切にチャットを表示することができます。

各プレイヤーのチャンネルグループは[2000チャンネル](https://www.pubnub.com/docs/general/channels/subscribe#channel-groups?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)（この場合はプレイヤー）を[管理する](https://www.pubnub.com/docs/general/channels/subscribe#channel-groups?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)ことができ、大規模なオンラインゲームの最大のギルドでも十分すぎるほどです。さらに、PubNubネットワークに接続されている個々のクライアントは10チャンネルグループを持つことができ、必要に応じて20,000チャンネルを購読することができます。

### パーティー/ロビーチャット

パーティーチャットやロビーチャットは、特定のゲームセッションやミッションのために結成された小規模で一時的なグループに対応しています。これらのスタイルのチャットは異なる目的を意図していますが、その実装はプライベート/ウィスパーチャットチャンネルを作成するパターンに似ています。

まず、それぞれのグループチャットのベースとなる文字列を作成します。チャネルの配列にサブスクライブするとき（次のステップで説明します）、すべてのリクエストをリッスンするためにワイルドカードサブスクライブを使います：

```js
string chanChatParty = “chat.party.” + “*”;
string chanChatLobby= “chat.lobby.” + “*”;
```

ロビーやパーティが結成されると、あるプレイヤーがグループのリーダーやオーナーに指名されます。このようなプレイヤーをパーティリーダーまたはホストと呼びます。次に、ホストプレイヤーのユーザーIDとベースとなる文字列を連結し、ユニークなチャンネルパターンを作成します。パーティやロビーに招待された新しいプレイヤーは、これらのチャンネルに動的に登録され、事実上グループに参加することになります。パーティやロビーが終了したり解散したりすると、チャンネルは削除されます。

すべてをまとめる
--------

チャネルのパターンに基づいてゲームに実装するチャットの種類を決めたら、次はこれらのチャネルをパブリッシュしたりサブスクライブしたりして、リアルタイムでメッセージを送受信します。

### メッセージの公開

このプロセスは、メッセージのペイロードを作成することから始まります。これは、Unityゲームの要件に応じて、単純なテキストチャットであったり、より複雑なデータ構造であったりします。ペイロードの準備ができたら、いよいよメッセージを発行します。

[Publish APIは](https://www.pubnub.com/docs/sdks/unity/api-reference/publish-and-subscribe#publish?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)、指定されたチャットチャンネルのすべての購読者にメッセージを送信するために使用されます。一度に1つのチャンネルにしかパブリッシュできませんが、パブリッシュは非同期に実行されるため、他のコードの実行をブロックすることはありません（同期的にパブリッシュすることも可能です）。

例えば、パーティにチャットメッセージを送信したい場合、以下のような呼び出しを行い、パブリッシュするだけでなく、PubNubの呼び出しが成功したかどうかを判断します（呼び出しが失敗した場合の処理も行います）：

```js
PNResult<PNPublishResult> publishResponse = await pubnub.Publish()
  .Message(“Ready to go!”)
  .Channel(chanChatParty )
  .ExecuteAsync();
PNPublishResult publishResult = publishResponse.Result;
PNStatus status = publishResponse.Status;
Debug.Log("pub timetoken: " + publishResult.Timetoken.ToString());
Debug.Log("pub status code : " + status.StatusCode.ToString());
```

### メッセージの購読

メッセージが公開されたら、適切なチャネルに[サブスクライブして](https://www.pubnub.com/docs/sdks/unity/api-reference/publish-and-subscribe#receive-messages?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)、受信メッセージやイベントを受信する必要があります。1回の呼び出しで複数のチャットチャネルやチャネルグループをサブスクライブできます：

```js
pubnub.Subscribe<string>()
  .Channels(new List<string>() {
    chanChatAll,
    chanPrivateChat,
    chanChatParty + "*",
    chanChatLobby + "*"               
})
  .ChannelGroups(new List<string>() {
    chanFriendGroupChat + userId,
    chanGuildGroupChat + userId,
    chanAllianceGroupChat + userId
})
.Execute();
```

プレイヤーはPubNubネットワークに接続され、[イベントリスナーは](https://www.pubnub.com/docs/sdks/unity#add-event-listeners?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)イベント（この場合は新しいメッセージの到着）が発生するのを待ち、そのイベントに関連するコードを実行します。

メッセージが到着すると、リスナーはコールバックをトリガーし、到着したメッセージを処理するために書いたコードを実行します。これは、チャットルームにメッセージを表示するような単純なものから、チャットメッセージに基づいてゲーム内イベントをトリガーするような複雑なものまであります。

ゲーム内チャットを魅力的にする高度な機能
--------------------

Unityゲームにゲーム内チャットを実装し、プレイヤーがリアルタイムでメッセージを送受信することに成功しました！これは既にプレイヤー同士の交流の場を作り出していますが、実装された機能は氷山の一角に過ぎません - プレイヤーにとってゲーム内チャットをより魅力的なものにするために実装を検討すべき機能はたくさんあります。

### メッセージ履歴を読み込む：メッセージの永続性

ゲーム内では、プレイヤーは以前の会話を再確認したり、聞き逃したチャットに追いつく必要があるかもしれません。Message[Persistence](https://www.pubnub.com/docs/general/storage?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)APIをUnityゲームに実装することで、チャットメッセージ、メッセージアクション、ファイルを必要に応じて保存、取得することができます：

```js
PNResult<PNFetchHistoryResult> fetchHistoryResponse = await pubnub.FetchHistory()
  .Channels(new string[] { chanPrivateChat })
  .IncludeMeta(true)
  .MaximumPerChannel(25)
  .ExecuteAsync();
```

また、メッセージの保存期間を柔軟に制御できるため、ゲーム固有のニーズやリソースに応じてストレージを管理できます。メッセージの永続性を利用できるようにするには、キーの[管理ポータルで](https://admin.pubnub.com/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)この機能を有効にする必要があります。この機能の詳細および有効化方法については、[Message Persistenceハウツーガイドを](https://www.pubnub.com/how-to/admin-portal-persistence/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)ご覧ください。

### 不在メッセージをプレーヤーに通知する：モバイルプッシュ通知

モバイルゲームでは、プレイヤーはアプリを出たり入ったりすることが多く、チームからの重要なメッセージやゲームのアップデートを見逃すことがあります。そこで、[モバイルプッシュ通知の](https://www.pubnub.com/docs/general/push/send?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)出番です。モバイルプッシュ通知は、プレイヤーがゲームに参加していないときでも、見逃したチャットメッセージやゲームのアップデート、その他の重要な通知をプレイヤーに通知する方法を提供します。

[モバイルプッシュ通知APIでは](https://www.pubnub.com/docs/sdks/unity/api-reference/mobile-push?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)、iOSとAndroidの両方のデバイスにプッシュ通知を送信するための統一APIを提供しています。これにより、プロセスが簡素化され、プラットフォームに関係なく、すべてのデバイスに通知するために単一のAPIコールを送信することができます。また、個々のゲーマーにパーソナライズされた通知を送信したり、全プレイヤーにメッセージをブロードキャストするなど、プッシュ通知をカスタマイズすることもできます。このような柔軟性により、プレイヤーとの効果的なコミュニケーションが可能になり、プレイヤーの関心を引きつけ、情報を提供し続けることができます。

PubNubでモバイルプッシュ通知を利用するには、[管理者ポータルの](https://admin.pubnub.com/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja) [ハウツーガイドに従って](https://www.pubnub.com/how-to/push-notifications/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)モバイルプッシュ通知を有効にする必要があります。また、[FCMと](https://www.pubnub.com/how-to/admin-portal-push-notifications-android/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja) [APNの](https://www.pubnub.com/how-to/admin-portal-push-notifications-apns/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)モバイルプッシュ通知についてのより具体的で詳細なガイドもご用意しています。

### 言葉だけではありません：絵文字

絵文字は、デジタルコミュニケーションにおける感情の世界共通言語として機能します。絵文字を使うことで、プレイヤーは自分の感情や反応を楽しくカラフルに表現することができ、チャットをよりインタラクティブで魅力的なものにすることができます。

PubNubを使用すると、プレイヤーにメッセージではなく[シグナルを](https://www.pubnub.com/docs/general/messages/publish#send-signals?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)発行させることで、Unityゲームに絵文字サポートを簡単に実装できます。シグナルは、メッセージよりもはるかに速く、安価に送信できるため、小さなデータのビットを送信するためのものです。絵文字は一般的にデータサイズが非常に小さいので、データを素早く送信するには最適な方法です。

[PubNubのシグナルAPIを使って](https://www.pubnub.com/docs/sdks/unity/api-reference/publish-and-subscribe#signal?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)指定したチャットに絵文字を公開することができます。例えば、プレイヤーが手を振っている絵文字をグローバルチャットに送信したい場合、送信を押すと以下のコードが実行されます：

```js
Dictionary<string, string> myMessage = new Dictionary<string, string>();
myMessage.Add("emoji", ":wave:");
pubnub.Signal()
  .Message(myMessage)
  .Channel("global")
  .Execute((result, status) => {
    if (status.Error) {
      Debug.Log(status.ErrorData.Information);
    } else {
      Debug.Log(result.Timetoken);
    }
  });
```

意図した受信者のプレイヤーは、指定されたチャンネルに加入していればシグナルを受信します。この場合、グローバルチャンネル用なので、全員が絵文字を受信することになります。シグナルを受信するには、リスナーイベントを購読してください：

```js
listener.onSignal += OnPnSignal;
private void OnPnSignal(Pubnub pn, PNSignalResult<object> result) {
    // Handle the emoji by looking up the value and displaying the result.
}
```

絵文字の値がUnityで定義されている実際の絵文字であることを確認する必要があります。これらの絵文字は、[App Context](https://www.pubnub.com/docs/sdks/unity/api-reference/objects?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)（以前はObjectsとして知られていた）を介してPubNubネットワークに格納および取得することができ、プレイヤーがアクセスできるすべての絵文字をサーバーレスストレージから取得することができます。UnityゲームにApp Contextを実装する方法については、ハウツーガイドを参照してください。

### メッセージに反応するメッセージリアクション

いいね、ハート、サムズアップ、ステッカー、またはゲーム固有のカスタムリアクションなどの[メッセージリアクションは](https://www.pubnub.com/docs/sdks/unity/api-reference/message-actions?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)、プレイヤーがチャットメッセージに応答するための迅速かつ簡単な方法を提供します。リアクションはチャットにインタラクティブ性を与えるだけでなく、プレイヤー同士がお互いのメッセージを認め合い、関わり合うことで、コミュニティ意識を育むことができます。

PubNubの[メッセージアクションAPIを](https://www.pubnub.com/docs/sdks/unity/api-reference/message-actions?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)使用して、リアクションや既読受信のような機能を構築したり、メッセージにカスタムメタデータを関連付けたりすることができます。Discordのようなチャットアプリケーションでサーバごとに異なるリアクションや絵文字があるのと同様に、チャットの種類も異なります。チャットがロードされたときに、以下の呼び出しを使って、指定したチャットチャンネルで利用可能なメッセージのリアクションを取得できます：

```js
pubnub.GetMessageActions()
  .Channel(chanChatLobby)
  .Execute(new PNGetMessageActionsResult((result, status) => 
  {
    //result is of type PNGetMessageActionsResult.
  }));
```

プレイヤーがメッセージに対してリアクションを返そうとする場合、公開メッセージにメッセージリアクションを追加することでリアクションを返せます：

```js
pubnub.AddMessageAction()
  .Channel(chanChatLobby)
  .MessageTimetoken(5610547826969050)
  .Action(new PNMessageAction { Type = "reaction", Value = "smiley_face" })
  .Execute(new PNAddMessageActionResult((result, status) =>
  {
    //result is of type PNAddMessageActionResult.
  }));
```

PubNubはタイムトークンを使って、メッセージがいつネットワークに公開されたかを正確に追跡します。PubNubはタイムトークンを使ってメッセージがいつネットワークに公開されたかを正確に追跡します。そのため、MessageTimetoken()の引数に適切なタイムトークンの値を指定することで、メッセージに反応することができます。

リアクションをリッスンし、元のメッセージを送信したプレイヤーに通知するには、リスナーを追加し、OnPNMessageActionメソッドでリアクションを処理する必要があります：

```js
listener.onMessageAction += OnPnMessageAction;
…
private void OnPnMessageAction(Pubnub pn, PNMessageActionEventResult result) {
   //Handle Message Reaction
}
```

絵文字と同様に、[App Contextを](https://www.pubnub.com/docs/sdks/unity/api-reference/objects?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)使用して、これらのリアクションがゲーム内でどのように視覚的に表現されるかを取得し、保存することができます。メッセージリアクションを使用するには、[管理ポータルで](https://admin.pubnub.com/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)キーの[メッセージ永続](https://www.pubnub.com/how-to/admin-portal-persistence/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)化を有効にする必要があります。

### GIFとその他のマルチメディア

チャット体験を向上させるもう一つの重要な機能は、マルチメディアファイルの共有です。GIFの共有、面白い瞬間のスクリーンショット、ゲームリソースの共有など、ファイル共有はゲームに新たなレベルの交流をもたらします。

これらのタイプのマルチメディアファイルを実装するには、[PubNubファイル共有APIを](https://www.pubnub.com/docs/sdks/unity/api-reference/files?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)使用します。この機能により、プレイヤーはアクセス可能なファイルをアップロード、ダウンロード、削除することができます。ファイルを送信するには、次のように呼び出します：

```js
PNResult<PNFileUploadResult> fileUploadResponse = await pubnub.SendFile()
  .Channel(string chanFriendChatSamantha)
  .File("cat_picture.jpg") //checks the bin folder if no path is provided
  .Message("Look at this photo!")
  .ExecuteAsync();
PNFileUploadResult fileUploadResult = fileUploadResponse.Result;
PNStatus fileUploadStatus = fileUploadResponse.Status;
if (!fileUploadStatus.Error && fileUploadResult != null)
{
  Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(fileUploadResult));
}
else
{
  // Handle File Upload Error.
}
```

サブスクライバがファイルをリッスンするには、イベントリスナーを追加し、OnPNFileメソッドでファイルを表示する方法を処理する必要があります：

```js
listener.onFile += OnPnFile;
…
private void OnPnFile(Pubnub pn, PNFileEventResult result) {
    //Handle how to display the file received
}
```

また、異なるチャットチャンネルに関連付けられたファイルを取得、リスト情報、および削除することができます。管理者ポータルでファイル共有機能を有効にし、メッセージの永続性を有効にする必要があります。この方法については、[ファイルを有効にするハウツーガイドを](https://www.pubnub.com/how-to/admin-portal-enabling-files/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)参照してください。

### チャット チャンネルの保護アクセスマネージャ

どのようなゲーム環境においても、チャットチャンネルのセキュリティを確保することは最も重要です。それが不要なメッセージからプレイヤーを保護するか、機密の戦略的な議論を保護するかどうかにかかわらず、Unityゲームのチャットシステムは、セキュリティを念頭に置いて設計する必要があります。

そこでPubNubの[アクセスマネージャの](https://www.pubnub.com/docs/sdks/unity/api-reference/access-manager?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)出番です。これは、チャットチャンネルを保護するための堅牢で柔軟なフレームワークを提供します。Access Managerを使用すると、誰が各チャンネルを公開または購読できるかを制御し、Unityゲームのチャットシステムに追加のセキュリティレイヤーを追加することができます。

Access Managerは、ユーザーレベル、チャンネルレベル、または個々のキーのレベルでパーミッションを付与することができます。例えば、2人のプレイヤー間のプライベートチャットでは、その2人のプレイヤーだけにプライベートチャネルの読み取りと書き込み権限を与えることができます。同様に、ギルドチャットでは、すべてのギルドメンバーに読み取り権限と書き込み権限を与え、ギルドリーダーにのみ管理権限を与えることができます。

Access Managerはトークンベースの認証もサポートしており、ユーザーを安全に認証して適切なパーミッションを付与することができます。これにより、許可されたプレイヤーのみがゲームのチャットチャンネルにアクセスできるようになり、潜在的な脅威からゲームコミュニティを保護できます。

この機能を利用するには、[管理者ポータルで](https://admin.pubnub.com/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)Access Managerを有効にする必要があります。このアドオン機能を有効にする方法については、こちらの[サポートページを](https://support.pubnub.com/hc/en-us/articles/360051974791-How-do-I-enable-add-on-features-for-my-keys-?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)参照してください。

次のページ
-----

このハウツーガイドでは、Unityゲームに堅牢なリアルタイムチャットシステムを追加する方法を学びました。環境内でPubNubオブジェクトを初期化する方法から、異なるチャットタイプを表すチャットパターンの設定、そしてメッセージの送受信までを説明しました。絵文字、メッセージリアクション、ファイル共有のような高度な機能の実装方法や、メッセージの永続性、モバイルプッシュ通知、チャネルのセキュリティなど、優れたチャットシステムの重要な側面も学びました。

あなたが初めてのゲームに取り組んでいるインディーズ開発者であっても、マルチプレイヤーゲームを強化しようとしているベテラン開発者であっても、PubNubのリアルタイム機能は、あなたのゲーム内チャットをサポートするインフラストラクチャとして機能します。

以下のリソースで詳細をご覧ください：

-   [Unityのドキュメントを](https://www.pubnub.com/docs/sdks/unity?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)読んで、ゲームにリアルタイムチャットを追加するために必要なすべての知識を学びましょう。
-   Unityガイドで[フレンドリストの](https://www.pubnub.com/how-to/add-friend-list-to-your-unity-game/?utm_source=devto&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)追加方法を理解する。
-   [Unity Showcase Gameで](https://github.com/PubNubDevelopers/unity-multiplayer-shooter)チャットパターンを使用してチャットルームを管理する方法などをご覧ください。
-   [Unity SDKのソース](https://github.com/pubnub/unity)コードをご覧ください。

ご質問やご不明な点がございましたら、[devrel@pubnub.com](mailto:devrel@pubnub.com)のデベロッパーリレーションズチームまでお気軽にお問い合わせください。