Ваша проблема
if (Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.WindowsPlayer)
{
m_currentPlayers.Add(conn.connectionId, 0);
}
else if (Application.platform == RuntimePlatform.Android)
{
m_currentPlayers.Add(conn.connectionId, 1);
}
Компонент NetworkLobbyManager
ведет себя по-разному при запуске в качестве клиента или хоста, но в конечном итоге, если я прав, хост обрабатывает порождение игрока.В вашем коде это означает, что компонент смотрит только на свою собственную платформу, а не на платформы подключающихся игроков .
Возможное решение
Вам необходимо передать информациюо подключении платформы игрока к хосту.Вы можете создать производный класс NetworkConnection
, который извлекает и переносит информацию о платформе, производный класс NetworkClient
, который использует ваш пользовательский класс NetworkConnection
, и в конечном итоге настроить собственный производный класс NetworkLobbyManager
для извлечения информации о платформе ииспользуйте его.
//NetworkClient
public class MyNetworkClient: NetworkClient
{
public MyNetworkClient() : base()
{
SetNetworkConnectionClass<MyNetworkConnection>();
}
}
//NetworkConnection class
public class MyNetworkConnection : NetworkConnection
{
private RuntimePlatform connectionPlatform;
public MyNetworkConnection() : base()
{
connectionPlatform = Application.platform;
}
public RuntimePlatform ConnectionPlatform { get { return connectionPlatform; } }
}
// Suggested adjustment for your NetworkLobbyManagerClass
void AddPlayer(MyNetworkConnection conn)
{
// I like switches, it's a question of taste imo
switch(conn.ConnectionPlatform)
{
case RuntimePlatform.Android:
m_currentPlayers.Add(conn.connectionId, 1);
break;
case RuntimePlatform.WindowsEditor:
case RuntimePlatform.WindowsPlayer:
default:
m_currentPlayers.Add(conn.connectionId, 0);
}
}
public override GameObject OnLobbyServerCreateLobbyPlayer(NetworkConnection conn, short playerControllerId)
{
// Explicitely pass your custom class
AddPlayer(conn as MyNetworkConnection);
return base.OnLobbyServerCreateLobbyPlayer(conn, playerControllerId);
}
public override GameObject OnLobbyServerCreateGamePlayer(NetworkConnection conn, short playerControllerId)
{
GameObject go = Instantiate(spawnPrefabs[m_currentPlayers[conn.connectionId]]);
NetworkServer.AddPlayerForConnection(conn, go, playerControllerId);
return go;
}
Я хотел бы услышать от вас, сработало ли это.:)
Отредактировано: поскольку MyNetworkConnection
наследуется от NetworkConnection
, его можно передавать как параметр NetworkConnection
.Это означает, что вы можете оставить свои переопределенные методы такими, какие они есть, однако вам необходимо явно передать ваш класс MyNetworkConnection
в ваш метод AddPlayer
.