標記の件のメモ
PublishMessageのイベントとやらがどこにあるのは半日悩んだ.
ここにあった
どうしても同じルームに入り,customRoomPropertiesを取得して,同じルームに入室している人全員に同じ設定を与えたかったので.
(1)まずルーム作成のスクリプト
これは空のゲームオブジェクトに当てる
using UnityEngine; using System.Collections; using Hashtable = ExitGames.Client.Photon.Hashtable; //require for generate hashtable public class photonsystem : Photon.MonoBehaviour { public string objectName;//use for photon instantiate private bool connectFailed = false; //use for network status check //set player name private string playerName = "GuestAAA";//a player name //set room name private string roomName = "liub2";//liub2という専用のルーム名を作成 void OnJoinedLobby() { Debug.Log("ロビーに入室"); //ランダムにルームへ参加 } //call when room list upadate "must use" void OnReceivedRoomListUpdate(){ CreateRoom (); } /////create room with custom room options 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", "blue"}}; 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 { //room name matched 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); } }
(2)そのカスタムプロパティを呼び出すスクリプト
これをライトにアサインしています
using UnityEngine; using System.Collections; using Hashtable = ExitGames.Client.Photon.Hashtable; using UnityEngine.UI; public class cpLight : MonoBehaviour { public Light lightObj2; private string cpstring = "red"; // Use this for initialization void Start () { lightObj2 = GetComponent<Light>(); } // Update is called once per frame void Update () { } //cp changed is here void OnPhotonCustomRoomPropertiesChanged(){ if (PhotonNetwork.inRoom) {// ルームの状態を取得 Room room = PhotonNetwork.room; if (room == null) { return; } else { Hashtable cp = room.customProperties; //cpstring = (string)cp ["r"]; cpstring = (string)cp ["r"]; //Debug.Log (cp ["r"]); if (cpstring == "blue") { lightObj2.color = Color.blue; //GetComponent<Light>.color = Color.blue; } if (cpstring == "red") { lightObj2.color = Color.red; //GetComponent<Light>.color = Color.blue; } if (cpstring == "green") { lightObj2.color = Color.green; //GetComponent<Light>.color = Color.blue; } } } } }
(3)テスト用にボタンを作成し,そのボタンにあてるスクリプトです
using UnityEngine; using System.Collections; using Hashtable = ExitGames.Client.Photon.Hashtable; public class lightColor : Photon.MonoBehaviour { public Light lightObj; // Use this for initialization void Start () { } // Update is called once per frame void Update () { // if (!photonView.isMine) { //transform.position = Vector3.Lerp(transform.position, this.correctPlayerPos, Time.deltaTime * 5); //transform.rotation = Quaternion.Lerp(transform.rotation, this.correctPlayerRot, Time.deltaTime * 5); // } } public void colorRed(){ //lightObj.color = Color.red; ExitGames.Client.Photon.Hashtable h = new ExitGames.Client.Photon.Hashtable() { { "r", "red" } }; PhotonNetwork.room.SetCustomProperties(h); } public void colorGreen(){ // lightObj.color = Color.green; ExitGames.Client.Photon.Hashtable h = new ExitGames.Client.Photon.Hashtable() { { "r", "green" } }; PhotonNetwork.room.SetCustomProperties(h); } public void colorBlue(){ ExitGames.Client.Photon.Hashtable h = new ExitGames.Client.Photon.Hashtable() { { "r", "blue" } }; PhotonNetwork.room.SetCustomProperties(h); // lightObj.color = Color.blue; } }
これで,ボタンをクリックすると
このアプリの画面は全て同じ色になります.タイムラグは1秒以内くらいです
テラシュールブログさんありがとう!
カスタムプロパティを変えたときに呼ばれるがこれ
void OnPhotonCustomRoomPropertiesChanged(){ }
ちなみにupdateでカスタムプロパティ呼ぶとたぶん2回目でエラーでる(未検証).どうも別の所にスクリプトがアサインされてたっぽい.
なので,onChangeが必要だったのですが,onChangeで検索しても出てこず,まさかChangedだったとは,,,
参照先
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); } }