Как в Unity Photon Pun 2 изменить значения переменной и текста для всех игроков?

  • 6 августа 2023 г. 14:00
Ответы на вопрос 2
Для обновления/изменения значений переменной или текста для всех игроков в Photon Pun 2, вам нужно воспользоваться функцией синхронизации данных между игроками. Подробно об этом посмотреть можно в [официальной документации](https://doc.photonengine.com/en-us/pun/v2/gameplay/synchronization-and-state).

Но если говорить в общих чертах, вам нужно создать сетевую переменную  и синхронизировать ее значение через механизм Photon View и RPC (Remote Procedure Call).

Пример:

```csharp
public class YourClass: MonoBehaviourPunCallbacks {

    public string myText = "Default";

    // Функция для изменения текста и вызова сетевой функции
    public void ChangeText(string newText) {
        myText = newText;
        photonView.RPC("RpcChangeText", RpcTarget.All, newText);
    }

    // Сетевая функция, которая изменяет текст у всех игроков
    [PunRPC]
    void RpcChangeText(string text) {
        myText = text;
        GetComponentInChildren<Text>().text = text;
    }
}
```
Вам нужно вызвать функцию `ChangeText` в момент, когда вы хотите изменить текст для всех игроков. Значение будет обновлено у всех благодаря вызову сетевой функции `RpcChangeText` с помощью механизма RPC.

Не забудьте, что `photonView` должен быть привязан к объекту, на котором находится этот скрипт.

Обратите внимание, что данная реализация предполагает, что у вас уже есть настроенное и работающее подключение к сети Photon. Если у вас возникнут проблемы, рекомендуется прочитать [официальный гайд по Photon](https://doc.photonengine.com/en-us/pun/v2/getting-started/pun-intro).
using UnityEngine;
using UnityEngine.UI;
using Photon.Pun;

public class ButtonController : MonoBehaviourPunCallbacks {
    
    public int gen = 0;
    public Text statusText;

    private PhotonView photonView;

    private void Start() {
        photonView = GetComponent();
    }

    // При нажатии на кнопку этот метод будет вызываться только на локальном объекте со скриптом
    public void OnButtonClick() {
        if (!photonView.IsMine)
            return;

        gen = 1;
        UpdateStatusText();

        // Этот вызов .RPC() отправляет сообщение в сеть, чтобы запустить метод SyncGen() на всех объектах в текущей сессии
        // В сообщении передается значение переменной gen
        // Отправка происходит на все клиенты, включая отправителя
        photonView.RPC(nameof(SyncGen), RpcTarget.All, gen);
    }

    // Локально обновляет текст статуса
    private void UpdateStatusText() {
        if (statusText != null)
            statusText.text = (gen == 1) ? "done" : "not done";
    }

    // Этот метод будет запущен на всех объектах в текущей сессии при вызове .RPC()
    // Он получит значение newGenValue и обновит переменную gen
    private void SyncGen(int newGenValue) {
        gen = newGenValue;
        UpdateStatusText();
    }
}
Похожие вопросы