问题描述
你好,我需要关于使用 photon 的 2 人在线游戏的帮助。每个玩家都会收到一个生成的票号,玩家 1 将访问玩家 2 的票号,玩家 2 还将访问玩家 1 的票号。
这是主客户端生成票证的脚本。当玩家 2 加入房间时,他将从玩家 1(主客户端)生成的票中获取他的票。我创建了一个带有照片视图的游戏对象和这里的脚本
void Start()
{
if (PhotonNetwork.IsMasterClient)
{
player1ticket = UnityEngine.Random.Range(1000,5000);
player2ticket = UnityEngine.Random.Range(1000,5000);
}
getTicket = true;
}
// Update is called once per frame
void Update()
{
if (getTicket)
{
if (PhotonNetwork.IsMasterClient)
{
myTicket = player1ticket;
}
else
{
myTicket = player2ticket;
}
getTicket = false;
}
}
但是在玩游戏时,玩家 2 没有任何票号
解决方法
首先,您知道可能会发生两个获得相同票号的情况 - 可能性不大但可能。在这种情况下,您可能想要重复第二个随机数
player1ticket = UnityEngine.Random.Range(1000,5000);
do
{
player2ticket = UnityEngine.Random.Range(1000,5000);
}
while(player2ticket == player1ticket);
那么你只在主站生成值。因此,在客户端上,getTicket
永远不会是 true
。
即使客户端也没有 player2ticket
值。
也没有必要/感觉在更新中的每一帧都分配它们。
我宁愿使用自定义房间属性,并在主服务器上使用 Room.SetCustomProperties
,这将在所有客户端上触发 OnRoomPropertiesUpdate(Hashtable
。此调用也会在客户端加入房间后触发一次,因此您可以确保新连接的客户端不会错过它。
void Start()
{
if (PhotonNetwork.IsMasterClient)
{
player1ticket = UnityEngine.Random.Range(1000,5000);
player2ticket = UnityEngine.Random.Range(1000,5000);
// You are master so already get your ticket
myTicket = player1ticket;
// Then simply push the other ticket(s) into the room properties
Hashtable properties = PhotonNetwork.room.customProperties;
properties["ticket2"] = player2ticket);
// This will store the value in the current room
// and triggers OnRoomPropertiesUpdate on all already connected clients
PhotonNetwork.room.SetCustomProperties(properties);
}
}
// This will be called
// - as soon as you entered a room
// - whenever someone writes into the room properties
public override void OnRoomPropertiesUpdate(Hashtable propertiesThatChanged)
{
// Not sure about the exact API right now,it's not in their docs
// it's either ContainsKey,HasKey or something similar ..maybe even TryGetValue works
if(!propertiesThatChanged.ContainsKey("ticket2")) return;
if(!PhotonNetwork.IsMasterClient)
{
myTicket = (int) PhotonNetwork.room.customProperties["ticket2"];
}
}