2014年12月14日日曜日

【Unity、PUN】Photon Unity Networkingのコールバックメソッド一覧


PhotonCloudを使えばUnityで簡単にオンラインゲームが作れますね。

接続に失敗したとき、部屋に誰か入ってきたとき、など
ことあるごとに呼び出されるコールバックメソッドたち。
インテリセンスも効かないし毎度調べるのも面倒なので一覧にしてみた。

誰かが作ってたと思うけど自分用にまとめ直し。
ちなみに超適当和訳なので怪しいと思ったら原文読んでください。
(PhotonNetworkingMessage列挙型のXMLコメントに全て書かれてます)

もうちょい使ったらよく使うもの同士まとめた記事も書こうとおもう。

OnConnectedToPhoton

/// <summary>
/// サーバーへの初期接続が確立したとき呼び出されます。
/// </summary>
/// <remarks>
/// このコールバックはサーバーとの通信が可能かどうかの判断をするためにみ有効です。
/// ほとんどの場合、OnFailedToConnectToPhoton()もしくはOnDisconnectedFromPhoton()で十分です。
/// これが呼び出ばれたときには低レベルでの接続は確率されています。
/// この後、PUNはAppIDやユーザー、その他の情報をバッググラウンドで送信します。
/// また、マスターサーバーからゲームサーバーへ移った際には呼び出されません。
/// </remarks>
void OnConnectedToPhoton(){}

OnLeftRoom

/// <summary>
/// ローカルユーザー、クライアントが部屋を出たときに呼び出されます。
/// </summary>
/// <remarks>
/// 部屋を出るとき、PUNはあなたをマスターサーバーへ移動させます。
/// あなたがロビーを使う前、もしくは部屋に入る(作る)前、
/// OnJoinedLobby() もしくは OnConnectedToMaster() が再度呼び出されます。
/// </remarks>
void OnLeftRoom(){}

OnMasterClientSwitched

/// <summary>
/// マスタークライアントが退場し、新しいマスタークライアントに切り替わった後に呼び出されます。
/// 古いマスタークライアントは既にプレイヤー一覧からは削除されています。
/// </summary>
/// <remarks>
/// このクライアントが部屋に入ったときには、このコールバックは呼び出されません。
/// </remarks>
void OnMasterClientSwitched(PhotonPlayer newMasterClient){}

OnPhotonCreateRoomFailed

/// <summary>
/// CreateRoom()の呼び出しが失敗した場合に呼び出されます。
/// オプションパラメータによってエラーコードおよびエラーメッセージを提供します。
/// </summary>
/// <remarks>
/// よくあるのは「指定した部屋名がすでに使用されている」などです。
/// PhotonNetwork.logLevel を PhotonLogLevel.Informational 以上二している場合、
/// PUNはいくつかの情報をログ出力します。
/// </remarks>
void OnPhotonCreateRoomFailed(){}
void OnPhotonCreateRoomFailed(object[] codeAndMsg){
 //codeAndMsg[0]は エラーコード です。(int)
 //codeAndMsg[1]は デバッグメッセージ です。(string)
}

OnPhotonJoinRoomFailed

/// <summary>
/// JoinRoom()の呼び出しが失敗した場合に呼び出されます。
/// オプションパラメータによってエラーコードおよびエラーメッセージを提供します。
/// </summary>
/// <remarks>
/// よくあるのは「部屋が存在しない」「すでに満員」などです。
/// PhotonNetwork.logLevel を PhotonLogLevel.Informational 以上二している場合、
/// PUNはいくつかの情報をログ出力します。
/// </remarks>
void OnPhotonJoinRoomFailed(){}
void OnPhotonJoinRoomFailed(object[] codeAndMsg){
 //codeAndMsg[0]は エラーコード です。(int)
 //codeAndMsg[1]は デバッグメッセージ です。(string)
}

OnCreatedRoom

/// <summary>
/// このクライアントが部屋を作成し、入室する際に呼び出されます。
/// この後、OnJoinedRoom() は同様に呼び出されます。
/// </summary>
/// <remarks>
/// このコールバックは部屋を作成(PhotonNetwork.CreateRoom)したクライアント上でのみ、呼び出されます。
/// クライアントはいつでも閉じる(もしくは接続を切る)可能性があり、
/// タイミングによってはOnCreatedRoomは呼び出されません。
/// 
/// もし部屋に関する特定のプロパティや"開始信号"が必要な場合、
/// 部屋の状態を確認するためにマスタークライアントを作り、
/// OnMasterClientSwitched()を実装するのが安全です。
/// </remarks>
void OnCreatedRoom(){}

OnJoinedLobby

/// <summary>
/// マスターサーバー上のロビーに入った際に呼び出されます。
/// 部屋のリストが更新されるとOnReceivedRoomListUpdate()が呼び出されます。
/// </summary>
/// <remarks>
/// 注意:PhotonNetwork.autoJoinLobby が false の場合、
/// OnConnectedToMaster() が呼び出され、部屋のリストが利用可能になることはありません。
/// 
/// ロビーに居る間、部屋のリストは自動的に一定間隔で更新されます。
/// (間隔はあなたが変更する事はできません。)
/// </remarks>
void OnJoinedLobby(){}

OnLeftLobby

/// <summary>
/// ロビーを退出した際に呼び出されます。
/// </summary>
/// <remarks>
/// (よくわからんかった。以下原文)
/// When you leave a lobby, [CreateRoom](@ref PhotonNetwork.CreateRoom) and [JoinRandomRoom](@ref PhotonNetwork.JoinRandomRoom) 
/// automatically refer to the default lobby. 
/// </remarks>
void OnLeftLobby(){}

OnDisconnectedFromPhoton

/// <summary>
/// Photonサーバーから切断した際に呼び出されます。
/// </summary>
/// <remarks>
/// いくつかのケースでは、OnDisconnectedFromPhoton()の前に他のコールバックが呼び出されます。
/// 例)OnConnectionFail() や OnFailedToConnectToPhoton()
/// </remarks>
void OnDisconnectedFromPhoton(){}

OnConnectionFail

/// <summary>
/// 何らかの原因で接続が失敗した際に OnDisconnectedFromPhoton() に続いて呼び出されます。
/// </summary>
/// <remarks>
/// サーバーへ到達できない場合は代わりに OnFailedToConnectToPhoton()
/// が呼び出され、エラーの原因はStatusCodeとして提供されます。
/// </remarks>
void OnConnectionFail(DisconnectCause cause){}

OnFailedToConnectToPhoton

/// <summary>
/// Photonサーバーへの接続が確立される前に接続呼び出しが失敗すると呼び出されます。
/// OnDisconnectedFromPhoton() に続いて呼び出されます。
/// </summary>
/// <remarks>
/// (よくわからんかった。以下原文)
/// OnConnectionFail only gets called when a connection to a Photon server was established in the first place.
/// </remarks>
void OnFailedToConnectToPhoton(DisconnectCause cause){}

OnReceivedRoomListUpdate

/// <summary>
/// 部屋のリストが更新された場合に呼び出されます。
/// 新規か更新かの違いはありません。
/// これはマスターサーバー上のロビー内でのみ呼び出されます。
/// </summary>
/// <remarks>
/// 全てのタイプのロビーがクライアントへの部屋リスト通知を提供するわけではありません。
/// 中にはサーバーサイドでのマッチメイキングに特化し、サイレントのものもあります。
/// 
/// PUNでは PhotonNetwork.GetRoomList() による部屋リストの取得が可能です。
/// 取得される各項目はカスタムプロパティを含んだRoomInfoです。
/// これらの情報はロビー上で部屋を作る際に定義したものです。
/// </remarks>
void OnReceivedRoomListUpdate(){}

OnJoinedRoom

/// <summary>
/// 部屋に入った際に呼び出されます。(部屋作成時もしくは参加時)
/// これは全てのクライアント(マスタークライアント含む)で呼び出されます。
/// </summary>
/// <remarks>
/// このメソッドはプレイヤーキャラクタの生成のためによく使われます。
/// もしあなたがより"積極的に"呼び出す必要がある場合は
/// 代わりに PhotonView.RPC を利用する事が出来ます。
/// 
/// これが呼び出されたとき、
/// あなたは PhotonNetwork.playerList を介して
/// 部屋に存在するプレイヤーにアクセスできます。
/// また、Room.customProperties を介して部屋のカスタムプロパティも利用できます。
/// ゲームを開始できる人数がいるかどうかは、Room.playerCount で確認できます。
/// </remarks>
void OnJoinedRoom(){}

OnPhotonPlayerConnected

/// <summary>
/// リモートプレイヤーが部屋に入ったときに呼び出されます。
/// 入室したプレイヤーは既に PhotonNetwork.playerList に追加されています。
/// </summary>
/// <remarks>
/// もしあなたのゲームが特定の人数で始まる場合、このコールバックが役立ちます。
/// Room.playerCount を確認し、開始できるか確認しましょう。
/// </remarks>
void OnPhotonPlayerConnected(PhotonPlayer newPlayer){}

OnPhotonPlayerDisconnected

/// <summary>
/// リモートプレイヤーが部屋を抜けた際に呼び出されます。
/// 退室したプレイヤーは既に PhotonNetwork.playerList から除外されています。
/// </summary>
/// <remarks>
/// あなたのクライアントが PhotonNetwork.leaveRoom を呼び出した場合、
/// PUNは残ったクライアント上でこのメソッドを呼び出します。
/// リモートクライアントの接続が切れると、
/// 数秒後のタイムアウトの後、このコールバックが呼び出されます。
/// </remarks>
void OnPhotonPlayerDisconnected(PhotonPlayer otherPlayer){}

OnPhotonRandomJoinFailed

/// <summary>
/// JoinRandom() の呼び出しが失敗した際に呼び出されます。
/// オプションパラメータによってエラーコードおよびエラーメッセージを提供します。
/// </summary>
/// <remarks>
/// よくあるのは「全ての部屋が満員」「一つも部屋がない」などです。
/// もし(JoinLobbyやTypedLobbyを介して)複数のロビーを使用している場合、
/// 他のロビーは接続可能な部屋を持っているかもしれません。
/// PhotonNetwork.logLevel を PhotonLogLevel.Informational 以上二している場合、
/// PUNはいくつかの情報をログ出力します。
/// </remarks>
void OnPhotonRandomJoinFailed(){}
void OnPhotonRandomJoinFailed(object[] codeAndMsg){
 //codeAndMsg[0]は エラーコード です。(int)
 //codeAndMsg[1]は デバッグメッセージ です。(string)
}

OnConnectedToMaster

/// <summary>
/// PhotonNetwork.autoJoinLobby が false の状態で、
/// マスターサーバーへ接続および認証が完了した際に呼び出されます。
/// </summary>
/// <remarks>
/// もしあなたが PhotonNetwork.autoJoinLobby に true をセットしている場合、
/// これの代わりに OnJoinedLobby() が呼び出されます。
/// 
/// あなたがロビーにいない場合でも、部屋を作ったり参加したりできます。
/// デフォルトのロビーはその場合に用いられます。
/// PhotonNetwork.joinLobby によってロビーに入っている場合を除いて、
/// 利用可能な部屋のリストが更新される事はありません。
/// </remarks>
void OnConnectedToMaster(){}

OnPhotonSerializeView

/// <summary>
/// PhotonViewが定期的に同期するデータをカスタマイズするために実装します。
/// PhotonViewによってネットワークアップデートが観察されるたびに呼び出されます。
/// </summary>
/// <remarks>
/// このメソッドはPhotonViewによって監視対象にされているスクリプト上で呼び出されます。
/// PhotonNetwork.sendRateOnSerialize はこのメソッドが呼び出される頻度に影響します。
/// PhotonNetwork.sendRate はこのクライアントによってパッケージが送信される頻度に影響します。
/// 
/// このメソッドの実装によって、PhotonViewが定期的に同期するデータをカスタマイズすることができます。
/// あなたのコードは クライアントから何が送信され、何を受信するか、を定義することができます。
/// 
/// 他のコールバックとは異なり、PhotonView.observed に設定されたScriptでのみ呼び出されます。
/// 
/// このメソッドを利用するためには、PhotonStreamが必要不可欠です。
/// 書き込みを行う側のクライアント(PhotonStream.isWriting == true)と
/// 読み取りを行う側のクライアントに別れてデータの送受信を行います。
/// 
/// もし書き込みを行わないと、PUNは更新をスキップします。
/// これを利用すればネットワークの帯域幅を節約する事が出来ます。
/// 
/// 送信を行わない場合、受信側はOnPhotonSerializeViewが呼び出されていないことに注意してください。
/// そのため「x回の受信ごとに」といった処理はできません。
/// </remarks>
void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info){}

OnPhotonInstantiate

/// <summary>
/// PhotonNetwork.Instantiate によって GameObject(とその子供)が生成された際に呼び出されます。
/// </summary>
/// <remarks>
/// PhotonMessageInfoパラメータは「誰が」「いつ」作成したかを提供します。
/// (「いつ」は PhotonNetworking.time に基づきます。)
/// </remarks>
void OnPhotonInstantiate(PhotonMessageInfo info){}

OnPhotonMaxCccuReached

/// <summary>
/// CCUの制限(一時的な物)によってサーバーへの接続が切断された際に呼び出されます。
/// </summary>
/// <remarks>
/// これが発生した場合は、一定時間をおいて再試行してください。
/// これが発生した場合、すでに切断されているため部屋に入ることはできません。
///
/// あなたは新しいライセンスの適用や拡張サブスクリプションによってCCUの制限を上げる事が出来ます。
/// CCU制限に達したとき、PhotonCloudはあなたにメールを送信します。
/// また、Webページ上のダッシュボードでも確認できます。
/// </remarks>
void OnPhotonMaxCccuReached(){}

OnPhotonCustomRoomPropertiesChanged

/// <summary>
/// 部屋のカスタムプロパティが変更された際に呼び出されます。
/// 引数のpropertiesThatChanged には Room.SetCustomProperties() 
/// でセットされた全てのプロパティが含まれます。
/// </summary>
/// <remarks>
/// v1.25以降、このメソッドは1つの引数を持ちます。(Hashtable propertiesThatChanged)
/// ローカル上での変更においても、カスタムプロパティの変更は
/// 必ずRoom.SetCustomPropertiesによって行われる必要があります。
/// </remarks>
void OnPhotonCustomRoomPropertiesChanged(Hashtable propertiesThatChanged){}

OnPhotonPlayerPropertiesChanged

/// <summary>
/// カスタププレイヤープロパティが変更された際に呼び出されます。
/// プレイヤーと変更されたプロパティは object[] として渡されます。
/// </summary>
/// <remarks>
/// v1.25以降、このメソッドは1つの引数を持ちます。(object[] playerAndUpdatedProps)
/// これには2つのエントリが含まれます。
/// [0] は影響を受けた PhotonPlayer です。
/// [1] は変更されたプロパティのハッシュテーブルです。
/// (私たちはUnityのGameObject.SendMessageの仕様により、object[]を使用している。)
/// 
/// ローカル上での変更においても、カスタムプロパティの変更は
/// 必ずPhotonPlayer.SetCustomPropertiesによって行われる必要があります。
/// </remarks>
void OnPhotonPlayerPropertiesChanged(object[] playerAndUpdatedProps){
    PhotonPlayer player = playerAndUpdatedProps[0] as PhotonPlayer;
    Hashtable props = playerAndUpdatedProps[1] as Hashtable;
    //...
}

OnUpdatedFriendList

/// <summary>
/// サーバーが FindFriends リクエストに対してPhotonNetwork.Friendsを更新し、
/// 応答を送信した際に呼び出されます。
/// </summary>
/// <remarks>
/// フレンドリストはPhotonNetwork.Friendsによって
/// 名前の一覧、オンライン状態、(もし入っているなら)部屋などを取得できます。
/// </remarks>
void OnUpdatedFriendList(){}

OnCustomAuthenticationFailed

/// <summary>
/// カスタム認証に失敗し、切断された際に呼び出されます。
/// </summary>
/// <remarks>
/// ユーザーの入力や不正なトークン/シークレットなどによってカスタム認証は失敗することがあります。
/// もし認証に成功した場合、このメソッドは呼ばれません。
/// (一般的には) OnJoinedLobby() か OnConnectedToMaster() を実装します。
/// 
/// ゲームの開発中、それはサーバーサイドの謝った設定により失敗することがあります。
/// そのような場合は、デバッグメッセージをログに記録する事は非常に重要です。
/// 
/// あなたがあなたのアプリに対して(ダッシュボード上で)カスタム認証を設定しない限り、これが呼ばれる事はありません。
/// </remarks>
void OnCustomAuthenticationFailed(string debugMessage){}

OnWebRpcResponse

/// <summary>
/// PUNがWebRPCを受信した際に呼び出されます。
/// PhotonNetwork.WebRPC を参照してください。
/// </summary>
/// <remarks>
/// 重要:もしPhotonがあなたのWebServiceに到達できるならresponse.ReturnCodeは0です。
/// 応答の内容はあなたのWebServiceが送信した物です。
/// あなたはこれを元にWebResponseのインスタンスを生成できます。
///
/// 例)WebRpcResponse webResponse = new WebRpcResponse(operationResponse);
///
/// 注意:OperationResponseクラスは下記名前空間に含まれています。
/// using ExitGames.Client.Photon; 
/// 
/// PhotonからのOperationResponse.ReturnCodeは以下の通りです。
///  0 : OK
/// -3 : Webサービスが未設定です。(ダッシュボード、WebHooksを確認)
/// -5 : Webサービスは現在RPCのためのpath/nameを持っていません。(少なくともAzureのため)
/// </remarks>
void OnWebRpcResponse(OperationResponse response){}

OnOwnershipRequest

/// <summary>
/// PhotonViewの現在の所有者であるあなたに対して、
/// 他のプレイヤーが所有権を要求したときに呼び出されます。
/// </summary>
/// <remarks>
/// viewAndPlayerには2つのエントリが含まれます。
/// [0] は対象のPhotonViewです。
/// [1] は要求を行ったPhotonPlayerです。
/// </remarks>
void OnOwnershipRequest(object[] viewAndPlayer){
 PhotonView view = viewAndPlayer[0] as PhotonView;
 PhotonPlayer requestingPlayer = viewAndPlayer[1] as PhotonPlayer;
 //...
}

2014年12月11日木曜日

【Unity、UniRx】画面の向きが変化したことを検出する


@Baiteen

ReactiveExtensionsがUnityでも使えるってのを今更知ったので、今更ながら使ってみた。その9。

やりたいこと

ReactiveExtensionsを使って画面の向きが変化したことを検出する。

やり方

Input.deviceOrientationで現在のデバイスの画面の向きを取れるので、これが変化した時だけ値を発行させる。
ソース全体はこちらのGithub

これだと実機で試してねってなっちゃうので、せっかくなのでWebPlayerでも雰囲気確認できるようにCube置いてみた。
Hosted by UnityRoom.com

ついでにトースト表示クラスをシングルトンにしてみた。
CanvasとEventSystemをスクリプトからする方法がわからない。

Related Posts Plugin for WordPress, Blogger...