UDKФорум

PlayerController, PlayerPawn и сеть.

#0
19:32, 19 мая 2013

Сразу оговорюсь я работаю с UnrealEngine2Runtime то есть вторая версия движка, так сложилось. Поэтому тема возможно немного не сюда но движки всёж близкие родственники.

В общем на данный момент пишу симулятор довольно инертного транспортного средства. Всю физику движения объекта поместил в PlayerPawn(наследуется от Pawn) (расчитывается каждый тик), управление объектом вынесено в PlayerController. Пока всё делал локально всё было как и положено просто великолепно, но когда пришло время сети всё стало очень нехорошо.

Попробую описать поподробней:
1. Положение+направление камеры привязано к положению PlayerPawn

event PlayerCalcView(out actor ViewActor, out vector CameraLocation, out rotator CameraRotation ){
 local PlayerPawn tmp;
 tmp = PlayerPawn(Pawn);
 CameraRotation = tmp.GetRotation();
 CameraLocation = tmp.PlayerPosition;
}

2. Кнопки(и оси) управления передаются на сервер через реплицируемую функцию, с сервера приходят основные свойства объекта положение/направление/скорость.

В итоге упраление очень дёрганое просто до ужаса примерно как будто обработка идёт 2-3 раза в секунту. Я так понимаю это время на отработку действий по сети, то есть уход нажатия кнопок, возвращение новой позиции/поворота.

Вопросы:
1. Можно ли заставить "локальный" PlayerPawn реагировать мгновенно, и только при приходе данных с сервера "подгонятся" под них, то есть нажал кнопку сразу пошёл поворот.
2. Можно ли как то заставить движок симулировать физику, у меня она очень инертна и должна хорошо симулироваться.

#1
20:28, 20 мая 2013

VBKesha
> Можно ли заставить "локальный" PlayerPawn реагировать мгновенно, и только при
> приходе данных с сервера "подгонятся" под них, то есть нажал кнопку сразу пошёл
> поворот.
Обычно в мультиплеерных гонках вся физика считается параллельно на клиенте, и на сервере. После клиент шлет данные на сервер и поведение транспортного средства у клиента сверяется с поведением на сервере. При существенных расхождениях в поведении верной принимается серверная модель. Положение транспортного средства корректируется. Это позволяет обеспечить плавность и реалистичность движения машин и избежать нежелательных действий со стороны клиента (читерства).

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

> 2. Можно ли как то заставить движок симулировать физику, у меня она очень
> инертна и должна хорошо симулироваться.
Касаемо UE2 ничего не скажу. В UE3 физика поддерживается движком.

#2
18:04, 24 мая 2013

VBKesha

Э... нет ли модификатора simulated для функций ? Помнится, у Епиков был мануальчик такой для сетевых дел

#3
11:29, 26 мая 2013

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

#4
22:21, 28 мая 2013

VBKesha
Так обрати внимания на репликации -  ибо нечего слать каждый тик что не поподя :)

#5
16:02, 4 июня 2013

Запутался я с репликаицей окончательно, хотя сделал что мне надо но как я это сделал мне совсем не нравится.
Не могу понять как одновременно вызвать функцию и на клиенте и на сервере. Сейчас PlayerController создаёт структуру с кнопками управления и передаёт в PlayerPawn к которому прикреплён, через функцию SetControl. Так данная функция описана правилом

replication
{
  reliable if(Role < ROLE_Authority)
       SetControl;
}
[code]
Соответсвенно она вызывается на сервере. А надо чтобы она отрабатывала и на сервере и на клиенте. После долгих и неправильных мучений я сделал аналог функции SetControl назвал SetControl2 [code]replication
{
    reliable if(Role == ROLE_Authority)
      SetControl2;
}

Соотвественно он реплицируется с сервера на клиент. Делает она тоже что и SetControl, и вызывается из SetControl.

function SetControl(Controll pControll){
  PLControll=pControll;
  SetControl2(pControll);
}

В общем то это работает но смотрится крайне бредово на мой взгляд, может ктото знает как сделать правильно?

#6
9:19, 5 июня 2013

VBKesha
> Не могу понять как одновременно вызвать функцию и на клиенте и на сервере.

Никак не получится через simulated методы ?
Какие там есть модификаторы для методов ?

#7
9:07, 21 июня 2013

http://unrealscript.narod.ru/tutorials/scripting/replication/replication.html

UDKФорум

Тема в архиве.