インタレストグループ
Photonの「インタレストグループ」はルーム内の会話のサブチャンネルとして考えてください。
クライアントは、自分が加入登録しているインタレストグループ(およびグループ0)のメッセージのみを取得します。
任意のグループにイベントを送信できます。
この簡潔な機能はインタレストグループの基本的な管理、またはその他の適切な用途で使用可能です。
以下の使用例を参照してください。
利用可能なグループ
クライアントは、明示的にインタレストグループを作成する必要はありません。
インタレストグループは必要に応じて作成されます。アクターが新しいグループ番号に加入されると、サーバーがそのグループ番号を作成します。
Photonは最大256のインタレストグループを提供します。
グループ番号0は予約されており、ブロードキャスト用です。ルーム内のすべてのアクター(クライアント)はグループ0に加入登録されており、この登録を取り消すことはできません。
その他の255のグループは開発者が自由に使用できます。
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)
デフォルトでは、クライアントはすべてのグループにアップデートを送信します。多くの場合に、こうした送信が必要だと思われます。
備考:
- グループ追加が常に優先されます: 同じグループ番号が
enableGroups
とdisableGroups
の両方の配列に追加されると、そのグループが追加されます。 null
配列は「グループなし」として機能し、空の配列(new byte[0]
)は「すべてのグループ」として機能します。PhotonNetwork.SetInterestGroups(new byte[0], enableGroups)
はenableGroups
内のもの以外のすべてのグループを削除します。PhotonNetwork.SetInterestGroups(disableGroups, new byte[0])
はdisableGroups
の値にかかわらず、現在既存となっている(使用された)すべてのグループを追加します。
利用ガイド
インスタンス化
PhotonNetwork.Instantiate
メソッドはgroup
パラメータを承認し、prefabに添付されたPhotonViewのインタレストグループを設定します。
グループ
をPhotonNetwork.Instantiate
に渡す場合には、そのグループからの受信イベントを有効化する点に留意してください。
有効化しない場合には、prefabはローカルでインスタンス化されません。
PhotonView
prefabに添付されたPhotonViewは、PhotonNetwork.Instantiate
コールに渡されたインタレストグループを自動的に取得します。
デフォルトでは、0に設定されています。
0でない場合、参加するクライアントはgroups != 0におそらくインスタンス化を実行しません。
PhotonViewのインタレストグループをコードで設定またはアップデートする方法を以下に示します:
C#
photonView.group = interestGroupCode;
ビューのグループの設定は、ローカルでのみ実行されます。リモートインスタンスは、GameObjectをインスタンス化する際に設定されたグループを保持します。
PunRPCおよびPhotonViewシリアル化/同期化イベントは、SetSendingEnabled
を使用して非有効化されていない限り 各PhotonViewに設定されたインタレストグループにのみ送信されます。
通常、アップデートは受信側のクライアントのSetInterestGroup設定でサーバーサイドでフィルタリングされます。
RaiseEvent
PhotonNetwork.RaiseEvent
を呼ぶ際に対象のインタレストグループを設定するには、RaiseEventOptions.InterestGroup
を使用します。
利用事例
購読するインタレストグループは、クライアントごとに、実行時に動的に、またはコンパイル時に静的に定義できます。
インタレストグループの設定は、すべてのクライアントで同じにすることも、クライアントごとに設定することもできます。
インタレストグループは、ルーム内の1秒あたりのメッセージ数を減らすのに役立ちます。
トラフィックの減少によって、メッセージ/秒の上限を超過せず、コストを削減できます。また、ルームごとの最大プレイヤー数を増加するのに役立つ場合もあります。
この他にも、ゲームでインタレストグループを有効活用できる方法が考えられます。以下に例を記載します。
ネットワーク選別
インタレストグループのもっと一般的な利用事例は、ネットワーク選別です。
インタレストグループはゲーム内でインタレストの領域にマッピングすることが可能です。
たとえば「巨大なワールド」がある場合には、それをより小さな塊に分けることができます。これらの塊をリージョンと呼び、リージョンごとにグループを割り当てましょう。
「選別デモ」はインタレストグループに依存します。
チームイベント
ゲーム内にチームがあり、特定のチームのみが参加するイベントを実装したい場合には、チームごとにインタレストグループを割り当てることができます。
すべてのチームメンバーが、チームのインタレストグループに加入登録する必要があります。
チーム間のイベントは、チーム独自のグループ番号を使用して送信する必要があります。
チーム内のイベントは、相手チームのグループ番号を使用して送信する必要があります。