Unityで作成中のイベント用アプリの作成メモです
現在作成中のアプリですが,同期などの関係から(たぶん)全員が同じ部屋に入ることが必要です.
そこでいろいろ面倒が発生します(以下,photonのレベル別マッチメイクのスクリプトなどから流用しています)
(1)photonネットワーク接続直後にはroom listを取得してもゼロが返るっぽい.不確実だけど対抗策は
void OnReceivedRoomListUpdate()
で,リストがアップデートされてから,ルームリストをチェックする.
(2) PhotonNetwork.CreateRoom()はどうもエラーが起きやすい.ので,確実にその名前のルームが無いことを確認しなくてはいけない(そこで上記のルームリストを使うけど,タイミングが,,,
(3)そこでおおまかな流れとしては,Photonに接続して,ロビーに入ったら,そのままにしておいてリストのアップデートを待つ.アップデートされない時のために,5秒くらい待つ関数を入れるか思案中(未実装).リストがアップデートされたら,同名のルーム名がないかチェックして,あればそこに入室,なければ作成をする.
ここまでのスクリプトです.
using UnityEngine; using System.Collections; using Hashtable = ExitGames.Client.Photon.Hashtable; //need for generate hashtable public class photonsystem : Photon.MonoBehaviour { public string objectName; private bool connectFailed = false; //set player name private string playerName = "GuestAAA"; //set room name private string roomName = "liub2";//liubという専用のルーム名を作成 void OnJoinedLobby() { Debug.Log("ロビーに入室"); //ランダムにルームへ参加 //thi wrok //PhotonNetwork.JoinRandomRoom();// join to random room tempolary //until here// } void OnReceivedRoomListUpdate() { CreateRoom (); } /////test 24th January public void CreateRoom (){ RoomOptions roomOptions = new RoomOptions (); roomOptions.isVisible = true; roomOptions.isOpen = true; roomOptions.maxPlayers = 50;//test 50 max players roomOptions.customRoomProperties = new ExitGames.Client.Photon.Hashtable (){{"CustomProperties", "111"},{"r", "0.2"}}; roomOptions.customRoomPropertiesForLobby = new string[] {"CustomProperties"}; if (PhotonNetwork.GetRoomList ().Length == 0) { PhotonNetwork.CreateRoom (roomName, roomOptions, null); return; } foreach (RoomInfo roomInfo in PhotonNetwork.GetRoomList()) { if (roomInfo.name != roomName) { PhotonNetwork.CreateRoom (roomName, roomOptions, null); } else { //isRoomEnabled = true; PhotonNetwork.JoinRoom(roomName); } } } /// 部屋に入るとき呼ばれます。 /// これは参加する際だけでなく作成する際も含みます。 void OnJoinedRoom() { Debug.Log("部屋に入室" + PhotonNetwork.room.name); //ゲームオブジェクト作成する時用 //GameObject cube = PhotonNetwork.Instantiate(objectName, Vector3.zero, Quaternion.identity, 0); //make cube //GameObject player = PhotonNetwork.Instantiate("testobj", this.transform.position, this.transform.rotation, 0); } /// JoinRandom()の入室が失敗した場合に後に呼び出されます。 void OnPhotonRandomJoinFailed() { //void OnPhotonJoinFailed() { Debug.Log("部屋入室失敗"); //名前のないルームを作成 // PhotonNetwork.CreateRoom(null); /////以下はテスト用えコメントアウトしています //create custom property // RoomOptions myOptions = new RoomOptions ();// require use custom property // myOptions.isVisible = true; // myOptions.isOpen = true; // myOptions.maxPlayers = 50; // myOptions.customRoomProperties = new ExitGames.Client.Photon.Hashtable (){{"CustomProperties", "111"},{"r", "0.2"}}; // myOptions.customRoomPropertiesForLobby = new string[] {"CustomProperties"}; // ルームの作成 // PhotonNetwork.JoinOrCreateRoom(roomName, myOptions, null); } void Awake() { //マスターサーバーへ接続 PhotonNetwork.ConnectUsingSettings("v0.1"); if (PhotonNetwork.playerName==null) { //ランダムにプレイヤーの名前を生成 this.playerName = "Guest" + UnityEngine.Random.Range(1, 9999); //Photonにプレイヤーを登録 PhotonNetwork.playerName = this.playerName; }else{ //Photonにプレイヤーを登録 this.playerName = PhotonNetwork.playerName; } } //部屋作成に成功したときにコール public void OnCreatedRoom(){ Debug.Log("OnCreatedRoom"); } //接続が切断されたときにコール public void OnDisconnectedFromPhoton(){ Debug.Log("Disconnected from Photon."); } //接続失敗時にコール public void OnFailedToConnectToPhoton(object parameters){ this.connectFailed = true; Debug.Log("OnFailedToConnectToPhoton. StatusCode: " + parameters + " ServerAddress: " + PhotonNetwork.networkingPeer.ServerAddress); } }