Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Unity UNET переподключение

Unity UNET переподключение

Поделиться
Red_Baron_Постоялецwww26 апр. 201711:17#0
Всем привет.
Сейчас стоит задача сделать в приложении на UNET переподключение игрока в течение минуты, если он отключился (как в Hearthstone, да везде, в принципе). Вопрос: как это сделать наиболее правильно и быстро? Использую HLAPI, т.е. игрок - это префаб с NetworkBehaviour. При дисконнекте его объект уничтожается.

На ум пока приходит только идея записывать при дисконнекте игрока его состояние, а при подключении - писать эти данные в свежезаспавненный NetworkBehaviour. Но это приведет к переписыванию большого объема логики, завязанной на количество NetworkBehaviour-ов и работающей с ними.

Есть ли возможность отменить автоматическое уничтожение NetworkBehaviour на клиенте и сервере и при подключении игрока - присоединять его к его же пока живому префабу, а не спавнить новый?

Информации нашел на эту тему очень мало, заранее спасибо, если кто сталкивался и может помочь.

Правка: 26 апр. 2017 14:20

3daПостоялецwww19 мая 201719:06#1
Тоже интересно.
Red_Baron_Постоялецwww22 мая 20171:05#2
3da
В данный момент делаю так. Если игрок отключается по собственному желанию - он посылает сообщение, сервер помечает это и отключает соединение. Если нет - пометки не будет.

1. При дисконнекте клиента в NetworkManager-e -

 
    public override void OnServerDisconnect(NetworkConnection conn)
    {
       Player player = null;
       bool destroy = PlayerStateManager.CanDestroyPlayer (conn, out player);
       if (destroy) {
            NetworkServer.DestroyPlayersForConnection(conn);
       }
    }
Т.е. для действительно отключившихся игроков - префаб будет уничтожен, для переподключающихся - сохранен.

2. Если клиенту удалось переподключиться - он подключается как обычно, спавнится новый префаб и затем:

  NetworkServer.ReplacePlayerForConnection (conn, truePlayer.gameObject, player.playerControllerId);
  NetworkServer.Destroy (player.gameObject);
где truePlayer - сохраненный при отключении префаб, player - новый свежезаспавненный префаб. Красивее, конечно, не делать лишнего спавна по сети, но пока не было времени сделать это лучше + данный способ работает и для подключающихся игроков тоже (у которых нет старого префаба на клиенте).

Правка: 22 мая 2017 12:54

3daПостоялецwww22 мая 201722:35#3
Red_Baron_
> ReplacePlayerForConnection
Можно же переопределить метод
   
    public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)
    {
        
    }

И сделать чтобы сразу назначался нужный GameObject в качестве игрока.
Через метод

NetworkServer.AddPlayerForConnection

Правка: 22 мая 2017 22:36

/ Форум / Программирование игр / Сеть

2001—2017 © GameDev.ru — Разработка игр