This document is about: PUN 1
SWITCH TO

PUN Classic (v1), PUN 2 and Bolt are in maintenance mode. PUN 2 will support Unity 2019 to 2022, but no new features will be added. Of course all your PUN & Bolt projects will continue to work and run with the known performance in the future. For any upcoming or new projects: please switch to Photon Fusion or Quantum.

Interest Groups

You can imagine Photon's "Interest Groups" as sub-channels for conversations in a room:
Clients only get the messages of Interest Groups they subscribed to (and group 0).
They can send any event to any group they want to.

This simple feature can be used for basic Interest Management or any way you see fit.
See the example use cases below.

Available Groups

Clients do not need to explicitly create interest groups.
Interest groups are created on demand; when an actor subscribes to a new group number, the server will create it.

Photon offers up to 256 interest groups.
The group number 0 is reserved and meant for broadcast: All actors (clients) inside a room are subscribed to group 0 and cannot unsubscribe from it.
The other 255 groups are available to the developer to use freely.
Any event assigned to a group > 0 will only be transmitted to clients that are interested in that group and in the room when the server relays the event.

Important: You can only cache events sent to interest group 0! No other group has an event cache.

Global Setup

The list of subscribed groups can be updated at any time inside the room by adding or removing their numbers using:

SetInterestGroups

SetInterestGroups tells the server, which groups your client is interested in.
By default, this is group 0 but no others, so you have to subscribe to some groups, if you want to use this.

To globally filter which interest groups the client receives events from:

C#

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

You should prefer using the bulk updates but you can also toggle reception for individual Interest Groups:

C#

void PhotonNetwork.SetInterestGroups(byte group, bool enabled)

SetSendingEnabled

When using SetSendingEnabled, the client may locally discard updates going to specific groups - they simply never reach the server (there is no server-side logic for this).

To globally define which interest groups the client should send events to, use:

C#

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

To toggle a single sending interest group:

C#

void PhotonNetwork.SetSendingEnabled(byte group, bool enabled)

By default, the client sends updates to all groups, which is most likely what you want.

Notes:

  • Priority is always to group addition: if the same group number is added to both enableGroups and disableGroups arrays then the group will be added.
  • A null array acts as "no group" and an empty array (new byte[0]) acts as "all groups".
  • PhotonNetwork.SetInterestGroups(new byte[0], enableGroups) will remove all groups except the ones in enableGroups.
  • PhotonNetwork.SetInterestGroups(disableGroups, new byte[0]) will add all currently existing (used) groups, no matter what the value of disableGroups is.

Usage Guide

Instantiate

PhotonNetwork.Instantiate methods accept a group parameter that will set the Interest Group of the PhotonView attached to the prefab.

Important: If you pass a group other than the default 0 to PhotonNetwork.Instantiate, make sure to enable receiving events from that group before. Otherwise the prefab will not be instantiated locally.

PhotonView

PhotonViews attached to prefabs will automatically get the Interest Group passed to the PhotonNetwork.Instantiate call.
By default, it is 0.
If it's not 0, joining clients will likely not execute Instantiate for groups != 0.

You can set or update a PhotonView's Interest Group via code as follows:

C#

photonView.group = interestGroupCode;

Setting a view's group is done locally only - remote instances keep the group which was set when instantiating the GameObject.

PunRPCs and PhotonView serialization/synchronization events will be sent only to the Interest Group configured for the respective PhotonView unless it was disabled using SetSendingEnabled.
So usually, the updates can be filtered server-side with the SetInterestGroup settings of the receiving clients.

RaiseEvent

To set the target Interest Group when calling PhotonNetwork.RaiseEvent use RaiseEventOptions.InterestGroup.

Example Use Cases

Interest Groups to subscribe to, per client, can be defined dynamically at runtime or statically at compile time.
Interest Groups setup can be the same on all clients or different per client.

Interest Groups are useful to lower the number of messages per second inside rooms.
By lowering traffic, you stay below the message/second limit, cut costs and sometimes it can help you increase the number of maximum players per room.

But you can come up with other clever ways of using Interest Groups in your game.

Network Culling

Most common use case of Interest Groups is Network Culling.
Interest Groups could be mapped to areas of interest in your game.
For instance if you have a "big fat world" you can separate it into smaller chunks, let's call them "areas" and assign an interest group per "area".

The "Culling Demo" relies on Interest Groups.

Team Events

If you have teams in your game and want to implement team exclusive events, you can assign an interest group per team.
All team members should subscribe to the team's interest group.
Inter team events should be sent using the team's own group number.
Intra team events should be sent using an opponent team's group number.

Back to top