前回はPhotonView.RPC()
にて他プレイヤーのゲームにデータを受け渡しする方法を調査しました。
他にもPhotonにはPhotonNetwork.RaiseEvent()
という方法でデータを受け渡すことが出来ます。
というわけで、今回はPhotonNetwork.RaiseEvent()
ついて調べてみます。
使い方はPhotonView.RPC()
に似ているので、今回は簡単にまとめています。
この記事にはUnity5.4.1f1及びPUN1.75を使用しています。
PhotonNetwork.RaiseEvent()
コアゲーム中のデータのやり取りは、PhotonView
の機能である、PhotonView.RPC()
とOnPhotonSerializeView()
を主に使っていくと思います。
www.urablog.xyz www.urablog.xyz
上記二つの機能は便利ではあったのですが、使用には絶対にPhotonView
が必要でした。
ではコアゲームが始まる前に他プレイヤーとデータのやり取りをする際はどうすればいいのでしょうか。
ManagerクラスにPhotonView
をアタッチしてRPC()
で渡す方法もありますが、PhotonView
を持つGameObjectがない場合も考えられます。
そんなときにはPhotonNetwork.RaiseEvent()
です。
こちらはRPC()
と同じような感覚で使え、PhotonView
がなくても使える便利な機能なのです。
使い方その壱 デリゲートに登録する
PhotonNetwork.RaiseEvent()
を使う前に、PhotonNetwork.RaiseEvent()
を呼ばれた際に受け取るコールバック関数をデリゲートに登録してあげる必要があります。
OnJoinedRoom()
などと違って、関数があれば呼ばれるというわけではないので注意が必要です。
登録するデリゲートはPhotonNetwork.OnEventCall
です。
コールバック関数の型は、以下のような形になります。
https://photonengine.jp/pun-api/class_photon_network.html#a90ec16d1df1a0332d0ad16493d641f56
delegate void PhotonNetwork.EventCallback( byte eventCode, object content, int senderId )
eventCode
着信したイベント識別用のタイプID。
PhotonNetwork.RaiseEvent()
呼出し時にユーザーが任意で指定できる。content
届けられた情報。
object型なので、任意の型にキャストして使用する。senderId
このイベントを送信したプレイヤーのID。
キャッシュなどでルームがイベントを送信した場合は、0が渡されるもよう。
使い方その弐 RaiseEvent()を呼ぶ
コールバック関数をデリゲートに登録したら、PhotonNetwork.RaiseEvent()
を呼んでみましょう。
イベントをプレイヤーが受け取った場合は、先ほど登録したコールバック関数が呼ばれます。
PhotonNetwork.RaiseEvent()
に渡す引数は以下の通りです。
https://photonengine.jp/pun-api/class_photon_network.html#aa9088b089a8c1b3548f8a7a792146e50
bool RaiseEvent( byte eventCode, object eventContent, bool sendReliable, RaiseEventOptions options )
eventCode
ユーザーが任意で指定出来るイベント識別用のタイプ。enumや固定値を使うとスクリプトが見やすくなるかも。
使える数値は 0 ~ 199 までの数値が使えます。eventContent
イベント情報として他プレイヤーなどに渡すデータです。
シリアライズ可能な型ならなんでも放り込こんで渡すことが出来ます。
シリアライズできる型については前回の内容をご参考くだされ。
【Unity】僕もPhotonを使いたい #09 RPC() シリアライズ編 - 徳島ゲーム開発ごっこ 技術ブログsendReliable
イベントが届いたか確認する、とあるのだが、よくわからなかった引数。
trueにすれば信頼性があがるのか、falseにすれば通信速度が早くなるのか、よくわからない……。
とりあえず、trueを渡しておこうかな……。options
いろいろな追加設定を指定できるみたいです。
くわしくは後程。
使い方その参 サンプルコード
using UnityEngine; using UnityEngine.UI; public enum EEventType : byte { Hello = 1, } public class DemoObject : MonoBehaviour { [SerializeField] private Text m_eventLog = null; void Awake() { PhotonNetwork.OnEventCall += OnRaiseEvent; } public void Hello() { PhotonNetwork.RaiseEvent( (byte)EEventType.Hello, "Hello!", true, RaiseEventOptions.Default ); } private void OnRaiseEvent( byte i_eventcode, object i_content, int i_senderid ) { string eventMessage = null; var eventType = (EEventType)i_eventcode; switch( eventType ) { case EEventType.Hello: eventMessage = string.Format( "[{0}] {1} - Sender({2})", eventType, (string)i_content, i_senderid ); break; default: break; } if( !string.IsNullOrEmpty( eventMessage ) ) { m_eventLog.text += eventMessage + System.Environment.NewLine; } } } // class DemoObject
イベントが受け取れました。
PhotonNetwork.RaiseEvent()
はオプションがデフォルトならば、自分以外のプレイヤーのみにイベントを送信する設定になっています。
使い方その肆 オプションを使う
イベント送信時のオプション情報をPhotonNetwork.RaiseEvent()
の第四引数に設定することが出来ます。
以下のスクリプトリファレンスをご参考ください。
https://photonengine.jp/pun-api/class_raise_event_options.html
以下のスクリプトのように指定することが出来ます。
public void Hello() { var option = new RaiseEventOptions() { CachingOption = EventCaching.DoNotCache, Receivers = ReceiverGroup.All, }; PhotonNetwork.RaiseEvent( (byte)EEventType.Hello, "Hello!", true, option ); }
結構いろいろなオプションがあります。
今回は主要なものを使用してみます。
ReceiverGroup Receivers
https://photonengine.jp/pun-api/namespace_exit_games_1_1_client_1_1_photon.html#a73fefe1509e4ac1eb48e279422ec82bd
イベントを送信する相手を指定できます。
RPC()
のPhotonTargets
と同じなので使いやすいです。Others(デフォルト)
自分以外のプレイヤーに送信する。All
全員に送信する。MasterClient
MasterClientにのみ送信する。
EventCaching CachingOption
https://photonengine.jp/pun-api/namespace_exit_games_1_1_client_1_1_photon.html#a854484e793ad0027fa7e3245f9858e53
送信したイベントをキャッシュしておいて、あとからルームに入ったプレイヤーにも情報が取得できるかの設定できます。
RPC()
のPhotonTargets.AllBuffered
などのBufferedタイプと同じような感じです。
キャッシュ済みのイベントを消したりもできちゃうみたいです。DoNotCache(デフォルト)
キャッシュしない。AddToRoomCache
ルームにイベントをキャッシュしておく。RemoveFromRoomCache
キャッシュされているイベントを削除する。など
int[] TargetActors
イベントの送信プレイヤーをプレイヤーのIDで直接指定が出来まるみたいです。
public void Hello() { var option = new RaiseEventOptions() { TargetActors = new int[] { 2, 3 }, Receivers = ReceiverGroup.All, }; PhotonNetwork.RaiseEvent( (byte)EEventType.Hello, "Hello!", true, option ); }
指定したプレイヤーIDのプレイヤーのみにイベントが送信されています。
PhotonNetwork.RaiseEvent()
もなかなか便利そうですね。
コアゲーム開始前の各プレイヤーの情報送信に使えそうです。