Как сделать чтобы сигнал срабатывал у всех

Сеть в Unity3D

Как сделать чтобы сигнал срабатывал у всех

Сообщение Serezha 02 дек 2021, 13:49

Здравствуйте! Уже второй день измучился над условием. В сетевой игре при подключении одного игрока регистрируется сигнал 1 и 2, а вот когда подключается второй игрок или третий, то никакого сигнала нет. Как сделать так чтобы сигнал срабатывал при подключении любого количества игроков, а не только у одного ?

Решение: создал отдельную переменную счетчика и при спавне игрока прибавляю на еденицу.
Оказалось что прибавлять нужно где команда создания игрока и проблема решилась :)

Синтаксис:
Используется csharp
using System;
using UnityEngine;
using System.Text;
using System.Collections;

public class Server : MonoBehaviour {

public GameObject PlayerPrefab;
public bool serv;
public string ip = "127.0.0.1";
public string port = "2800";
public bool connected;
public GameObject go;
public GameObject To;
public int LE;
public int LEK;

  void Awake () {
   serv = false;
   LE = 0;
   LEK = 0;
 }

  void Update () {
   if (serv == true & Network.connections.Length >= 1) {
      LE = + 1;
   }
   if (LEK != LE) {
      GetComponent<NetworkView>().RPC ("RpcIK", RPCMode.Others);
      Debug.Log("СИГНАЛ 1");
      LEK = LE;
   }
 }
  [RPC]
  public void RpcIK () {
   Debug.Log("СИГНАЛ 2");
 }
  void OnGUI () {
   if(GUI.Button(new Rect((Screen.width - 110)/2, Screen.height/2 + 35, 110, 30), "Создать сервер"))
      Network.InitializeServer(10, Convert.ToInt32(port), false);
   if (GUI.Button (new Rect ((Screen.width - 120) / 2, Screen.height / 7, 150, 30), "Войти"))
      Network.Connect (ip, Convert.ToInt32 (port));
   }
  void OnServerInitialized () {
    serv = true;
   }
  void OnConnectedToServer () {
      CreatePlayer();
   }
  void CreatePlayer () {
     connected = true;
     go = (GameObject)Network.Instantiate(PlayerPrefab, transform.position = To.transform.position, transform.rotation = To.transform.rotation, 1);
}
}
Последний раз редактировалось Serezha 19 дек 2021, 22:55, всего редактировалось 2 раз(а).
Аватара пользователя
Serezha
UNец
 
Сообщения: 11
Зарегистрирован: 29 ноя 2021, 22:47

Re: Как сделать чтобы сигнал срабатывал у всех

Сообщение DiZZarK2 04 дек 2021, 20:34

Сделать отдельный класс с полем readonly. И с любого объекта реализовать запрос на состояние этого поля.

я промолчу за GetComponent в update будем считать что он там появился на отладке.
GUI? это у вас скрипт летящий на игрока. Остальные входящие в игру игроки? итак у вас 4 игрока вошли каждый создал интефейс на каком экране какой будет висеть? по логике все 4 лягут в ваш. что он должен отображать?
те же вопросы к остальным методам
ИМХО вам необходимо пересмотреть архитектуру
Аватара пользователя
DiZZarK2
UNец
 
Сообщения: 42
Зарегистрирован: 03 дек 2021, 10:21

Re: Как сделать чтобы сигнал срабатывал у всех

Сообщение Serezha 05 дек 2021, 14:07

DiZZarK2, в скрипте уже есть регистрирующий количество игроков при каждом подключении это "connections.Length", но это не помогает. Как выше из скрипта, я уже создавал еще одну "LE" для чтения и проверял через условие "if (LEK != LE)" чтобы сигнал срабатывал при подключении еще одного нового игрока, но тоже не работает.
GetComponent в update будем считать что он там появился на отладке, так и есть в update он только для отладки.
GUI - не нужно, я отладку делаю через консоль "Debug.Log" как написано в скрипте.
это у вас скрипт летящий на игрока. Остальные входящие в игру игроки? это общий скрипт для игрока клиента и сервера - для примера просто, да другие игроки входящие.
итак у вас 4 игрока вошли каждый создал интерфейс на каком экране какой будет висеть? по логике все 4 лягут в ваш. что он должен отображать? Игрокам ничего отображать не нужно в GUI - это только для примера, GUI чтобы отобразить кнопку "Войти" и кнопку создания сервера, но можно и без GUI просто назначить нажатие определенной клавиши это не играет особой роли.
ИМХО вам необходимо пересмотреть архитектуру, а вот тут ВЫ правы! [curved_hands]
я забыл добавить из своего скрипта serv = true в OnServerInitialized () и кнопку инициализации сервера в OnGUI():

if(GUI.Button(new Rect((Screen.width - 110)/2, Screen.height/2 + 35, 110, 30), "Создать сервер"))
Network.InitializeServer(10, Convert.ToInt32(port), false);

те же вопросы к остальным методам, в "Awake" - задаю начальные значения, в Update проверяю если это сервер и если есть новый клиент который подключается, то прибавляю единицу к "LE", отправляю всем игрокам сигнал через RPC, приравниваю "LE" с "LEK" чтобы потом еще раз в другом условии проверить если еще будет новый клиент подключаться то сравниваю эти счетчики между собой, если счетчики отличаются значит есть "новый клиент" который подключается, так как при каждом подключении прибавляется единица, то по идеи они не должны будут равны между собой, но "сигнал" работает только для самого первого клиента игрока который подключился к серверу, а для остальных клиентов игроков сигнал почему то не работает [curved_hands]
Далее сам метод RpcIK, который всем рассылает сигнал в случае обращения к нему из условий выше, OnGUI для того чтобы создать сервер и клиенты через кнопки, OnServerInitialized инициализация сервера, включая serv = true, чтобы отметить что это сервер для условия выше, OnConnectedToServer подключает игроков т.е. клиентов к серверу вызывая метод CreatePlayer(), а в нем создаем сам игрок клиент в точке ''To", а через connected говорим серверу что подключился игрок. Общий скрипт весит на камере, компонент "Network Views" тоже на камере. В поле сихронизации компонента "Network Views" указан этот скрипт.
Аватара пользователя
Serezha
UNец
 
Сообщения: 11
Зарегистрирован: 29 ноя 2021, 22:47


Вернуться в Сеть

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2