Отправка сообщений всем клиентам в Unity PUN (C#)
Это глупый вопрос, но я не могу понять это, я пытался это выяснить, но ничего не было того, что я искал, поэтому я подумал, что вопрос может быть хорошим способом. В моей игре я хотел бы, чтобы клиент мог отправлять сообщения (сообщения не для пользователей, если не для других клиентов, которые должны быть интерпретированы в код) всем в своей комнате:
"(Пользователь1): Сколько очков у всех?"
"(User2): Эй, я получил 5 баллов"
"(User3): Эй, я получил 10 баллов"
"(Пользователь1): Время прошло, скажи мне свои очки:"
"(User2): Эй, я получил 20 баллов"
"(User3): Эй, я получил 30 баллов"
"(Пользователь1): Пользователь 3 победил"
Конечно, это скорее графический пример, я хочу иметь возможность отправлять сообщения всем клиентам (в комнате), чтобы другие клиенты могли обрабатывать tjem. Я хотел бы знать, как это сделать, и если это возможно через PUN (Unity Photon Network). Или, если есть другой способ сделать это через UnityNetworking. Кроме того, это будет через локальную сеть, а не через Интернет.
Заранее благодарю.
1 ответ
Вы ищете RPC:
https://doc.photonengine.com/en-us/pun/current/gameplay/rpcsandraiseevent
Это позволяет вам звонить только мастеру, только клиентам или конкретному игроку.
Перед функцией, которую вы поставили "[PunRPC]" (без кавычек), это делает метод вызываемым RPC:
[PunRPC]
public void GetScore(int score)
{
//Do something
}
Класс, который вызывает RPC, требует, чтобы Photonview был присоединен или расширен от Pohotn.PunBehaviour, и вызывает функцию следующим образом:
photonView.RPC("function", targets, arguments);
"Функция" - это rpc в виде строки, в данном случае это будет GetScore, целью может быть либо экземпляр PhotonPlayer, либо вы можете использовать перечисление PhotonTargets.
Мне нравится создавать одноэлементный класс, который обрабатывает RPC (помните, это работает, только если у класса есть только 1 экземпляр):
using UnityEngine;
public class RPC : Photon.PunBehaviour
{
public static RPC singleton;
private void Awake()
{
if(singleton != null && singleton != this)
Destroy(this);
singleton = this;
}
//Called by someone who wants to set the score
public void CallSetScore(sbyte score)
{
this.photonView.RPC("SetScore", PhotonTargets.All, score);
}
[PunRPC]
public void SetScore(sbyte score)
{
//Do something with the score
}
}