Photon Unity Networking
v1.91
|
Groups the most important classes that you need to understand early on. More...
Classes | |
interface | IPunObservable |
Defines the OnPhotonSerializeView method to make it easy to implement correctly for observable scripts. More... | |
interface | IPunCallbacks |
This interface is used as definition of all callback methods of PUN, except OnPhotonSerializeView. Preferably, implement them individually. More... | |
class | Photon.PunBehaviour |
This class provides a .photonView and all callbacks/events that PUN can call. Override the events/methods you want to use. More... | |
struct | PhotonMessageInfo |
Container class for info about a particular message, RPC or update. More... | |
class | PhotonStream |
This container is used in OnPhotonSerializeView() to either provide incoming data of a PhotonView or for you to provide it. More... | |
class | PhotonNetwork |
The main class to use the PhotonNetwork plugin. This class is static. More... | |
class | PhotonPlayer |
Summarizes a "player" within a room, identified (in that room) by actorID. More... | |
class | PhotonView |
PUN's NetworkView replacement class for networking. Use it like a NetworkView. More... | |
class | Room |
This class resembles a room that PUN joins (or joined). The properties are settable as opposed to those of a RoomInfo and you can close or hide "your" room. More... | |
class | RoomInfo |
A simplified room with just the info required to list and join, used for the room listing in the lobby. The properties are not settable (open, MaxPlayers, etc). More... | |
Functions | |
void | IPunObservable.OnPhotonSerializeView (PhotonStream stream, PhotonMessageInfo info) |
Called by PUN several times per second, so that your script can write and read synchronization data for the PhotonView. More... | |
Detailed Description
Groups the most important classes that you need to understand early on.
Enumeration Type Documentation
enum ClientState |
Detailed connection / networking peer state. PUN implements a loadbalancing and authentication workflow "behind the scenes", so some states will automatically advance to some follow up state. Those states are commented with "(will-change)".
Enumerator | |
---|---|
Uninitialized |
Not running. Only set before initialization and first use. |
PeerCreated |
Created and available to connect. |
Queued |
Not used at the moment. |
Authenticated |
The application is authenticated. PUN usually joins the lobby now. (will-change) Unless AutoJoinLobby is false. |
JoinedLobby |
Client is in the lobby of the Master Server and gets room listings. Use Join, Create or JoinRandom to get into a room to play. |
DisconnectingFromMasterserver |
Disconnecting. (will-change) |
ConnectingToGameserver |
Connecting to game server (to join/create a room and play). (will-change) |
ConnectedToGameserver |
Similar to Connected state but on game server. Still in process to join/create room. (will-change) |
Joining |
In process to join/create room (on game server). (will-change) |
Joined |
Final state of a room join/create sequence. This client can now exchange events / call RPCs with other clients. |
Leaving |
Leaving a room. (will-change) |
DisconnectingFromGameserver |
Workflow is leaving the game server and will re-connect to the master server. (will-change) |
ConnectingToMasterserver |
Workflow is connected to master server and will establish encryption and authenticate your app. (will-change) |
QueuedComingFromGameserver |
Same Queued but coming from game server. (will-change) |
Disconnecting |
PUN is disconnecting. This leads to Disconnected. (will-change) |
Disconnected |
No connection is setup, ready to connect. Similar to PeerCreated. |
ConnectedToMaster |
Final state for connecting to master without joining the lobby (AutoJoinLobby is false). |
ConnectingToNameServer |
Client connects to the NameServer. This process includes low level connecting and setting up encryption. When done, state becomes ConnectedToNameServer. |
ConnectedToNameServer |
Client is connected to the NameServer and established enctryption already. You should call OpGetRegions or ConnectToRegionMaster. |
DisconnectingFromNameServer |
When disconnecting from a Photon NameServer. (will-change) |
Authenticating |
When connecting to a Photon Server, this state is intermediate before you can call any operations. (will-change) |
enum DisconnectCause |
Summarizes the cause for a disconnect. Used in: OnConnectionFail and OnFailedToConnectToPhoton.
Extracted from the status codes from ExitGames.Client.Photon.StatusCode.
- See also
- PhotonNetworkingMessage
Enumerator | |
---|---|
DisconnectByServerUserLimit |
Server actively disconnected this client. Possible cause: The server's user limit was hit and client was forced to disconnect (on connect). |
ExceptionOnConnect |
Connection could not be established. Possible cause: Local server not running. |
DisconnectByServerTimeout |
Timeout disconnect by server (which decided an ACK was missing for too long). |
DisconnectByServerLogic |
Server actively disconnected this client. Possible cause: Server's send buffer full (too much data for client). |
Exception |
Some exception caused the connection to close. |
InvalidAuthentication |
(32767) The Photon Cloud rejected the sent AppId. Check your Dashboard and make sure the AppId you use is complete and correct. |
MaxCcuReached |
(32757) Authorization on the Photon Cloud failed because the concurrent users (CCU) limit of the app's subscription is reached. |
InvalidRegion |
(32756) Authorization on the Photon Cloud failed because the app's subscription does not allow to use a particular region's server. |
SecurityExceptionOnConnect |
The security settings for client or server don't allow a connection (see remarks). A common cause for this is that browser clients read a "crossdomain" file from the server. If that file is unavailable or not configured to let the client connect, this exception is thrown. Photon usually provides this crossdomain file for Unity. If it fails, read: https://doc.photonengine.com/en-us/onpremise/current/operations/policy-files |
DisconnectByClientTimeout |
Timeout disconnect by client (which decided an ACK was missing for too long). |
InternalReceiveException |
Exception in the receive-loop. Possible cause: Socket failure. |
AuthenticationTicketExpired |
(32753) The Authentication ticket expired. Handle this by connecting again (which includes an authenticate to get a fresh ticket). |
enum PhotonLogLevel |
Used to define the level of logging output created by the PUN classes. Either log errors, info (some more) or full.
This enum defines the set of MonoMessages Photon Unity Networking is using as callbacks. Implemented by PunBehaviour.
Much like "Update()" in Unity, PUN will call methods in specific situations. Often, these methods are triggered when network operations complete (example: when joining a room).
All those methods are defined and described in this enum and implemented by PunBehaviour (which makes it easy to implement them as override).
Each entry is the name of such a method and the description tells you when it gets used by PUN.
Make sure to read the remarks per entry as some methods have optional parameters.
Enumerator | |
---|---|
OnConnectedToPhoton |
Called when the initial connection got established but before you can use the server. OnJoinedLobby() or OnConnectedToMaster() are called when PUN is ready. This callback is only useful to detect if the server can be reached at all (technically). Most often, it's enough to implement OnFailedToConnectToPhoton() and OnDisconnectedFromPhoton(). OnJoinedLobby() or OnConnectedToMaster() are called when PUN is ready. When this is called, the low level connection is established and PUN will send your AppId, the user, etc in the background. This is not called for transitions from the masterserver to game servers. Example: void OnConnectedToPhoton() { ... } |
OnLeftRoom |
Called when the local user/client left a room. When leaving a room, PUN brings you back to the Master Server. Before you can use lobbies and join or create rooms, OnJoinedLobby() or OnConnectedToMaster() will get called again. Example: void OnLeftRoom() { ... } |
OnMasterClientSwitched |
Called after switching to a new MasterClient when the current one leaves. This is not called when this client enters a room. The former MasterClient is still in the player list when this method get called. Example: void OnMasterClientSwitched(PhotonPlayer newMasterClient) { ... } |
OnPhotonCreateRoomFailed |
Called when a CreateRoom() call failed. Optional parameters provide ErrorCode and message. Most likely because the room name is already in use (some other client was faster than you). PUN logs some info if the PhotonNetwork.logLevel is >= PhotonLogLevel.Informational. Example: void OnPhotonCreateRoomFailed() { ... } Example: void OnPhotonCreateRoomFailed(object[] codeAndMsg) { // codeAndMsg[0] is short ErrorCode. codeAndMsg[1] is string debug msg. } |
OnPhotonJoinRoomFailed |
Called when a JoinRoom() call failed. Optional parameters provide ErrorCode and message. Most likely error is that the room does not exist or the room is full (some other client was faster than you). PUN logs some info if the PhotonNetwork.logLevel is >= PhotonLogLevel.Informational. Example: void OnPhotonJoinRoomFailed() { ... } Example: void OnPhotonJoinRoomFailed(object[] codeAndMsg) { // codeAndMsg[0] is short ErrorCode. codeAndMsg[1] is string debug msg. } |
OnCreatedRoom |
Called when this client created a room and entered it. OnJoinedRoom() will be called as well. This callback is only called on the client which created a room (see PhotonNetwork.CreateRoom). As any client might close (or drop connection) anytime, there is a chance that the creator of a room does not execute OnCreatedRoom. If you need specific room properties or a "start signal", it is safer to implement OnMasterClientSwitched() and to make the new MasterClient check the room's state. Example: void OnCreatedRoom() { ... } |
OnJoinedLobby |
Called on entering a lobby on the Master Server. The actual room-list updates will call OnReceivedRoomListUpdate(). Note: When PhotonNetwork.autoJoinLobby is false, OnConnectedToMaster() will be called and the room list won't become available. While in the lobby, the roomlist is automatically updated in fixed intervals (which you can't modify). The room list gets available when OnReceivedRoomListUpdate() gets called after OnJoinedLobby(). Example: void OnJoinedLobby() { ... } |
OnLeftLobby |
Called after leaving a lobby. When you leave a lobby, CreateRoom and JoinRandomRoom automatically refer to the default lobby. Example: void OnLeftLobby() { ... } |
OnDisconnectedFromPhoton |
Called after disconnecting from the Photon server. In some cases, other callbacks are called before OnDisconnectedFromPhoton is called. Examples: OnConnectionFail() and OnFailedToConnectToPhoton(). Example: void OnDisconnectedFromPhoton() { ... } |
OnConnectionFail |
Called when something causes the connection to fail (after it was established), followed by a call to OnDisconnectedFromPhoton(). If the server could not be reached in the first place, OnFailedToConnectToPhoton is called instead. The reason for the error is provided as StatusCode. Example: void OnConnectionFail(DisconnectCause cause) { ... } |
OnFailedToConnectToPhoton |
Called if a connect call to the Photon server failed before the connection was established, followed by a call to OnDisconnectedFromPhoton(). OnConnectionFail only gets called when a connection to a Photon server was established in the first place. Example: void OnFailedToConnectToPhoton(DisconnectCause cause) { ... } |
OnReceivedRoomListUpdate |
Called for any update of the room-listing while in a lobby (PhotonNetwork.insideLobby) on the Master Server or when a response is received for PhotonNetwork.GetCustomRoomList(). PUN provides the list of rooms by PhotonNetwork.GetRoomList(). Not all types of lobbies provide a listing of rooms to the client. Some are silent and specialized for server-side matchmaking. Example: void OnReceivedRoomListUpdate() { ... } |
OnJoinedRoom |
Called when entering a room (by creating or joining it). Called on all clients (including the Master Client). This method is commonly used to instantiate player characters. If a match has to be started "actively", you can instead call an PunRPC triggered by a user's button-press or a timer. When this is called, you can usually already access the existing players in the room via PhotonNetwork.playerList. Also, all custom properties should be already available as Room.customProperties. Check Room.playerCount to find out if enough players are in the room to start playing. Example: void OnJoinedRoom() { ... } |
OnPhotonPlayerConnected |
Called when a remote player entered the room. This PhotonPlayer is already added to the playerlist at this time. If your game starts with a certain number of players, this callback can be useful to check the Room.playerCount and find out if you can start. Example: void OnPhotonPlayerConnected(PhotonPlayer newPlayer) { ... } |
OnPhotonPlayerDisconnected |
Called when a remote player left the room. This PhotonPlayer is already removed from the playerlist at this time. When your client calls PhotonNetwork.leaveRoom, PUN will call this method on the remaining clients. When a remote client drops connection or gets closed, this callback gets executed. after a timeout of several seconds. Example: void OnPhotonPlayerDisconnected(PhotonPlayer otherPlayer) { ... } |
OnPhotonRandomJoinFailed |
Called after a JoinRandom() call failed. Optional parameters provide ErrorCode and message. Most likely all rooms are full or no rooms are available. When using multiple lobbies (via JoinLobby or TypedLobby), another lobby might have more/fitting rooms. PUN logs some info if the PhotonNetwork.logLevel is >= PhotonLogLevel.Informational. Example: void OnPhotonRandomJoinFailed() { ... } Example: void OnPhotonRandomJoinFailed(object[] codeAndMsg) { // codeAndMsg[0] is short ErrorCode. codeAndMsg[1] is string debug msg. } |
OnConnectedToMaster |
Called after the connection to the master is established and authenticated but only when PhotonNetwork.autoJoinLobby is false. If you set PhotonNetwork.autoJoinLobby to true, OnJoinedLobby() will be called instead of this. You can join rooms and create them even without being in a lobby. The default lobby is used in that case. The list of available rooms won't become available unless you join a lobby via PhotonNetwork.joinLobby. Example: void OnConnectedToMaster() { ... } |
OnPhotonSerializeView |
Implement to customize the data a PhotonView regularly synchronizes. Called every 'network-update' when observed by PhotonView. This method will be called in scripts that are assigned as Observed component of a PhotonView. PhotonNetwork.sendRateOnSerialize affects how often this method is called. PhotonNetwork.sendRate affects how often packages are sent by this client. Implementing this method, you can customize which data a PhotonView regularly synchronizes. Your code defines what is being sent (content) and how your data is used by receiving clients. Unlike other callbacks, OnPhotonSerializeView only gets called when it is assigned to a PhotonView as PhotonView.observed script. To make use of this method, the PhotonStream is essential. It will be in "writing" mode" on the client that controls a PhotonView (PhotonStream.isWriting == true) and in "reading mode" on the remote clients that just receive that the controlling client sends. If you skip writing any value into the stream, PUN will skip the update. Used carefully, this can conserve bandwidth and messages (which have a limit per room/second). Note that OnPhotonSerializeView is not called on remote clients when the sender does not send any update. This can't be used as "x-times per second Update()". Example: void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) { ... } |
OnPhotonInstantiate |
Called on all scripts on a GameObject (and children) that have been Instantiated using PhotonNetwork.Instantiate. PhotonMessageInfo parameter provides info about who created the object and when (based off PhotonNetworking.time). Example: void OnPhotonInstantiate(PhotonMessageInfo info) { ... } |
OnPhotonMaxCccuReached |
Because the concurrent user limit was (temporarily) reached, this client is rejected by the server and disconnecting. When this happens, the user might try again later. You can't create or join rooms in OnPhotonMaxCcuReached(), cause the client will be disconnecting. You can raise the CCU limits with a new license (when you host yourself) or extended subscription (when using the Photon Cloud). The Photon Cloud will mail you when the CCU limit was reached. This is also visible in the Dashboard (webpage). Example: void OnPhotonMaxCccuReached() { ... } |
OnPhotonCustomRoomPropertiesChanged |
Called when a room's custom properties changed. The propertiesThatChanged contains all that was set via Room.SetCustomProperties. Since v1.25 this method has one parameter: Hashtable propertiesThatChanged. Changing properties must be done by Room.SetCustomProperties, which causes this callback locally, too. Example: void OnPhotonCustomRoomPropertiesChanged(Hashtable propertiesThatChanged) { ... } |
OnPhotonPlayerPropertiesChanged |
Called when custom player-properties are changed. Player and the changed properties are passed as object[]. Since v1.25 this method has one parameter: object[] playerAndUpdatedProps, which contains two entries. We are using a object[] due to limitations of Unity's GameObject.SendMessage (which has only one optional parameter). Changing properties must be done by PhotonPlayer.SetCustomProperties, which causes this callback locally, too. Example: void OnPhotonPlayerPropertiesChanged(object[] playerAndUpdatedProps) { PhotonPlayer player = playerAndUpdatedProps[0] as PhotonPlayer; Hashtable props = playerAndUpdatedProps[1] as Hashtable; //... } |
OnUpdatedFriendList |
Called when the server sent the response to a FindFriends request and updated PhotonNetwork.Friends. The friends list is available as PhotonNetwork.Friends, listing name, online state and the room a user is in (if any). Example: void OnUpdatedFriendList() { ... } |
OnCustomAuthenticationFailed |
Called when the custom authentication failed. Followed by disconnect! Custom Authentication can fail due to user-input, bad tokens/secrets. If authentication is successful, this method is not called. Implement OnJoinedLobby() or OnConnectedToMaster() (as usual). During development of a game, it might also fail due to wrong configuration on the server side. In those cases, logging the debugMessage is very important. Unless you setup a custom authentication service for your app (in the Dashboard), this won't be called! Example: void OnCustomAuthenticationFailed(string debugMessage) { ... } |
OnCustomAuthenticationResponse |
Called when your Custom Authentication service responds with additional data. Custom Authentication services can include some custom data in their response. When present, that data is made available in this callback as Dictionary. While the keys of your data have to be strings, the values can be either string or a number (in Json). You need to make extra sure, that the value type is the one you expect. Numbers become (currently) int64. Example: void OnCustomAuthenticationResponse(Dictionary<string, object> data) { ... } https://doc.photonengine.com/en-us/pun/current/connection-and-authentication/custom-authentication |
OnWebRpcResponse |
Called by PUN when the response to a WebRPC is available. See PhotonNetwork.WebRPC. Important: The response.ReturnCode is 0 if Photon was able to reach your web-service. The content of the response is what your web-service sent. You can create a WebResponse instance from it. Example: WebRpcResponse webResponse = new WebRpcResponse(operationResponse); Please note: Class OperationResponse is in a namespace which needs to be "used": using ExitGames.Client.Photon; // includes OperationResponse (and other classes) The OperationResponse.ReturnCode by Photon is: 0 for "OK" -3 for "Web-Service not configured" (see Dashboard / WebHooks) -5 for "Web-Service does now have RPC path/name" (at least for Azure) Example: void OnWebRpcResponse(OperationResponse response) { ... } |
OnOwnershipRequest |
Called when another player requests ownership of a PhotonView from you (the current owner). The parameter viewAndPlayer contains: PhotonView view = viewAndPlayer[0] as PhotonView; PhotonPlayer requestingPlayer = viewAndPlayer[1] as PhotonPlayer; void OnOwnershipRequest(object[] viewAndPlayer) {} // |
OnLobbyStatisticsUpdate |
Called when the Master Server sent an update for the Lobby Statistics, updating PhotonNetwork.LobbyStatistics. This callback has two preconditions: EnableLobbyStatistics must be set to true, before this client connects. And the client has to be connected to the Master Server, which is providing the info about lobbies. |
OnPhotonPlayerActivityChanged |
Called when a remote Photon Player activity changed. This will be called ONLY is PlayerTtl is greater then 0. Use 0. If true, the player is not gett...">PhotonPlayer.IsInactive to check the current activity state Example: void OnPhotonPlayerActivityChanged(PhotonPlayer otherPlayer) {...} This callback has precondition: PlayerTtl must be greater then 0 |
OnOwnershipTransfered |
Called when a PhotonView Owner is transfered to a Player. The parameter viewAndPlayers contains: PhotonView view = viewAndPlayers[0] as PhotonView; PhotonPlayer newOwner = viewAndPlayers[1] as PhotonPlayer; PhotonPlayer oldOwner = viewAndPlayers[2] as PhotonPlayer; void OnOwnershipTransfered(object[] viewAndPlayers) {} // |
enum PhotonTargets |
Enum of "target" options for RPCs. These define which remote clients get your RPC call.
Function Documentation
void IPunObservable.OnPhotonSerializeView | ( | PhotonStream | stream, |
PhotonMessageInfo | info | ||
) |
Called by PUN several times per second, so that your script can write and read synchronization data for the PhotonView.
This method will be called in scripts that are assigned as Observed component of a PhotonView.
PhotonNetwork.sendRateOnSerialize affects how often this method is called.
PhotonNetwork.sendRate affects how often packages are sent by this client.
Implementing this method, you can customize which data a PhotonView regularly synchronizes. Your code defines what is being sent (content) and how your data is used by receiving clients.
Unlike other callbacks, OnPhotonSerializeView only gets called when it is assigned to a PhotonView as PhotonView.observed script.
To make use of this method, the PhotonStream is essential. It will be in "writing" mode" on the client that controls a PhotonView (PhotonStream.isWriting == true) and in "reading mode" on the remote clients that just receive that the controlling client sends.
If you skip writing any value into the stream, PUN will skip the update. Used carefully, this can conserve bandwidth and messages (which have a limit per room/second).
Note that OnPhotonSerializeView is not called on remote clients when the sender does not send any update. This can't be used as "x-times per second Update()".
Implemented in PhotonAnimatorView, PhotonTransformView, PhotonRigidbody2DView, and PhotonRigidbodyView.