Как изменить настройки для конкретного игрока в Photon?

#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