[尝试使用PUN2创建准备就绪的检查,以便所有玩家都可以同时加载到游戏场景中,但是我不知道如何检查另一个玩家的自定义属性,以及如何统计当前准备就绪的玩家数量以及是否一切准备就绪,然后开始游戏。我认为应该为每个应该设置的玩家设置一个自定义属性,但是我不确定它是否可以正常工作。
public class HeroSelectController : MonoBehaviour
{
[HideInInspector]
public string selectedHero;
private PhotonView PV;
private bool PlayerReady = false;
private ExitGames.Client.Photon.Hashtable _playerCustomProperties = new ExitGames.Client.Photon.Hashtable();
private void Update()
{
Debug.Log("Player Ready = " + _playerCustomProperties["PlayerReady"]);
}
private void HeroSelect()
{
PlayerReady = true;
selectedHero = "PlayerTest";
PhotonNetwork.SetPlayerCustomProperties(_playerCustomProperties);
_playerCustomProperties["PlayerReady"] = PlayerReady;
}
public void OnClickHeroButton()
{
HeroSelect();
if (PhotonNetwork.IsMasterClient)
{
foreach (var photonPlayer in PhotonNetwork.PlayerList)
{
photonPlayer.CustomProperties["PlayerReady"] = true;
PhotonNetwork.LoadLevel(3);
}
}
}
}
当前正在发生的事情是,无论其他人的状态如何,主客户端都可以启动游戏。感觉可能是我想得太多了,并且有一个非常相似的解决方案,因为我希望这样的功能会很常见,因为我希望许多在线游戏都使用类似的功能,所以如果我完全错了方式,请给我指出一个更合适的方向
private bool AllPlayersReady
{
get
{
foreach (var photonPlayer in PhotonNetwork.PlayerList)
{
if(photonPlayer.CustomProperties["PlayerReady"] == false) return false;
}
return true;
}
}
您可能还可以像使用Linq那样缩短时间
using System.Linq; ... private bool AllPlayersReady => PhotonNetwork.PlayerList.All(player => player.CustomProperties["PlayerReady"] == true);
然后像这样使用它
public void OnClickHeroButton() { HeroSelect(); if(!AllPlayersReady) { return; } PhotonNetwork.LoadLevel(3); }
这仍然可以增强,因为现在主机必须反复按直到可能每个人都准备好为止。我会另外使用Coroutine,例如
public void OnClickHeroButton() { HeroSelect(); StartCoroutine (WaitAllReady ()); } private IEnumerator WaitAllReady() { yield return new WaitUntil (() => AllPlayersReady); PhotonNetwork.LoadLevel(3); }
感谢伊吉:代替检查每个帧的例程,您可以使用
OnPlayerPropertiesUpdate
来检查就绪状态
OnPlayerPropertiesUpdate
注:在智能手机上输入,但我希望这个想法能清楚明白