#c# #unity3d #photon
Вопрос:
Я создаю игру типа простого словообразователя (где один игрок вводит слово, а другой игрок вводит слово, начинающееся с последней буквы слова первого игрока), и я пытаюсь сделать так, чтобы мастер-класс запускал игру, вводя первое слово, затем его поле ввода отключается, а поле ввода второго игрока включается, и он вводит слово и наоборот.
Я перепробовал несколько способов, все из которых были основаны на моих базовых знаниях Unity и C#. Вот один пример, который, как я думал, определенно сработает, но не сработал.
public void ChangeTurn ()
{
if (photonView.IsMine)
{
inputField.enabled = false;
}
else
{
inputField.enabled = true;
}
}
Короче говоря, есть ли способ сделать что-то вроде, PhotonNetwork.PlayerList[0].inputField.enabled = false;
? Пожалуйста, скажите мне, есть ли способ, которым я могу это решить? Я буду вечно благодарен.
Комментарии:
1. это может дать вам некоторое направление, ссылка
Ответ №1:
Вы можете сохранить текущее активное Player.ActorNumber
и основное использование Player.GetNextFor
Получает следующего игрока Игрока, отсортированного по номеру актера (Player.ID). Оборачивается вокруг.
Полезно, когда вы передаете что-то следующему игроку. Например: передача хода следующему игроку.
как, например,
private int currentID;
...
currentID = Player.GetNextFor(currentID).ActorNumber;
...
А затем передайте его всем, например, через RPC
...
photonView.RPC(nameof(ChangeTurn), RpcTarget.All, currentID);
...
// This will be executed on all clients
[PunRPC]
private void ChangeTurn(int newID)
{
// Simply check if the given newID matches your own ActorNumber
inputField.enabled = PhotonNetwork.LocalPlayer.ActorNumber == newID;
}
Так что все вместе, например, что-то вроде
// Store the ID of the currently active player
private int currentID;
// This is what a client has to call when he is done with his turn
private void EndTurn()
{
// Tell only the masterClient that we are done
// and he shall change the turn to the next player
photonView.RPC(nameof(ChangeTurnOnMaster), RpcTarget.MasterClient);
}
// This will be executed on the MasterClient
[PunRPC]
private void ChangeTurnOnMaster()
{
// Just to be really sure this is only done on the master client
if(!PhotoNetwork.isMasterClient) return;
// Get the next actor number
// This wraps around so after reaching the last player it will again start with the first one
currentID = Player.GetNextFor(currentID).ActorNumber;
// Tell everyone the new active player ID
photonView.RPC(nameof(ChangeTurn), RpcTarget.All, currentID);
}
// This will be executed on all clients
[PunRPC]
private void ChangeTurn(int newID)
{
// Just in case let everyone store the active ID
// this way you can also handle other things based on the ID later
// And also deal with the case that the masterClient switches for some reason
currentID = newID;
// Simply check if the given newID matches your own ActorNumber
inputField.enabled = PhotonNetwork.LocalPlayer.ActorNumber == newID;
}
Комментарии:
1. Я пытаюсь уже пару часов, и, похоже, у меня ничего не получается, не могли бы вы уточнить в другом ответе?
2. @JamalH. A добавлены некоторые комментарии и более полный пример кода .. надеюсь, теперь это стало яснее 😉
3. Вот и все! Большое вам спасибо! Вы буквально многому меня научили, просто отвечая на мои сообщения за последние несколько дней. Кроме того, imgur.com/a/cPJcG6O