Войти
UnityФорумСеть

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

#0
11:17, 26 апр. 2017

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

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

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

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


#1
19:06, 19 мая 2017

Тоже интересно.

#2
1:05, 22 мая 2017

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 - новый свежезаспавненный префаб. Красивее, конечно, не делать лишнего спавна по сети, но пока не было времени сделать это лучше + данный способ работает и для подключающихся игроков тоже (у которых нет старого префаба на клиенте).

#3
22:35, 22 мая 2017

Red_Baron_
> ReplacePlayerForConnection
Можно же переопределить метод
   

    public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)
    {
        
    }

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

NetworkServer.AddPlayerForConnection

UnityФорумСеть

Тема в архиве.