どうしても同じルームに入り,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秒以内くらいです