This document is about: PUN 2
SWITCH TO

PUN Classic (v1)、PUN 2、Boltはメンテナンスモードとなっております。Unity2022についてはPUN 2でサポートいたしますが、新機能が追加されることはありません。お客様のPUNプロジェクトおよびBoltプロジェクトが停止することはなく、将来にわたってパフォーマンス性能が落ちることはありません。 今後の新しいプロジェクトについては、Photon FusionまたはQuantumへ切り替えていただくようよろしくお願いいたします。

インタレストグループ

Photonの「インタレストグループ」はルーム内の会話のサブチャンネルとして考えてください。
クライアントは、自分が加入登録しているインタレストグループ(およびグループ0)のメッセージのみを取得します。
任意のグループにイベントを送信できます。

この簡潔な機能はインタレストグループの基本的な管理、またはその他の適切な用途で使用可能です。
以下の使用例を参照してください。

利用可能なグループ

クライアントは、明示的にインタレストグループを作成する必要はありません。
インタレストグループは必要に応じて作成されます。アクターが新しいグループ番号に加入されると、サーバーがそのグループ番号を作成します。

Photonは最大256のインタレストグループを提供します。
グループ番号0は予約されており、ブロードキャスト用です。ルーム内のすべてのアクター(クライアント)はグループ0に加入登録されており、この登録を取り消すことはできません。
その他の255のグループは開発者が自由に使用できます。
0より大きい番号のグループに割り当てられたイベントは、そのグループにインタレストのあるクライアントと、サーバーがイベントをリレーする際にルームにいるクライアントにのみ送信されます。

重要: インタレストグループ0に送信されるイベントしかキャッシュできません!その他のグループにはイベントキャッシュがありません。

グローバル設定

加入登録したグループのリストは、以下を使用すれば番号を追加または削除してルーム内でいつでもアップデートできます。

SetInterestGroups

SetInterestGroupsはサーバーに、あなたのクライアントがどのグループにインタレストがあるかを伝えます。
デフォルトではグループ0で、これ以外のグループではありません。このため、使用したい場合にはグループに加入登録する必要があります。

クライアントがどのインタレストグループからイベントを受信するかをグローバルにフィルタリングするには:

C#

void PhotonNetwork.SetInterestGroups(byte[] disableGroups, byte[] enableGroups)

バルクアップデートを使用するべきですが、個別のインタレストグループの受信を切り替えることも可能です:

C#

void PhotonNetwork.SetInterestGroups(byte group, bool enabled)

SetSendingEnabled

SetSendingEnabledを使用する場合、クライアントはローカルで特定のグループに実施されるアップデートを破棄する必要があります―これらのアップデートはサーバーに到達しません(この処理については、サーバー側のロジックはありません)。

クライアントがどのインタレストグループにイベントを送信するかをグローバルに定義するには、以下を使用してください:

C#

void PhotonNetwork.SetSendingEnabled(byte[] disableGroups, byte[] enableGroups)

単独のインタレストグループへの送信に切り替えるには:

C#

void PhotonNetwork.SetSendingEnabled(byte group, bool enabled)

デフォルトでは、クライアントはすべてのグループにアップデートを送信します。多くの場合に、こうした送信が必要だと思われます。

備考:

  • グループ追加が常に優先されます: 同じグループ番号がenableGroupsdisableGroupsの両方の配列に追加されると、そのグループが追加されます。
  • null配列は「グループなし」として機能し、空の配列(new byte[0])は「すべてのグループ」として機能します。
  • PhotonNetwork.SetInterestGroups(new byte[0], enableGroups)enableGroups内のもの以外のすべてのグループを削除します。
  • PhotonNetwork.SetInterestGroups(disableGroups, new byte[0])disableGroupsの値にかかわらず、現在既存となっている(使用された)すべてのグループを追加します。

利用ガイド

インスタンス化

PhotonNetwork.Instantiateメソッドはgroupパラメータを承認し、prefabに添付されたPhotonViewのインタレストグループを設定します。

重要: デフォルト0以外のグループPhotonNetwork.Instantiateに渡す場合には、そのグループからの受信イベントを有効化する点に留意してください。 有効化しない場合には、prefabはローカルでインスタンス化されません。

PhotonView

prefabに添付されたPhotonViewは、PhotonNetwork.Instantiateコールに渡されたインタレストグループを自動的に取得します。
デフォルトでは、0に設定されています。
0でない場合、参加するクライアントはgroups != 0におそらくインスタンス化を実行しません。

PhotonViewのインタレストグループをコードで設定またはアップデートする方法を以下に示します:

C#

photonView.group = interestGroupCode;

C#

photonView.Group = interestGroupCode;

ビューのグループの設定は、ローカルでのみ実行されます。リモートインスタンスは、GameObjectをインスタンス化する際に設定されたグループを保持します。

PunRPCおよびPhotonViewシリアル化/同期化イベントは、SetSendingEnabledを使用して非有効化されていない限り 各PhotonViewに設定されたインタレストグループにのみ送信されます。
通常、アップデートは受信側のクライアントのSetInterestGroup設定でサーバーサイドでフィルタリングされます。

RaiseEvent

PhotonNetwork.RaiseEventを呼ぶ際に対象のインタレストグループを設定するには、RaiseEventOptions.InterestGroupを使用します。

利用事例

購読するインタレストグループは、クライアントごとに、実行時に動的に、またはコンパイル時に静的に定義できます。
インタレストグループの設定は、すべてのクライアントで同じにすることも、クライアントごとに設定することもできます。

インタレストグループは、ルーム内の1秒あたりのメッセージ数を減らすのに役立ちます。
トラフィックの減少によって、メッセージ/秒の上限を超過せず、コストを削減できます。また、ルームごとの最大プレイヤー数を増加するのに役立つ場合もあります。

この他にも、ゲームでインタレストグループを有効活用できる方法が考えられます。以下に例を記載します。

ネットワーク選別

インタレストグループのもっと一般的な利用事例は、ネットワーク選別です。
インタレストグループはゲーム内でインタレストの領域にマッピングすることが可能です。
たとえば「巨大なワールド」がある場合には、それをより小さな塊に分けることができます。これらの塊をリージョンと呼び、リージョンごとにグループを割り当てましょう。

チームイベント

ゲーム内にチームがあり、特定のチームのみが参加するイベントを実装したい場合には、チームごとにインタレストグループを割り当てることができます。
すべてのチームメンバーが、チームのインタレストグループに加入登録する必要があります。
チーム間のイベントは、チーム独自のグループ番号を使用して送信する必要があります。
チーム内のイベントは、相手チームのグループ番号を使用して送信する必要があります。

Back to top