当游戏以多人游戏开始时,主客户端发送PunRPC以使所有客户端运行功能。此功能尝试获取房间属性,以查看游戏是否处于活动状态,如果有,它会执行某些操作。出于某种原因,客户端会得到空引用错误,但主客户端不会。奇怪的是,可以看到对哈希表的房间属性的调试,但是我无法在其中获取特定项。
尝试调试哈希表,以确保在运行代码时设置了密钥。它是。 “(System.String)ag =(System.Boolean)True ag = activeGame”这在<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</dependency>
中显示,但是Debug.Log(hash);
收到空引用错误。但仅在客户端而不是主客户端。因此该键也有效。
(bool)hash[rpk.activeGame]
我正在尝试将if语句作为客户端运行,但是出现错误。
答案 0 :(得分:0)
谢谢您选择光子!
要获取自定义属性,建议您使用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)
(reference API)。
其他注意事项和建议:
private void GameRoomSetup (string pOne, string pTwo, int pOneColor, int pTwoColor)
不确定是否支持此功能,或者将多个参数传递给PUN RPC方法是否是一个好主意。
要调试Dictionary
或Hashtable
的日志,可以使用SupportClass.DictionaryToString()
方法。
所以代替
Debug.Log(hash);
使用
Debug.Log(SupportClass.DictionaryToString(hash));
避免调用昂贵的方法,例如GameObject.Find
:
GameObject gameMenu = GameObject.Find ("GameMenu");
此外,您在这里有对gameMenu.GetComponent<SubMenu>()
的重复调用,至少调用一次,并缓存找到的组件结果(如果有)。
gameMenu.GetComponent<SubMenu> ().UpdatePlayers (pOne, pTwo, pOneColor, pTwoColor);
gameMenu.GetComponent<SubMenu> ().StartGameSetup ();
不应该使用==
运算符来比较字符串。至少使用Equal方法和正确的StringComparison类型。阅读“ How to compare strings in C#”。
// If you are a player, change the active buttons that are visible.
if (PhotonNetwork.NickName == pOne || PhotonNetwork.NickName == pTwo)
{
gameMenu.GetComponent<GameButtonManager> ().GameStart ();
}
此外,为什么还要使用昵称来检查玩家是一号还是二号?也许使用ActorNumber或自定义玩家索引。或者如果房间仅容纳2位玩家,则使用玩家人数。