Простое объяснение мультиплеера в Unity. Как известно, чтобы создать мультиплеер в Юнити, мы делаем сначала объект со скриптом интерфейса мультиплеера, наподобие скрипта коннект. И затем вешаем на наш движущийся объект компонент Networkview. И он якобы обеспечивает синхронизацию движения на клиенте и на сервере. Но это не совсем так. В данном случае будет синхронизированно только движение с сервера на клиент. А с клиента на сервер не будет. Как же на Юнити делается полноценный мультиплеер? Там используется для двусторонней синхронизации объекта единственный метод (за исключением скриптового решения по RPC) - метод NetworkInstansiate. NetworkInstansiate это тоже команда в скрипте. Но смысл этой команды - инстансирование(создание) в игре префаба на сервере и на клиентe одновременно. И тогда, объект инстансированный таким методом, будет синхронизирован и на клиенте, и на сервере в обе стороны, без дополнительных скриптов. Объект конечно должен иметь на себе компонент Networkview. Выглядеть этот метод будет следующим образом: var avatar0: Transform; function OnConnectedToServer() { Network.Instantiate(avatar0, transform.position, transform.rotation, 0); } В avatar0 мы проставляем любой префаб который мы хотим проинстансировать по сети Естественно этот префаб должен содержать компонент Networkview. А сам скрипт вешается на пустой гейм объект, называемый Spawn(название не важно) И именно в местоположении этого объекта, Spawna, будет инстансироватся наш префаб у всех клиентов один раз при запуске сервера или подключения клиента. Именно таким методом сделаны машины по мультиплееру и 3д персоны в примере мультиплеера из официального туториала. Можно сказать что там в наш префаб avatar0 ставятся или префаб машины или префаб 3д персона. Но из-за входящих инпутов в управлении этими объекта там написаны дополнительно скрипты, чтоб разграничить какой объект управляется на клиенте, а какой на сервере. Иначе возникнет путаница Ну и вторым методом взаимодействия по сети является метод RPC. Описывая в скриптах метод RPC, мы можем передавать в обе стороны числовые данные, текстовые, анимации, координаты объекта вращение и др. Поэтому вторым способом чтобы восполнить пробел передачи движения объекта с клиента на сервер может быть метод RPC,где мы по РПС передадим координаты объекта c клиента на сервер. Что и описано во 2 пункте примера. То есть это будет скриптовый метод передачи. Для этого мы повесим на наш объект дополнительный скрипт. Как пример Рпс - команда прыжка: function Update(){ } networkView.RPC ("Jump", RPCMode.All); } //RPC функция пишется всегда в самом низу скрипта @RPC function Jump () { if(Input.GetKey("space") ) transform.position.y += 1; } Смысл РПС, это как смысл таких же функций ссылающихся одну на другую. Когда мы пишем из одной функции вызов другой: function Update(){ Jump(); } function Jump(){ if(Input.GetKey("space") ) transform.position.y += 1; } Но в данном случае все происходит на одном скрипте, на одном гейм объекте. А в случае с РПС мы обращаемся по РПС к функциям по сети, на этих же объектах, но расположенных на других компьютерах, на клиентах. Поэтому если на клиенте произойдет по РПС прыжок, То объект на сервере его перехватит. Так как в функции апдейт произойдет вызов функции РПС Jump по сети на клиенте.