Синхронизация в мультиплеере

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Синхронизация в мультиплеере

Сообщение Woland 29 июл 2013, 19:48

У меня при загрузке сцены пишется
Синтаксис:
Используется csharp
Network.Instantiate(g,new Vector3(10,10,10),Quaternion.identity,0);

g - это ферст персон контроллер, но также при создании я проверяю network и в зависимости от него я отключаю скрипты движения и камеру, так что каждый игрок управляет именно своим контроллером. НО отсутствует синхронизация движений, то есть другие игроки тупо висят в точке спауна, а вновь присоединившиеся не видят присоединившихся ранее. Как это исправить?
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

Re: Синхронизация в мультиплеере

Сообщение AMD 29 июл 2013, 19:54

Написать скрипт для синхронизации позиций или скорости движения, или управляющих команд
Программист — это профессиональный конвертер галлюцинаций заказчика в жесткую формальную систему.
AMD
UNITрон
 
Сообщения: 349
Зарегистрирован: 16 июн 2012, 14:33
Откуда: Москва

Re: Синхронизация в мультиплеере

Сообщение Woland 29 июл 2013, 19:57

Ну так есть же встроенная синхронизация, как её включить?
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

Re: Синхронизация в мультиплеере

Сообщение AMD 29 июл 2013, 20:05

Какая встроенная? Где? Откуда?
Или Вы про валяющийся, где-то на просторах инета, скрипт о синхронизации физ. объектов?
Программист — это профессиональный конвертер галлюцинаций заказчика в жесткую формальную систему.
AMD
UNITрон
 
Сообщения: 349
Зарегистрирован: 16 июн 2012, 14:33
Откуда: Москва

Re: Синхронизация в мультиплеере

Сообщение Woland 29 июл 2013, 20:08

Нет, я о State Synchronization в NetworkView
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

Re: Синхронизация в мультиплеере

Сообщение AMD 29 июл 2013, 20:10

Вот ссылка на офиц. источник
Программист — это профессиональный конвертер галлюцинаций заказчика в жесткую формальную систему.
AMD
UNITрон
 
Сообщения: 349
Зарегистрирован: 16 июн 2012, 14:33
Откуда: Москва

Re: Синхронизация в мультиплеере

Сообщение Woland 29 июл 2013, 20:15

Я пробовал любую stateSynchronization, синхронизации нет. Я поэтому и спрашиваю, из-за чего это может быть?

Вот полный код
Синтаксис:
Используется csharp
void Start () {
        Network.Connect("****",5000);
       
        }
        void OnConnectedToServer() {
                Network.Instantiate(g,new Vector3(10,10,10),Quaternion.identity,1);
        }


код проверки, висящий на g
Синтаксис:
Используется csharp
void Start () {
        if(!networkView.isMine)
                {
                        Transform[] bone=GetComponentsInChildren<Transform>();
                        Debug.Log("SD");
                        this.gameObject.GetComponent<MouseLook>().enabled=false;
                        this.gameObject.GetComponent<CharacterMotor>().enabled=false;
                        foreach(Transform child in bone)
                         {
                             if(child.name=="Main Camera") Destroy(child.gameObject);
                         }
                }
        }
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

Re: Синхронизация в мультиплеере

Сообщение AMD 29 июл 2013, 20:27

Вы по урокам пишите мультик или сами?

Если по урокам - там должно быть, либо скрипт либо объяснение.

Если нет, то вот что. Вам нужно именно передавать всем слушателям Вашу позицию, дело в том, что это просто "вспомогательный компонент" (оч. грубо сказано, но что бы понимали суть), который позволяет, что-либо синхронизировать по сети. За Вас само не будет делаться. Вот тут почитайте и в конце есть пример.
Программист — это профессиональный конвертер галлюцинаций заказчика в жесткую формальную систему.
AMD
UNITрон
 
Сообщения: 349
Зарегистрирован: 16 июн 2012, 14:33
Откуда: Москва

Re: Синхронизация в мультиплеере

Сообщение Woland 29 июл 2013, 20:32

How to send the data

You have 2 options to send the data of the Observed Component: State Synchronization and Remote Procedure Calls.

To use State Synchronization, set State Synchronization of the Network View to Reliable Delta Compressed or Unreliable. The data of the Observed Component will now be sent across the network automatically.

На сколько я понял, если мы выбрали State Synchronization, то данные должны отправляться автоматически(
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

Re: Синхронизация в мультиплеере

Сообщение AMD 29 июл 2013, 20:37

Поискать Вам сильно в лень?

http://www.unity3d.ru/distribution/viewtopic.php?f=14&t=16827#p126333
Программист — это профессиональный конвертер галлюцинаций заказчика в жесткую формальную систему.
AMD
UNITрон
 
Сообщения: 349
Зарегистрирован: 16 июн 2012, 14:33
Откуда: Москва

Re: Синхронизация в мультиплеере

Сообщение Woland 29 июл 2013, 20:42

Не работает у меня этот скрипт, делаю все как написано)
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

Re: Синхронизация в мультиплеере

Сообщение AMD 29 июл 2013, 20:47

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

В двух словах, больше конкретики.


----
А так же вот с этим ознакомьтесь
Программист — это профессиональный конвертер галлюцинаций заказчика в жесткую формальную систему.
AMD
UNITрон
 
Сообщения: 349
Зарегистрирован: 16 июн 2012, 14:33
Откуда: Москва

Re: Синхронизация в мультиплеере

Сообщение Woland 29 июл 2013, 20:55

С этим я уже тоже ознакомился) А насчет конкретики - пожалуйста. Беру скрипт для трансформа, в нетворквью выбираю его(как написано), синхронизации нет. Дальше
Синтаксис:
Используется csharp
void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info){
                         
                 if(stream.isWriting){
                                 
                         Vector3 pos = tTransform.position;
                         Quaternion rot = tTransform.rotation;
                               
                         stream.Serialize(ref pos);
                         stream.Serialize(ref rot);
                 }
                 else{
                            Debug.Log("DDD");    
                         Vector3 pos = Vector3.zero;
                         Quaternion rot = Quaternion.identity;
                         stream.Serialize(ref pos);
                         stream.Serialize(ref rot);
                         
                         for (int i=m_BufferedState.Length-1;i>=1;i--)
                         {
                                 m_BufferedState[i] = m_BufferedState[i-1];
                         }
                         
                         State state;
                         state.timestamp = info.timestamp;
                         state.pos = pos;
                         state.rot = rot;
                         m_BufferedState[0] = state;
                         
                         m_TimestampCount = Mathf.Min(m_TimestampCount + 1, m_BufferedState.Length);

                         for (int i=0;i<m_TimestampCount-1;i++)
                         {
                                 if (m_BufferedState[i].timestamp < m_BufferedState[i+1].timestamp)
                                         Debug.Log("State inconsistent");
                         }      
                 }
         }


DDD не выводится, то есть else не работает, и
Синтаксис:
Используется csharp
void Update(){
                         
                 if(!nNetworkView.isMine){
                                 
                     double interpolationTime = Network.time - m_InterpolationBackTime;
                 
                     if(m_BufferedState[0].timestamp > interpolationTime){
                                         Debug.Log("DDD");
                             for (int i=0;i<m_TimestampCount;i++){
                                                 
                                     if(m_BufferedState[i].timestamp <= interpolationTime || i == m_TimestampCount-1){
                                                         
                                             State rhs = m_BufferedState[Mathf.Max(i-1, 0)];
                                             State lhs = m_BufferedState[i];
                                         
                                             double length = rhs.timestamp - lhs.timestamp;
                                             float t = 0.1f;
                                                         
                                             if(length > 0.0001f){
                                                                 
                                                     t = (float)((interpolationTime - lhs.timestamp) / length);
                                             }
                                                         
                                             tTransform.position = Vector3.Lerp(lhs.pos, rhs.pos, t);
                                             tTransform.rotation = Quaternion.Slerp(lhs.rot, rhs.rot, t);
                                                         
                                             return;
                                     }
                             }
                     }
                 }
         }


DDD тоже не выводится.



Хочется все таки сказать, что если просто поставить трансформ в observed в State Synchronization, то синхронизация должна быть хоть какая то(это во всех туторах написано), у меня же её нет вообще. Возможно косяк в чем то другом?
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

Re: Синхронизация в мультиплеере

Сообщение AMD 29 июл 2013, 21:03

У вас уже есть синхронизация, что Вы видите второго и более игрока.

Насчет почему не выводится "DDD":

Такой скрипт у каждого? Сам void вызывается?

Проверьте правильность написания:
Вот уже увидел
!nNetworkView.isMine

Что за n в начале??
Программист — это профессиональный конвертер галлюцинаций заказчика в жесткую формальную систему.
AMD
UNITрон
 
Сообщения: 349
Зарегистрирован: 16 июн 2012, 14:33
Откуда: Москва

Re: Синхронизация в мультиплеере

Сообщение Woland 29 июл 2013, 21:10

Это переменная, все нормально) Все остальное вызывается нормально, скрипт висит у всех. Вообще не понимаю что не так

Ощущение, что другие клиенты не принимают информацию, происходит только отправка
Последний раз редактировалось Woland 29 июл 2013, 21:18, всего редактировалось 1 раз.
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

След.

Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 18