徳島ゲーム開発ごっこ 技術ブログ

ゲームを作るために役に立ったり立たなかったりする技術を学んでいきます!

【Unity】僕もPhotonを使いたい #10 RaiseEvent

 前回は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がなくても使える便利な機能なのです。

doc.photonengine.com

使い方その壱 デリゲートに登録する

 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

f:id:urahimono:20160923074029g:plain

 イベントが受け取れました。
 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 );
}

f:id:urahimono:20160923074030g:plain

 指定したプレイヤーIDのプレイヤーのみにイベントが送信されています。

 PhotonNetwork.RaiseEvent()もなかなか便利そうですね。
 コアゲーム開始前の各プレイヤーの情報送信に使えそうです。

 次回 www.urablog.xyz

 前回 www.urablog.xyz