Сборные спавны в соответствии с платформой игрока с LobbyManager - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь создавать разные префабы в зависимости от платформы игрока. Поэтому я переопределяю NetworkLobbyManager для создания объектов так, как я хочу. Поэтому я создаю словарь, который связывает connectionId с индексом префаба, а затем создаю экземпляр префаба в соответствии с этим индексом.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class LobbyManager : NetworkLobbyManager
{
    private Dictionary<int, int> m_currentPlayers;

    void Start()
    {
        m_currentPlayers = new Dictionary<int, int>();
    }

    void AddPlayer(NetworkConnection conn)
    {
        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);
        }
    }

    public override GameObject OnLobbyServerCreateLobbyPlayer(NetworkConnection conn, short playerControllerId)
    {
        AddPlayer(conn);

        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;
    }
}

Но с этим кодом Spawn Player на клиентах всегда такой же, как и на хосте, и я не знаю почему, потому что похоже, что я переопределяю правильные функции, и я увидел здесь http://abrgame.blogspot.fr/2016/01/using-unet-to-spawn-different-player.html парня который использовал ту же технику, и это работает для него ...

1 Ответ

0 голосов
/ 11 мая 2018

Ваша проблема

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.

...