This document is about: PUN 2
SWITCH TO

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

.Netコールバック

C# SDKはクラスで実装可能なコールバックを提供しています:

Photon Realtime C# SDKコールバックインターフェース:

  • IConnectionCallbacks: 接続関連のコールバック。
  • IInRoomCallbacks: ルーム内で発生するコールバック。
  • ILobbyCallbacks: ロビー関連のコールバック。
  • IMatchmakingCallbacks: マッチメイキング関連のコールバック。
  • IOnEventCallback: 受信したイベントのシングルコールバック。 C#イベントLoadBalancingClient.EventReceivedと同等です。
  • IWebRpcCallback: 受信中のWebRPCオペレーション応答のシングルコールバック。
  • IOnErrorInfoCallback: ErrorInfoイベントを受信するシングルコールバック。

PUN 2用のコールバックインターフェース:

Photon Realtime C#のほかに、PUN2には特別なインターフェースがあります。
ここでは「スコープ」と処理方法に基づいて2つのグループにわけてご紹介します。:

  • 一般的なコールバックインターフェース:

  • IPunInstantiateMagicCallback:インスタンス化したPUNプレハブのシングルコールバック。

  • IPunOwnershipCallbacks: PUNオーナーシップ移行コールバック。

  • PhotonViewコールバックインターフェース:

  • IPunObservable: PhotonViewシリアライゼーションコールバック。

  • IOnPhotonViewPreNetDestroy: PhotonViewネットワークオブジェクトを破壊する前の OnPreNetDestroy()コールバック。

  • IOnPhotonViewControllerChange: コントローラーが変わった場合のOnControllerChange()コールバック。

  • IOnPhotonViewOwnerChange: オーナーが変わった場合のOnOwnerChange() コールバック。

IPunInstantiateMagicCallbackを除く、Photon Realtimeまたは一般的なPUN 2コールバックインターフェースを実装するすべてのクラスを登録・登録解除する必要があります。
PhotonNetwork.AddCallbackTarget(this)PhotonNetwork.RemoveCallbackTarget(this)を呼び出してください。

IPunObservableを除くPhotonViewコールバックインターフェースを実装しているすべてのクラスは登録・登録解除する必要があります。
photonView.AddCallbackTarget(this)photonView.RemoveCallbackTarget(this)を呼び出してください。
IPunObservableインターフェースはインスペクターを通して処理され、Add/Remove(追加・削除)システムの一部ではありません。

例えばUnityでは、MonoBehaviourOnEnable()OnDisable()を使用できました。

これらのインターフェースの実装は任意ですが、コードの可読性と管理のしやすさを上げることから推奨しています。
また、ロジックの実行タイミングが的確に提供されるのでPhotonのフローとステートの管理がしやすくなります。
他の代替案では、ステートフラグフィールドの使用やポーリングでクライアントのネットワーク状況を確認したりすべてのネットワーククライアントの変更や受信したイベント、操作方法へのサブスクライビングが必要な場合があります。
これには、Photonの内部や仮想レベルについての精通した知識が必要とされますが、これに頭を悩ませることなく、ゲームに集中することもできます。

If an unhandled (uncaught) exception occurs in one of the implemented interfaces' callbacks' methods, all other implemented ones for the same interface, same signature and not already called, won't be called. This is due to the fact that we call the implemented interface callback methods of the same signature in a loop with by the order of registration (which could be random in Unity if you register in MonoBehaviour methods).

コールバックシステムを実装するよりもインターフェースを選んだほうがいい理由:

  • 確実にコールバックメソッドのシグネチャに注意が払われるようになる。これはインターフェースの実装時コンパイラによって保証される。
  • 論理的に関連のあるコールバックをシングルクラスへグループ化する
  • コールバックを備える他のメソッドと比べて、不要なデータのオーバーヘッドが少なくメモリリークを防ぐことができる

If you happen to have a method that has the exact signature as one of the callbacks' interfaces' methods or you wish to hide the callbacks methods (unless a cast is made) you could choose explicit interface implementation.

MonoBehaviourPunCallbacksクラスからの継承が、PUN2コールバックを実装するのに最も簡単で迅速な方法です :

  • 必要なコールバックだけを選択して上書きできるMonoBehaviourです。
  • 次のほとんどを実装するので、コールバックのインターフェースを覚える必要がありません。: IConnectionCallbacks, IMatchmakingCallbacksIInRoomCallbacksILobbyCallbacksIWebRpcCallback
  • コールバックの登録、登録解除を自動で処理します。 (OnEnable()OnDisable()のそれぞれにおいて)
  • 同じGameObjectに後者が添付されている場合、PhotonViewをプロパティで簡単に表示させるMonoBehaviourPunを拡張します。

ただし、以下のことにも気をつけなければいけません:

  • ほとんどのコールバックインターフェースを実装しますが、すべてではありません。
    IOnEventCallbackやPUN固有のコールバックは実装していません。
    PUN2のユーティリティインターフェースもまた、IPunTurnManagerCallbacksなどを実装していません。
  • MonoBehaviourPunCallbacksを拡張する場合、OnEnable() and OnDisable()を上書きする場合は、忘れずに基底クラスメソッドを呼び出してください。
  • PhotonViewと同じようにGameObjectにコンポーネントが添付されていないと、MonoBehaviourPunCallbacks.photonViewはnull(そして無駄なもの)になってしまいます。
Back to top