Unity Networked Ready Check

问题描述 投票:2回答:1

[尝试使用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);
             }
         }

     }
 }

当前正在发生的事情是,无论其他人的状态如何,主客户端都可以启动游戏。感觉可能是我想得太多了,并且有一个非常相似的解决方案,因为我希望这样的功能会很常见,因为我希望许多在线游戏都使用类似的功能,所以如果我完全错了方式,请给我指出一个更合适的方向

c# unity3d photon
1个回答
3
投票
不确切知道Photon的工作原理,但我认为这些属性已经同步,据我了解,您只是想要某种检查,例如]

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


注:在智能手机上输入,但我希望这个想法能清楚明白

© www.soinside.com 2019 - 2024. All rights reserved.