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);
}
}



