- •Tutorial 1. Connect & Disconnect
- •Tutorial 2: Sending messages Tutorial 2a: Server plays, client observes, no instantiating. Tutorial 2/Tutorial2a1
- •Tutorial 2/Tutorial 2a2
- •Tutorial 2/Tutorial 2a3
- •Tutorial 2b: Serever and client(s) play, with instantiating
- •Tutorial 3: Authoritative servers
- •Anti cheating
- •Using a proxy
- •Combat Lag: prediction, extrapolation and interpolation
- •Further network subjects explained Unity editor options related to networking
- •Limiting traffic: Scoping and group limiting
- •Securing the network connection
- •Manually allocate networkview id's
- •Network loading
- •Real life examples Example 1: Chatscript
- •Example 2: Masterserver example
- •Example 3: Lobby system
- •Example 4: fps game
- •Tips OnSerializeNetworkView bug in 2.6 (and earlier)
- •Group limit
- •Run dedicated servers
- •Connection issues: How to connect over the internet
- •Other networking options
Tips OnSerializeNetworkView bug in 2.6 (and earlier)
I never wanted to use the OnSerializeNetworkView networking method (loved RPC so much), and when I finally did it appeared to have a big flaw. This flaw only occurs when you allocate viewid's yourself. An extract of my bug ticket:
«When using OnSerializeNetworkView with an observing networkview (reliable delta compressed in this case), it all works fine with 1 player (as host). As soon as a second client joins, it will complain about not knowing about the first assigned networkviewID of the first player.»
«Received state update for view ID ******random info here about your specific number*** but no initial state has ever been sent. Ignoring message.»
The problem is that these networkviews are bugged: the new client never get the «initial state» of the networkviews that have been assigned BEFORE that new client connected. This affects all clients.”
Also see: http://forum.unity3d.com/viewtopic.php?p=77193
Group limit
Вы можете использовать только 32 группы, даже если в коде вы назначите для networkview группу 48. В такой ситуации будет использоваться группа 48 (48 - 32).
RPC bug?
Не позволяйте этой ошибке убивать ваше время: если у вас есть игра, где авторитарный сервер является и игроком, попробуйте использовать такой код:
networkView.RPC("SendUserInput", RPCMode.Server, horizontalInput, verticalInput);
Если же и это не работает, то опробуйте так:
if(Network.isServer){ SendUserInput(horizontalInput, verticalInput); } else{ networkView.RPC("SendUserInput", RPCMode.Server, horizontalInput, verticalInput); }
Run dedicated servers
Недостаток реализации сети в Unity — выделенный (dedicated) сервер не столь выделенный, как хотелось бы. Однако, он вполне себе работает. Запуск выделенного сервера на Mac OS X возможен, если задать параметр пакетного режима при выполнении. В 2.6 была добавлена аналогичная функция и для Windows.
Подробнее по ссылке: http://unity3d.com/support/documentation/Manual/Command%20Line%20Arguments.html
Когда запущен выделенный сервер, нужно использовать Application.targetFrameRate для того, чтобы удостовериться, что Unity не пытаается запустить ваш сервер с 1000+ fps, сжирая ваши ресурсы.
Connection issues: How to connect over the internet
Отличие интернет-подключения от подключения внутри LAN-сети в том, что скорость обычно несколько ниже.
Если же игра через интернет не работает, то проверьте следующее:
Работает ли игра через LAN?
Оба компьютера имеют работающее интернет-соединение?
Открыт ли на обоих компьютерах в их файрволлах используемый порт? Можно на время даже отключить файрволлы.
Попробуйте прямое подключение. Запустите сервер и с другого компьютера произведите подключение по внешнему IP-адресу сервера.
Если это всё не помогло, то ваш сетевой роутер вероятно пытается блокировать неизвестное входящее подключение как небезопасное. Есть два варианта:
использовать NAT для проброса (смотрите пример с мастерсервером). Проверьте, поддерживает ли ваш роутер NAT-пробросы.
откройте порт для использования в вашем роутере и/или сделайте форвардинг всех соединени по этому порту на ваш внутренний (LAN) IP-адрес.
