@itrushkoff

Unity не видит disconnect от сервера, если его вызывает другой Unity, есть идеи?

Ребят, помогите пожалуйста :)
Впервые делаю что-то сетевое, и вот решил подружить Unity-клиент и Nodejs-сервер.
Сабж: запускаю "play" в Unity - происходит коннект к серверу. Подгружаю копию этого проекта через символические ссылки, запускаю "play" там - происходит второй коннект к серверу. В коллекции serverObjects видится 2 объекта, все счастливы, на обоих клиентах все друг друга видят, сервер фиксирует 2 коннекта. Дальше я отключаю один из Unity-проектов (неважно, нажав "stop" или вырубив весь проект) - сервер фиксирует дисконнект, а вот оставшийся Unity вообще не реагирует, как будто ему ивент отключения с сервера вообще не приходил. В логе Unity последнее сообщение от события "register". "spawn" тоже отработал. Но вот "rdisconnected" не видит никак вообще, ни сразу, ни через пару минут (думал, может тайм-аут какой, о котором я не знаю).
Вопрос: есть ли идеи, как это вылечить? И попутно - если есть подозрение, что это из-за того, что проверка идет через symbolic links (то есть по сути-то, один и тот же проект, возможно с одним айди или адресом или еще чем-то), то как на самом деле надо тестировать сетевые приложения на Unity и в целом?

Код Nodejs:
var io = require('socket.io')(process.env.PORT || 52300);

// Custom classes
var Player = require('./Classes/Player.js');

console.log('Server has started');

var players = [];
var sockets = [];

io.on('connection', function(socket) {
  console.log('Connection made!');

  var player = new Player();

  players[player.id] = player;
  sockets[player.id] = socket;

  // Tell the client that this is our id for the server
  socket.emit('register', {
    id: player.id
  });
  socket.emit('spawn', player); // Tell myself i have spawned
  socket.broadcast.emit('spawn', player); // Tell others i have spawned

  // Tell myself about everyone else in the game
  for (var pID in players) {
    if (pID !== player.id) {
      socket.emit('spawn', players[pID]);
    }
  }

  socket.on('disconnect', function() {
    console.log('Player is disconnected');
    socket.broadcast.emit('rdisconnected', player);
    delete players[player.id];
    delete sockets[player.id];
  });
});


Код на клиенте Unity в единственном добавленном на сцену компоненте:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using SocketIO;
using Project.Utility;

namespace Project.Networking {
  public class NetworkClient : SocketIOComponent {

    [Header("Network Client")]
    [SerializeField]
    private Transform networkContainer;

    private Dictionary<string, GameObject> serverObjects;

    // Start is called before the first frame update
    public override void Start() {
      base.Start();
      initialize();
      setupEvents();
    }

    // Update is called once per frame
    public override void Update() {
      base.Update();
    }

    private void initialize() {
      serverObjects = new Dictionary<string, GameObject>();
    }

    private void setupEvents() {
      On("open", (E) => {
        Debug.Log("Connection made to the server");
      });

      On("register", (E) => {
        string id = E.data["id"].ToString().RemoveQuotes();

        Debug.LogFormat("Our Client's ID ({0})", id);
      });

      On("spawn", (E) => {
        // Handling all spawning players
        string id = E.data["id"].ToString().RemoveQuotes();

        GameObject go = new GameObject("Server ID: " + id);
        go.transform.SetParent(networkContainer);
        serverObjects.Add(id, go);
      });

      On("rdisconnected", (E) => {
        string id = E.data["id"].ToString().RemoveQuotes();
        Debug.LogFormat("User {id} disconnected", id);

        //Destroy(serverObjects[id]); // Remove from game
        //serverObjects.Remove(id); // Remove from memory
        //Debug.LogFormat("Dictionary has {count} objects", serverObjects.Count);
      });
    }
  }
}
  • Вопрос задан
  • 116 просмотров
Пригласить эксперта
Ответы на вопрос 1
AlexMcArrow
@AlexMcArrow
Люблю РНР, да я такой!
Согласно документации
// sending to all clients except sender
  socket.broadcast.emit('broadcast', 'hello friends!');

// sending to all connected clients
  io.emit('an event sent to all connected clients');


Попробуйте использовать io.emit для отправки уведомления об отключении пользователя
socket.on('disconnect', function() {
    console.log('Player is disconnected');
    io.emit('rdisconnected', player);
    delete players[player.id];
    delete sockets[player.id];
  });
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы