问题描述
所以我试图使用 RPC 并发送一个 int 和一个 int 列表作为参数,但是,虽然该函数正确发送了 int 列表,但它发送的 int 值是错误的,并且对于每个客户端来说都是不同的,即使我发送了对所有人都具有相同的价值。
这是RPC方法;
[PunRPC]
void GetPlayerCards(int[] _cardListInt,int _gCard)
{
if(intPlayerCardlist.Count == 0)
{
intPlayerCardlist.AddRange(_cardListInt);
}
foreach (int cardInt in intPlayerCardlist)
{
if(MyCardlist.Contains(gameFullCardlist.cardList[cardInt])) continue;
else MyCardlist.Add(gameFullCardlist.cardList[cardInt]);
}
groundCard = gameFullCardlist.cardList[_gCard];
Debug.Log("value: " + _gCard + " card name: " + groundCard);
}
int[] List1 = cardList1.ToArray();
int[] List2 = cardList2.ToArray();
int[] List3 = cardList3.ToArray();
int[] List4 = cardList4.ToArray();
int[] List5 = cardList5.ToArray();
int gCard = cardList5[0];
PhotonView PV_P1 = gamePlayersList[0].GetComponent<PhotonView>();
PhotonView PV_P2 = gamePlayersList[1].GetComponent<PhotonView>();
PhotonView PV_P3 = gamePlayersList[2].GetComponent<PhotonView>();
PhotonView PV_P4 = gamePlayersList[3].GetComponent<PhotonView>();
PV_P1.RPC("GetPlayerCards",PV_P1.Owner,List1,gCard);
PV_P2.RPC("GetPlayerCards",PV_P2.Owner,List2,gCard);
PV_P3.RPC("GetPlayerCards",PV_P3.Owner,List3,gCard);
PV_P4.RPC("GetPlayerCards",PV_P4.Owner,List4,gCard);
如果您发现我为所有客户端发送了相同的值但我得到了不同的结果,请参阅下面的日志:
游戏管理器和玩家正在使用以下脚本从每个客户端场景中的空游戏对象实例化;
private void Awake()
{
//Order of Instantiation is important
PhotonNetwork.InstantiateRoomObject(InstantiatedplayersListGameobject.name,Vector3.zero,Quaternion.identity);
PhotonNetwork.InstantiateRoomObject(cardsDeck.name,Quaternion.identity);
PhotonNetwork.InstantiateRoomObject(GameplayManager.name,Quaternion.identity);
}
void Start()
{
if(PhotonNetwork.IsConnectedAndReady)
{
if (playerPrefab != null)
{
GameObject playerInstantiation = PhotonNetwork.Instantiate(playerPrefab.name,Quaternion.identity);
playerInstantiation.transform.SetParent(InstanceParent.transform,false);
playerInstantiation.transform.localScale = Vector3.one;
playerInstantiation.transform.localPosition = Vector3.zero;
// playerInstantiation.name = (playerInstantiation.GetComponent<PhotonView>().Owner.NickName + " - AN: " +
// playerInstantiation.GetComponent<PhotonView>().Owner.ActorNumber);
Debug.Log("player instantiated");
}
else
{
Debug.Log("Place player Prefab");
}
}
}
解决方法
如果没有代码片段的更多详细信息和上下文,就很难判断。
不过,我想我知道这里出了什么问题。
您期望:您正在向四个不同的玩家发送四个 RPC。
会发生什么:您要向四个不同的玩家发送四个 RPC但是您做了整件事四个 > 次 => 每个玩家收到的不是一个(如预期的)而是四个具有不同值的 RPC。
如果它按预期工作,您将只看到一个登录您的每个播放器,因为每个播放器应该只收到一个您的 RPC 调用。相反,您的调用方法似乎对您的四名玩家中的每一位都执行,并且在将这些单独的值发送给其他人之前,每个人都会对卡片进行单独的随机化。
就像在现实生活中,您通常有一个“经销商”Photon 提供这样的人:所谓的 MasterClient
。
您用来向所有人调用此随机化和 RPC 的方法应检查 PhotonNetwork.isMasterClient
if(PhotonNetwork.isMasterClient)
{
// ...
int[] List1 = cardList1.ToArray();
int[] List2 = cardList2.ToArray();
int[] List3 = cardList3.ToArray();
int[] List4 = cardList4.ToArray();
int[] List5 = cardList5.ToArray();
int gCard = cardList5[0];
// HINT: In general rather pre-cache and re-use these references
PhotonView PV_P1 = gamePlayersList[0].GetComponent<PhotonView>();
PhotonView PV_P2 = gamePlayersList[1].GetComponent<PhotonView>();
PhotonView PV_P3 = gamePlayersList[2].GetComponent<PhotonView>();
PhotonView PV_P4 = gamePlayersList[3].GetComponent<PhotonView>();
PV_P1.RPC("GetPlayerCards",PV_P1.Owner,List1,gCard);
PV_P2.RPC("GetPlayerCards",PV_P2.Owner,List2,gCard);
PV_P3.RPC("GetPlayerCards",PV_P3.Owner,List3,gCard);
PV_P4.RPC("GetPlayerCards",PV_P4.Owner,List4,gCard);
}