Ребят, помогите пожалуйста :)
Впервые делаю что-то сетевое, и вот решил подружить 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);
});
}
}
}