Связь скрипта по сети с пом NetworkView. Укрощение rigidbody

Сеть в Unity3D

Связь скрипта по сети с пом NetworkView. Укрощение rigidbody

Сообщение Faps 27 сен 2010, 06:33

Уважаемые кодеры и мега гейммастера!

прошу не плевать в мою сторону а отписаться достойно...

Преамбула:
на днях пытался связать по сети объект, на котором были
  1. rigidbody
  2. скрипт движка управления
  3. скрипт управления двежком через интерфейс
+ соответственно добавляю NetworkView (следит за ригидбоди)
Воаля все по сети работает, движение передается, но все работает скачками. покумекал с пару часов и понял - вся потеха в в ригидбодии..., в параметрах дигри = 1 - отсюда и рывки.
Пошел другим путем выставил наблюдения нетворка на скрипт движка безрезультатно, добавил для сериализации некоторые приватные поля, тоже результату 0 - [unity 3D] даже не пытается передавать сериализованный скрипт по сети (атрибуты [unity 3D] энжайна), нашел атрибут юньки [SerializePrivateVariables] (не описанный в доках) эффекта 0.
Ладно плюнул и на все это: добавляю унифицированный скрипт (через интерфейс) для управления сети ставлю метод OnSerializeNetworkView() в нем передаю и принимаю данные ригидбоди (на приеме дрэг в 0 кидаю) - Ураа вроде меньше скачков, но плавности ни какой нет, да и самому сериализацию нуно настраивать.

Вопрос:
  1. Какими правилами пользоваться чтоб NetworkView при наблюдении сам передавал параметры скрипта без метода OnSerializeNetworkView
  2. как победить ригидбоди с дрэгом 1 (юзал NetworkRigidbody скачки не ушли)

Большое спасибо за ответы :) , буду ждать (popcorn) (popcorn1)
Faps
UNIт
 
Сообщения: 73
Зарегистрирован: 29 май 2010, 13:21

Re: Связь скрипта по сети с пом NetworkView. Укращение rigidbody

Сообщение Ert Donuell 27 сен 2010, 08:49

Ставьте галочку "IsKinematic" ;)
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: Связь скрипта по сети с пом NetworkView. Укращение rigidbody

Сообщение Faps 27 сен 2010, 19:25

интересный подход для того чтоб физику писать самому

но я юзаю AddForce, что не работает в кинематике

и меня волнует вопрос

Какими правилами пользоваться чтоб NetworkView при наблюдении сам передавал параметры скрипта без метода OnSerializeNetworkView???
Faps
UNIт
 
Сообщения: 73
Зарегистрирован: 29 май 2010, 13:21

Re: Связь скрипта по сети с пом NetworkView. Укращение rigidbody

Сообщение Neodrop 29 сен 2010, 10:41

Сами только мухи родяться.
В наблюдаемом скрипту нужно определить @RPC метод и вызывать его для синхронизации значений к примеру. Само ничего делаться не будет.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Связь скрипта по сети с пом NetworkView. Укращение rigidbody

Сообщение Faps 29 сен 2010, 20:14

это понятно
ну нахрен тогда нужны выше перечисленные атребуты

допустим чтоб синхронизировать трансформ ригибоди и другие ст классы достаточно указать их в наблюдении
Faps
UNIт
 
Сообщения: 73
Зарегистрирован: 29 май 2010, 13:21

Re: Связь скрипта по сети с пом NetworkView. Укращение rigidbody

Сообщение Neodrop 29 сен 2010, 20:44

А чтобы сделать игру, пока ещё не придумали кнопку "Сделать заепись!"
Работайте.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Связь скрипта по сети с пом NetworkView. Укращение rigidbody

Сообщение 6opoDuJI0 06 окт 2010, 00:55

для синхронизации движения :
как вариант использовать NetworkInterpolatedTransform.cs
Код: Выделить всё
using UnityEngine;
using System.Collections;

public class NetworkInterpolatedTransform : MonoBehaviour {
   
   public double interpolationBackTime = 0.1;
   
   internal struct  State
   {
      internal double timestamp;
      internal Vector3 pos;
      internal Quaternion rot;
   }

   // We store twenty states with "playback" information
   State[] m_BufferedState = new State[20];
   // Keep track of what slots are used
   int m_TimestampCount;
   
   void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)
   {
      // Always send transform (depending on reliability of the network view)
      if (stream.isWriting)
      {
         Vector3 pos = transform.localPosition;
         Quaternion rot = transform.localRotation;
         stream.Serialize(ref pos);
         stream.Serialize(ref rot);
      }
      // When receiving, buffer the information
      else
      {
         // Receive latest state information
         Vector3 pos = Vector3.zero;
         Quaternion rot = Quaternion.identity;
         stream.Serialize(ref pos);
         stream.Serialize(ref rot);
         
         // Shift buffer contents, oldest data erased, 18 becomes 19, ... , 0 becomes 1
         for (int i=m_BufferedState.Length-1;i>=1;i--)
         {
            m_BufferedState[i] = m_BufferedState[i-1];
         }
         
         // Save currect received state as 0 in the buffer, safe to overwrite after shifting
         State state;
         state.timestamp = info.timestamp;
         state.pos = pos;
         state.rot = rot;
         m_BufferedState[0] = state;
         
         // Increment state count but never exceed buffer size
         m_TimestampCount = Mathf.Min(m_TimestampCount + 1, m_BufferedState.Length);

         // Check integrity, lowest numbered state in the buffer is newest and so on
         for (int i=0;i<m_TimestampCount-1;i++)
         {
            if (m_BufferedState[i].timestamp < m_BufferedState[i+1].timestamp)
               Debug.Log("State inconsistent");
         }
         
         //Debug.Log("stamp: " + info.timestamp + "my time: " + Network.time + "delta: " + (Network.time - info.timestamp));
      }
   }
   
   // This only runs where the component is enabled, which is only on remote peers (server/clients)
   void Update () {
      double currentTime = Network.time;
      double interpolationTime = currentTime - interpolationBackTime;
      // We have a window of interpolationBackTime where we basically play
      // By having interpolationBackTime the average ping, you will usually use interpolation.
      // And only if no more data arrives we will use extrapolation
      
      // Use interpolation
      // Check if latest state exceeds interpolation time, if this is the case then
      // it is too old and extrapolation should be used
      if (m_BufferedState[0].timestamp > interpolationTime)
      {
         for (int i=0;i<m_TimestampCount;i++)
         {
            // Find the state which matches the interpolation time (time+0.1) or use last state
            if (m_BufferedState[i].timestamp <= interpolationTime || i == m_TimestampCount-1)
            {
               // The state one slot newer (<100ms) than the best playback state
               State rhs = m_BufferedState[Mathf.Max(i-1, 0)];
               // The best playback state (closest to 100 ms old (default time))
               State lhs = m_BufferedState[i];
               
               // Use the time between the two slots to determine if interpolation is necessary
               double length = rhs.timestamp - lhs.timestamp;
               float t = 0.0F;
               // As the time difference gets closer to 100 ms t gets closer to 1 in
               // which case rhs is only used
               if (length > 0.0001)
                  t = (float)((interpolationTime - lhs.timestamp) / length);
               
               // if t=0 => lhs is used directly
               transform.localPosition = Vector3.Lerp(lhs.pos, rhs.pos, t);
               transform.localRotation = Quaternion.Slerp(lhs.rot, rhs.rot, t);
               return;
            }
         }
      }
      // Use extrapolation. Here we do something really simple and just repeat the last
      // received state. You can do clever stuff with predicting what should happen.
      else
      {
         State latest = m_BufferedState[0];
         
         transform.localPosition = latest.pos;
         transform.localRotation = latest.rot;
      }
   }
}

крепи куда надо,ставь его в кач-ве цели для networkview'а, но учти,что скрипт должен быть выключен в том экземпляре приложения,которое двигает этот трансформ,а на остальных-включен
т.е. если сервер должен передвигать его,то скрипт должен быть выключен на обьекте на сервере.как сделать вкл/выкл скрипта надеюсь догадаешся сам
з.ы. сам польззуюсь,когда в посл. раз проверяли на пинге в 200,всё было ок,движение без рывков ,мягкое и плавное
А вам тоже нравится в мороз выпускать изо рта тонкую струйку пара и чувствовать себя драконом?:)
Аватара пользователя
6opoDuJI0
UNIт
 
Сообщения: 85
Зарегистрирован: 06 янв 2010, 20:00

Re: Связь скрипта по сети с пом NetworkView. Укращение rigidbody

Сообщение Faps 06 окт 2010, 22:06

спосибо огромное за интерполятор (я так понимаю он ригид боди даже не трогает, да и фиг с ним)
(3A4OT)

вопрос еще один так и остался:
Какими правилами пользоваться, чтоб NetworkView при наблюдении передавал параметры скрипта без метода OnSerializeNetworkView???
(т.е. чтобы можно было бы указать, к примеру, наблюдаемые свойства/переменные с помощью атрибутов и NetworkView передавал бы их по сети)
Faps
UNIт
 
Сообщения: 73
Зарегистрирован: 29 май 2010, 13:21

Re: Связь скрипта по сети с пом NetworkView. Укращение rigidbody

Сообщение 6opoDuJI0 07 окт 2010, 00:16

зачот за интерполятор ставь разрабам юнити,это скрипт из оффпримера :D
насколько я знаю,то синхронизировать переменные без OnserializeNetworkView или RPC проблематично
или кто знает как сделать без них, скажите что я не прав
А вам тоже нравится в мороз выпускать изо рта тонкую струйку пара и чувствовать себя драконом?:)
Аватара пользователя
6opoDuJI0
UNIт
 
Сообщения: 85
Зарегистрирован: 06 янв 2010, 20:00

Re: Связь скрипта по сети с пом NetworkView. Укращение rigidbody

Сообщение Neodrop 14 окт 2010, 07:13

Кстати, если на объекте висит хоть один NetworkView, то на нём (на это ГО) может быть хоть двадцать скриптов, использующих RPC и для них навешивать новые NetworkView компоненты уже не нужно. Они дружно будут использовать тот, который уже есть на объекте.
Это так - для общего развития. ;)
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Связь скрипта по сети с пом NetworkView. Укращение rigidbody

Сообщение Faps 14 окт 2010, 18:46

Neodrop писал(а):Кстати, если на объекте висит хоть один NetworkView, то на нём (на это ГО) может быть хоть двадцать скриптов, использующих RPC и для них навешивать новые NetworkView компоненты уже не нужно. Они дружно будут использовать тот, который уже есть на объекте.
Это так - для общего развития. ;)

спасибо за информацию, я о ней узнал буквально 3 дня назад методом тыка
Но вот бы было бы выполненно на NetworkView наблюдение за скриптом, которое передает параметры с выделенными с помощью атрибутов [curved_hands]
Faps
UNIт
 
Сообщения: 73
Зарегистрирован: 29 май 2010, 13:21


Вернуться в Сеть

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3