C# 关于PhotonNetwork.CurrentRoom.CustomProperties的问题
当游戏在多人游戏中开始时,主客户端发送一个PunRPC,让所有客户端运行一个函数。此函数尝试获取房间属性,以查看游戏是否处于活动状态,如果处于活动状态,则会执行某些操作。出于某种原因,客户端会收到空引用错误,但主客户端不会。奇怪的是,房间属性哈希表的调试是可见的,但我无法在其中获取特定项 已尝试调试哈希表,以确保在运行代码时设置了密钥。是的。“(System.String)ag=(System.Boolean)True ag=activeGame”这显示在C# 关于PhotonNetwork.CurrentRoom.CustomProperties的问题,c#,unity3d,networking,photon,C#,Unity3d,Networking,Photon,当游戏在多人游戏中开始时,主客户端发送一个PunRPC,让所有客户端运行一个函数。此函数尝试获取房间属性,以查看游戏是否处于活动状态,如果处于活动状态,则会执行某些操作。出于某种原因,客户端会收到空引用错误,但主客户端不会。奇怪的是,房间属性哈希表的调试是可见的,但我无法在其中获取特定项 已尝试调试哈希表,以确保在运行代码时设置了密钥。是的。“(System.String)ag=(System.Boolean)True ag=activeGame”这显示在Debug.Log(hash)中但是(b
Debug.Log(hash)中
但是(bool)散列[rpk.activeGame]
获取空引用错误。但仅在客户端,而不是主客户端。所以这把钥匙也起作用了
//调用所有客户端在子菜单中设置房间设置。
[扑克牌]
私有void游戏室设置(字符串pOne、字符串pTwo、int pOneColor、int pTwoColor)
{
GameObject gameMenu=GameObject.Find(“gameMenu”);
gameMenu.GetComponent().UpdatePlayers(pOne、pTwo、pOneColor、pTwoColor);
gameMenu.GetComponent().startgamestup();
//如果您是玩家,请更改可见的活动按钮。
if(PhotonNetwork.昵称==pOne | | PhotonNetwork.昵称==pTwo)
{
gameMenu.GetComponent().GameStart();
}
hash=PhotonNetwork.CurrentRoom.CustomProperties;
Log(散列);
if((bool)hash[rpk.activeGame])//在客户端的这一行上出错,但在主客户端上没有。表示空引用。
{
GameObject.Find(“SoundManager”).GetComponent().PlayBackgroundTwo();
GameObject.Find(“GameMenu”).GetComponent().changesubmenualive(false);
}
}
我试图以客户机身份运行if语句,但出现错误。感谢您选择光子 要获取自定义属性,我建议您使用
TryGetValue
方法,如下所示:
hash = PhotonNetwork.CurrentRoom.CustomProperties;
object temp;
string key = rpk.activeGame;
if (hash.TryGetValue(key, out temp))
{
if (temp is bool)
{
bool activeGame = (bool)temp;
}
else
{
// unexpected custom property value type
}
}
else
{
// custom property not found
}
如果自定义属性尚不可用,请等待回调IInRoomCallbacks.OnRoomPropertiesUpdate(Hashtable propertiesThatChanged)
()
其他说明和建议:
private void GameRoomSetup (string pOne, string pTwo, int pOneColor, int pTwoColor)
不确定它是否受支持,或者将多个参数传递给PUN-RPC方法是否是一个好主意
要调试日志字典
或哈希表
,可以使用SupportClass.DictionaryToString()
方法。
所以不是
Debug.Log(hash);
使用
避免调用昂贵的方法,如GameObject.Find
:
GameObject gameMenu = GameObject.Find ("GameMenu");
此外,这里还有对gameMenu.GetComponent()
的重复调用,至少调用一次,并缓存找到的组件结果(如果有)
gameMenu.GetComponent<SubMenu> ().UpdatePlayers (pOne, pTwo, pOneColor, pTwoColor);
gameMenu.GetComponent<SubMenu> ().StartGameSetup ();
另外,你为什么用这个昵称来检查它是一号玩家还是二号玩家?可以使用ActorNumber或自定义播放器索引。如果房间只能容纳2名玩家,则使用玩家计数
gameMenu.GetComponent<SubMenu> ().UpdatePlayers (pOne, pTwo, pOneColor, pTwoColor);
gameMenu.GetComponent<SubMenu> ().StartGameSetup ();
// If you are a player, change the active buttons that are visible.
if (PhotonNetwork.NickName == pOne || PhotonNetwork.NickName == pTwo)
{
gameMenu.GetComponent<GameButtonManager> ().GameStart ();
}