Unityゲームにフレンドリストを追加する方法
Published: 2024-05-15 14:23:11

Unityゲームにフレンドリストを組み込むことは、プレイヤーのエンゲージメントを促進する上で重要な要素です。フレンドリストがあれば、ゲーム外での友達であろうと、激しい試合中に親密な絆を築いたプレイヤーであろうと、ゲーム内で他のプレイヤーとより親密なつながりを作ることができます。

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

このガイドに従うときの参考として、Unityゲームにフレンドリストを実装する方法の例を見たい場合は、私たちの[Unityショーケース](https://github.com/PubNubDevelopers/unity-multiplayer-shooter)ゲームをぜひご覧ください。

Unityゲームにフレンドリストを追加し、フレンドの追加、削除、オンラインステータスをリアルタイムで確認する方法をステップバイステップで学ぶには、読み進めてください。このガイドではフレンドリストの追加について説明しますが、同じアーキテクチャはギルド、クラン、アライアンスのリストにも簡単に適用できます。PubNub GameObjectの設定方法から始まり、Channel Groupsがどのようにフレンドリストをアーキテクトするか、そして最後にフレンドシステムの実装について学びます。

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

あなたのUnityゲームにスコアボードとリーダーボードを設定する方法を理解し始める前に、PubNubを理解し、プラットフォームの機能を利用するためにアプリケーションを構成する方法を理解する必要があります。

### 概要

PubNubはPub/Sub（Publish/Subscribe）モデルに基づいています。ユーザーは、基本的にすべての関連情報を含むペイロードであるメッセージをPubNubネットワークに[公開](https://www.pubnub.com/docs/general/messages/publish?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)します。メッセージと他の生成されたイベントを受信またはリスニングしたいユーザーは、PubNubネットワークに[サブスクライブ](https://www.pubnub.com/docs/general/messages/receive?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)し、メッセージを解析します。[イベントリスナーは](https://www.pubnub.com/docs/general/messages/receive#add-a-listener?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)、PubNubネットワークで生成されたメッセージやイベントをキャッチし、行われたアクションに基づいてトリガするために使用されます。

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

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

開始するには、任意のPubNub依存関係をインストールし、PubNub Unity SDKを設定してアプリケーションをPubNubネットワークに接続する必要があります。このガイドでは、すでにUnityゲームエンジン、Unityアセット、およびVisual Studioなどのコードエディタがインストールされていることを前提としています。詳細については[Unity SDKのドキュメントを](https://www.pubnub.com/docs/sdks/unity?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)参照してください：

1.  [パッケージマネージャから](https://www.pubnub.com/docs/sdks/unity#install-via-package-manager?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)Unityパッケージを追加します。
2.  [無料のPubNubアカウントを](https://admin.pubnub.com/?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)作成し、PubNubキーを取得します。アプリケーションが必要とするキーセットの機能を有効にする必要があります。このガイドでは、デフォルト設定でPresenceとStream Controllerを有効にする必要があります。キーセットの各機能の詳細については、[ガイドを](https://www.pubnub.com/how-to/?sortBy=Most%20recent&categories=PubNub%20portal&utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)参照してください。
3.  新しいUnityプロジェクトを作成するか、既存のゲームを開き、UnityエディタでPubNub GameObjectを[設定](https://www.pubnub.com/docs/sdks/unity#configure-pubnub?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)するために、前のステップで取得したPublishキーとSubscribeキーをUnityに提供します。すべての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=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)追加します。ここで、あなたのバックエンドは基本的に新しいメッセージを受信したときの通知を受け取ります。各タイプのメッセージやイベントに応答するカスタムロジックを実装できるように、さまざまなイベントリスナーがありますが、このガイドではプレゼンスとメッセージのイベントリスナーが必要です：

```js
var listener = new SubscribeCallbackListener();
pubnub.AddListener(listener);
listener.onPresence += OnPnPresence;
listener.onMessage += OnPnMessage;
…
// Handle Presence Events generated by the PubNub Network
private void OnPnPresence(Pubnub pn, PNPresenceEventResult result) {
    Debug.Log(result.Event);
}

// Handle Message Events generated by the PubNub Network.
private void OnPnMessage(Pubnub pn, PNMessageResult<object> result) {
    Debug.Log($"Message received: {result.Message}");
}
```

[PubNubは](https://www.pubnub.com/docs/general/presence/overview?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)イベントを生成してリアルタイムでプレイヤーのステータスを通知します。Unityゲームへのプレゼンス実装については[ハウツーガイドを](https://www.pubnub.com/how-to/add-presence-to-your-unity-game/?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)参照してください。

フレンドリストの作成
----------

プレゼンスイベントを受信するためにチャンネルを購読することから始めます。しかし、プレイヤーはどのプレイヤーがフレンドなのかをどうやって知るのでしょうか？チャンネルグループはこの問題の完璧な解決策です。

### チャンネルグループ

[チャンネルグループ](https://www.pubnub.com/docs/general/channels/subscribe#channel-groups?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)によって、一度に大量のチャンネルを管理することができます。チャンネル・グループは基本的にチャンネル・リストへのポインターで、チャンネル・グループごとに最大2000のチャンネルに対して単一のサブスクライブ・コールを送ることができます。チャンネル・グループはネットワークに接続されているユーザーIDに固有です。つまり、チャンネル・グループにユニークな名前を付けて、そのプレーヤーに関連付けることができます。

つまり、ユーザーごとに固有のチャンネルをサブスクライブする必要がなく、チャンネル・グループをサブスクライブし、プレイヤーのオンラインまたはカスタム・ステータスが変更されるたびに、プレゼンスやその他のイベントを受信することができます。チャンネル・グループとチャンネルは、あなたが管理し、アップデートを受け取ることができるフレンドとメンバー（チャンネル）のリスト（チャンネル・グループ）であると考えることができます。

### チャンネルグループの設定

ゲームのニーズにもよりますが、各プレイヤーのフレンドリストを実装するには、少なくとも2つのチャンネルグループが必要です。チャンネル名は異なってもかまいませんので、必ず[チャンネル名の命名規則に従って](https://www.pubnub.com/docs/general/channels/channel-naming?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)ください：

```js
//receive presence updates, so you know when a player’s friends online or custom status changes.
string chanGroupFriendsStatus = $“friends_status_” + {UserID} ;

// receive chat messages from friends
string chanGroupFriendsChat = $”friends_chat_” + {UserID};
```

2つのチャンネルグループが必要なのは、プレゼンスイベントをチャットメッセージなどの他のイベントから分離したいからです。同じチャネルグループがメッセージとチャネルの両方を表すと、多くの不要なトラフィックが発生します。将来的な機能拡張に柔軟に対応できるよう、イベントはできる限り分離したいものです。

フレンドチャットを実装する気がないのであれば、単にステータスチャネルグループが必要です。フレンドチャットを実装したい場合、このガイドではフレンドリストのアーキテクチャについて説明します。Unityでチャットシステムを実装するための詳細については、[リアルタイムチャットガイドを](https://www.pubnub.com/how-to/add-real-time-chat-to-your-unity-game/?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)ご覧ください。

すべてのチャンネルグループには、少なくとも1つのチャンネルが必要です。これを解決するには、すべてのプレイヤーのチャンネルパターンを作成し、プレイヤーのユーザーIDをチャンネル名に連結します：

```js
string chanFriendStatus = $”friends.presence.” + {UserID};
string chanFriendChat = $”friends.chat.” + {UserID};
```

そして、[Channel Groups APIを](https://www.pubnub.com/docs/sdks/unity/api-reference/channel-groups?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)使用して、適切なChannel Groupにこれら2つのチャネルを追加します。これを初めてログインする各プレイヤーに対して行います：

```js
PNResult<PNChannelGroupsAddChannelResult> statusFriendsResponse= await pubnub.AddChannelsToChannelGroup()
  .ChannelGroup(chanGroupFriendsStatus )
  .Channels(new string[] {
    chanFriendStatus
  })
  .ExecuteAsync();
//Handle response
…
PNResult<PNChannelGroupsAddChannelResult> chatFriendsResponse= await pubnub.AddChannelsToChannelGroup()
  .ChannelGroup(chanGroupFriendsChat)
  .Channels(new string[] {
    chanFriendChat 
  })
  .ExecuteAsync();
//Handle response
```

このようにチャンネル名をチャンネルグループに追加する方法は、プレイヤーのフレンドリストにフレンドを追加したり削除したりする方法と同じですが、詳しくは後述します。

### プレゼンスイベントとメッセージイベントを聞くサブスクライブ

チャンネルとチャンネルグループシステムができたので、PubNub Networkを購読することができます。

チャンネルをサブスクライブするのと同様に、チャンネルグループを直接サブスクライブし、そのチャンネルグループに関連付けられたチャンネルからプレゼンスイベントとメッセージイベントの両方を受信することができます。通常、サブスクライブするときにwithPresenceパラメータを含めることで、SDKに[プレゼンスと](https://www.pubnub.com/how-to/add-presence-to-your-unity-game/#h-5?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)非プレゼンスチャンネルの両方を管理させることができます。ただし、チャンネルグループのchanGroupFriendsStatusでは、Presenceイベントのみをキャッチし、メッセージやメタデータの更新など、他のイベントはキャッチしたくないため、このようなことはしたくありません。

この状況を改善するには、chanGroupFriendsStatusに-pnpresを追加します。これは、このチャンネル・グループのイベント、特にプレゼンス・イベントが、先に設定したプレゼンス・イベント・リスナーによって捕捉されることを意味します。さらに、chanGroupFriendsChatはプレゼンスイベントをリスニングせず、メッセージのみにフォーカスします：

```js
pubnub.Subscribe<string>()
  .ChannelGroups(new string[] {
    chanGroupFriendsStatus + “-pnpres”,
    chanGroupFriendsChat
  })
  .Execute();
```

### メッセージを送信する：公開

チャンネルグループchanGroupFriendsStatusの準備ができたら、フレンドがメッセージを送信し、そのフレンドチャットチャンネルグループに関連付けられているすべてのフレンドがメッセージを受信できるように、パブリッシュコールをセットアップする必要があります。

あなたはチャンネルグループをサブスクライブすることができますが、それらにパブリッシュすることはできません。代わりに、あなたが先に設定したチャネルグループに関連付けられているチャネルにメッセージを公開する必要があります：

```js
PNResult<PNPublishResult> publishResponse = await pubnub.Publish()
  .Message(“Hey friends, let’s game?”)
  .Channel(chanFriendChat)
  .ExecuteAsync();
  PNPublishResult publishResult = publishResponse.Result;
//Handle result
```

チャネル・グループに直接パブリッシュすることはできませんが、メッセージがこのチャネル・グループのいずれかのチャネルにパブリッシュされると、クライアントのリスナーのメッセージ・ハンドラによって受信されます。これは、チャンネル・グループに関連するフレンドがメッセージを受信することを意味します。

### 初期ゲームロード

プレイヤーが最初にログインするとき、[List Channelsサービスを呼び出して](https://www.pubnub.com/docs/sdks/unity/api-reference/channel-groups#list-channels?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)、チャンネルグループのすべてのチャンネル、つまりフレンドをリストアップする必要があります：

```js
PNResult<PNChannelGroupsAllChannelsResult> friendsListResult= await pubnub.ListChannelsForChannelGroup()
  .ChannelGroup(chanGroupFriendsStatus)
  .ExecuteAsync();
```

このフレンドのリストは、プレイヤーのフレンドリストUIを作成するために使用することができます。これらのプレーヤーに関連するメタデータがある場合は、そのユーザーIDを[App Context APIで](https://www.pubnub.com/docs/sdks/unity/api-reference/objects?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)使用して、ニックネーム、プロフィール画像、プレーヤーに関するメモなどのプロフィール情報のメタデータを取得できます。

現在のオンラインステータスを調べるには、HereNowを呼び出して、現在オンラインであるすべてのユーザーを取得し、プレーヤーのフレンドリストと照合します：

```js
pubnub.HereNow()
  .ChannelGroups(new String[]{ chanGroupFriendsStatus })
  .IncludeState(true)
  .IncludeUUIDs(true)
  .ExecuteAsync()
```

そして、フレンドリストUIのオンライン状態インジケータを更新して、これらのフレンドがオンラインであることを示すことができます。先に設定したプレゼンス イベント リスナーは、オンラインおよびカスタム ステータスの変更を検出し、それに応じてプレーヤーのフレンド リスト UI を更新できます。前述のように、メッセージもMessage Event Listenerでキャッチされ、フレンドグループから送信されたことを表すユニークな色で表示できます。

フレンドリストをシステムに追加するためのほぼすべての実装が完了しましたが、プレイヤーはフレンドリストをどのように管理するのでしょうか？

フレンドの管理フレンドシステム
---------------

先に示したように、フレンドをチャンネルグループに追加するには、[チャンネルグループにチャンネルを追加](https://www.pubnub.com/docs/sdks/unity/api-reference/channel-groups#add-channels?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)する機能を呼び出します。これはプレイヤーがフレンドを追加するボタンをクリックした時や、他のプレイヤーからの招待を受けた時に実行されます。

また、[Remove Channels](https://www.pubnub.com/docs/sdks/unity/api-reference/channel-groups#remove-channels?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)関数を呼び出し、チャンネルグループとチャンネルを指定することで、フレンドグループからフレンドを削除することもできます。先に作成したステータスチャネルグループとチャットチャネルグループの両方でこれを繰り返す必要があります。この呼び出しを開始するボタンを含めることができます。ユーザIDを渡し、チャネルグループから削除するために先に作成したチャネルパターンに含めます。

フレンドの追加と削除はゲーム内で行うことができますが、プレイヤーはゲーム内でチャンネルグループにチャンネルを追加/削除できないようにすることを強くお勧めします。プレイヤーがフレンドを追加/削除したい場合、バックエンドサーバー（ユーザーがアカウント登録したときと同じものでも構いません）にリクエストを行い、そのリクエストを処理するようにしてください。

これはゲームのセキュリティを高めるためです。お互いにフレンドではないプレイヤーが、プレイヤーのフレンドグループにアクセスできないようにします。暗号トークンベースの許可管理者である[Access Managerを](https://www.pubnub.com/docs/general/security/access-control?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)実装することで、クライアントのPubNubリソースへのアクセスを規制することができます。

バックエンドサーバでこのセキュリティ制御を行うことで、特定のプレイヤーの友達リクエスト招待を受信し、意図したターゲットにリクエストを転送するシステムを実装できます。プレイヤーはリクエストを受け入れるか拒否するかを選択し、招待をバックエンドサーバ（Access Managerで保護されています）を通して送り返し、元の送信者に転送します。これにより、プレーヤーのフレンドリストは安全に管理されます。

次のページ
-----

このハウツーガイドでは、Unityゲームにフレンドリストを追加する方法を学びました。Channel GroupsとPresenceを利用し、PubNubを使用してフレンドのオンライン/オフラインやカスタムステータスの変更を確認できるシステムを実装し、Access Managerで権限を確保することでフレンドの追加と削除の基盤を構築しました。

ゲーム開発者は以下のリソースで詳細を学ぶことができます：

-   [ドキュメントを](https://www.pubnub.com/docs/sdks/unity?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)読む。
-   [Unityでリアルタイムチャットを追加する方法](https://www.pubnub.com/how-to/add-real-time-chat-to-your-unity-game/?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)。
-   [ハウツーガイドで](https://www.pubnub.com/how-to/add-presence-to-your-unity-game/?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)Unity EngineプロジェクトにPresenceを実装する。
-   [Unityショーケース](https://github.com/PubNubDevelopers/unity-multiplayer-shooter)ゲームでスコアボードとリーダーボードをリアルタイムで実装する方法を理解する。
-   [Unity SDKのソース](https://github.com/pubnub/unity)コードをご覧ください。

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

PubNubはどのようにあなたを助けることができますか？
============================

この記事は[PubNub.comに](https://www.pubnub.com/how-to/add-friend-list-to-your-unity-game/?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)掲載されたものです。

PubNubのプラットフォームは、開発者がWebアプリ、モバイルアプリ、IoTデバイス向けにリアルタイムのインタラクティブ機能を構築、提供、管理できるように支援します。

私たちのプラットフォームの基盤は、業界最大かつ最もスケーラブルなリアルタイムエッジメッセージングネットワークです。世界15か所以上で8億人の月間アクティブユーザーをサポートし、99.999%の信頼性を誇るため、停電や同時実行数の制限、トラフィックの急増による遅延の問題を心配する必要はありません。

PubNubを体験
---------

[ライブツアーを](https://www.pubnub.com/tour/introduction/?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)チェックして、5分以内にすべてのPubNub搭載アプリの背後にある本質的な概念を理解する

セットアップ
------

[PubNubアカウントに](https://admin.pubnub.com/signup/?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)サインアップすると、PubNubキーに無料ですぐにアクセスできます。

始める
---

[PubNubのドキュメントは](https://www.pubnub.com/docs?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)、ユースケースや[SDKに](https://www.pubnub.com/docs?utm_source=medium&utm_medium=syndication&utm_campaign=off_domain&utm_content=ja)関係なく、あなたを立ち上げ、実行することができます。