Создание объектов по сети

Сеть в Unity3D

Создание объектов по сети

Сообщение Ferz 05 авг 2009, 23:49

Ситуация такая. Делаю я сетевой шутер, на основе сетевого примера с официального сайта. Прикрутил следующий код, для запуска пулек:

Код: Выделить всё
var projectile:Transform;
var turretTubeEnd : Transform;
var turretTube : Transform;
var mainCollider : Collider;
var speed = 200;

function Update ()
{
   if (Input.GetButtonDown("Fire1"))
   {
      var instPr: Transform = Network.Instantiate(projectile,turretTubeEnd.position,turretTubeEnd.rotation,0);
      Physics.IgnoreCollision(instPr.collider,mainCollider.collider);
      instPr.rigidbody.velocity = turretTubeEnd.TransformDirection(Vector3(0,0,speed));
   }
}

Этот код прикручен к префабу джипика.
Пульки запускаются, но проблема в том, что когда я тестирую это на своем компьютере, запуская сервер, и приконнекчиваясь туда несколькими юзерами, принажатии левой кнопки мыши, пульки запускаются с объектов всех игроков. то есть как будто все одновременно выстрелили. Собственно вопрос - с чем такое поведение может быть связано?
И второй вопрос, нет ли у кого на примете примеров работы с сетью, за исключением официального. Чтобы там побольше объектов динамически создавалось.
Ferz
UNец
 
Сообщения: 35
Зарегистрирован: 25 июл 2009, 00:20

Re: Создание объектов по сети

Сообщение Neodrop 06 авг 2009, 00:34

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

Re: Создание объектов по сети

Сообщение Ferz 06 авг 2009, 11:46

Огромное спасибо, теперь все стреляет нормально. Но осталась еще проблема, когда пользователь подключается, у него загружаются все произошедшие выстрелы. Видимо операция Network.Instantiate() остается в буфере, и при взрыве пульки никуда не исчезает. Я пробовал удалить ее из буфера, прицепив к пульке следующий скрипт:

Код: Выделить всё
var explosion : Transform;
var damage : float;

function OnCollisionEnter(collision : Collision)
{
   var contact : ContactPoint = collision.contacts[0];
   var rotation = Quaternion.FromToRotation(Vector3.up, contact.normal);
   var instExplosion = Network.Instantiate (explosion, contact.point, rotation,0);

   Network.RemoveRPCs(gameObject.networkView.viewID);
   Network.Destroy(gameObject);
}

Но что-то не помогает. Как правильно убивать динамически созданный объект?
Ferz
UNец
 
Сообщения: 35
Зарегистрирован: 25 июл 2009, 00:20

Re: Создание объектов по сети

Сообщение Neodrop 06 авг 2009, 14:37

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

Re: Создание объектов по сети

Сообщение Neodrop 06 авг 2009, 14:49

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

Re: Создание объектов по сети

Сообщение Ferz 06 авг 2009, 15:22

Огромное спасибо!
Но во втором варианте, возможно проще будет сделать, чтобы клиент посылал RPC типа "хочу сделать пульку", а на сервере уже проверялась легальность операции и создавалась эта самая пулька.
Ferz
UNец
 
Сообщения: 35
Зарегистрирован: 25 июл 2009, 00:20

Re: Создание объектов по сети

Сообщение Neodrop 06 авг 2009, 15:44

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

Re: Создание объектов по сети

Сообщение Ferz 06 авг 2009, 23:42

И в продолжение темы пулек. Как ни странно, при подобной организации процесса стрельбы (посредством двух RPC функций, наподобие http://unity3d.com/support/documentatio ... w.RPC.html), уже при небольшой скорости движения джипика, пульки начинают вылетать заметно позади. Соответственно вопрос, что лучше сделать:
1. Передавать в RPC функцию не только координаты стреляющего объекта, но и его скорости, чтобы можно было вычислить олткуда надо стрелять.
2. Передавать в RPC функцию ViewID стреляющего объекта, чтобы каждый клиент определял по этому ViewID из какой координаты вылетает пулька.
3. Вместо вызова второй RPC функции на сервере, которая говорит всем клиентам создать пульку использовать Network.Instantiate.
Ferz
UNец
 
Сообщения: 35
Зарегистрирован: 25 июл 2009, 00:20

Re: Создание объектов по сети

Сообщение 6opoDuJI0 18 янв 2010, 10:22

чисто как вариант =)можно сделать так,чтобы сервер при запросе создания обьекта проверял легальность создания,а потом создавал обьект.в свою очередь,к обьекту цепляется скрипт,который сообщал бы клиенту(клиентам) о создании этого обьекта(т.е. в функции Start).как вариант можно создать очередь сообщений,чтобы не получалось путаницы)т.е. таким образом,работал бы какойнить очередной пустой ГО Network Controller,который рассылал бы клиентам сообщения из этого буфера(при их наличии) и имел бы переменную curmsg(указывает на текущее сообщение,которое нужно отправить) и msgcounter(увеличивается каждый раз при добавлении сообщения в буффер),а самому буферу придать иллюзию кольцевой структуры(т.е. создать попросту создать таблицу,в которой былобы 3 элемента - собственно сообщение, указатель на следующий и предыдущий элементы массива(первый элемент указывает на второй и последний элементы,последний указывает на первый и n-1, третий на второй и четвёртый,и т.д. и т.п.).запись сообщения должна происходить в curmsg элемент массива,а msgcounter увеличиватся на 1.в случае если msgcounter>0 тогда бы сообщение из curmsg рассылалось бы клиентам,curmsg присваивалось бы значение "указателя" на следующий элемент,а msgcounter-=1
таким образом,чтобы обьекту надо было сообщить о своём появлении он должен былбы дописать в массив сообщение о своём появлении.точнотакже для безопасности можно добавить в массив аналог мютекса
А вам тоже нравится в мороз выпускать изо рта тонкую струйку пара и чувствовать себя драконом?:)
Аватара пользователя
6opoDuJI0
UNIт
 
Сообщения: 85
Зарегистрирован: 06 янв 2010, 20:00

Re: Создание объектов по сети

Сообщение Leorn 18 май 2010, 08:32

Извенит е конечно но я так и непонял вопроса, к примеру имеем скрипт
Код: Выделить всё
var Patroncopy : Transform;

Function Update()
{
if keydown("fair")
{
var IDMy = Network.AllocateViewID();
networkView.RPC("Faya", RPCMode.AllBuffered, IDMy, transform.position);
}
}
@RPC
function Faya (viewID : NetworkViewID, location : Vector3) {
    var copy : Transform;
    copy = Instantiate(Patroncopy, location, Quaternion.identity);
    var nView : NetworkView;
    nView = copy.GetComponent(NetworkView);
    nView.viewID = IDMy;
}


Скрипт прикручен к игроку,вопрос как и в начале почему при выстреле, происходи клонирования объекта у всех польхователей а не только у меня.
Сматрел M2H непонял как там сделано возможно вы напишети готовое решение и объясните нубку.
P.S. понимаю что прошу написать игру но всеже не как немогу понять ....
Leorn
UNец
 
Сообщения: 30
Зарегистрирован: 02 янв 2010, 22:50

Re: Создание объектов по сети

Сообщение frostyden 25 май 2010, 18:42

Может вы не поймете, но сетка тут простая, но надо прежде чем кодить теорию изучить.

Вапще это из-за того что networkView.RPC пакет идет всем, во-первых. И правильно он должен клонироваться в удаленной сцене у каждого игрока. Если все игроки стреляют это как раз результат не разделения их по networkView.

Вам надо, разделить логику скриптов по networkView или как хочется вам), во-вторых. Это означает что нажимая кнопку, она будет срабатывать только над объектом, которым владеет ваш gateway.

Код: Выделить всё
if (networkView.isMine)
   { // Ваше соединение
   }
   else
   { // Удаленный игрок
   }


Немного теории. networkView это такая штука единственная уникальная одинаковая на всех клиентах и сервере. У сервера абсолютная полная инфа, а на стороне клиента, он может и не в курсах быть о существование других игроков и т.д.
Курите мануал [unity 3D]. http://unity3d.com/support/documentation/Components/class-NetworkView.html
frostyden
UNец
 
Сообщения: 12
Зарегистрирован: 02 дек 2009, 15:31


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

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

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