Проблемы с синхронизацией позиции башни танка. - Форум Игроделов
Чт, 02 Май 2024, 14:16 
 
Приветствую Вас Гость Главная | Регистрация | Вход
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум Игроделов » UNITY3D » СКРИПТИНГ » Проблемы с синхронизацией позиции башни танка. (сервер - клиент)
Проблемы с синхронизацией позиции башни танка.
VolkOrievithДата: Пт, 18 Дек 2015, 14:58 | Сообщение # 1
Нет аватара
 
Сообщений: 222
Награды: 0
Репутация: 53
Статус: Offline
Посмотрел видеоуроки Networking, маленько понял суть.
Делаю мультиплеер для своего танковского проекта.
Танк при спауне собирается из башни и корпуса. При этом башня удочеряется корпусу.
Когда один игрок спаунит танк, у другого башня не удочеряется корпусу.
Спаун происходит в RPC функции через так:
Код

корпус = Network.Instantiate ...
башня = Network.Instantiate ...
башня.родитель = корпус.

У того игрока, который спаунит танк, всё хорошо. У другого игрока башня не удочеряется, и поэтому моргает (то (0, 1.2, -0.4) по локальной, то то же по глобальной)
Скрипт синхронизации такой:
Код
var LastPosition : Vector3;
var LastRotation : Quaternion;

function Start (){
if (!networkView.isMine){
this.enabled = false;
}
}

function Update () {
if ( Vector3.Distance ( transform.position, LastPosition) > 0.05 || Quaternion.Angle ( transform.rotation, LastRotation) > 0.5){
LastPosition = transform.position;
LastRotation = transform.rotation;
networkView.RPC ("SetTransform", RPCMode.OthersBuffered, LastPosition, LastRotation);
}
}
@RPC
function SetTransform ( position : Vector3, rotation : Quaternion){
transform.localPosition = position;
transform.localRotation = rotation;
}


Может в этом скрипте как-то можно написать, чтобы он синхронизировал своего родителя с остальными игроками?

пи-си:
может написал я коряво, но надеюсь, понятно.

Добавлено (17 Дек 2015, 18:10)
---------------------------------------------
Маленько перефразирую:
Имея два объекта с networkView, инстанциированых клиентом, можно ли на сервере удочерить один другому?

Добавлено (18 Дек 2015, 14:58)
---------------------------------------------
Ну же, ребят, нужна помощь!
Вот еще доп. инфа, функция спауна танка:
Код
function Spawn () {
var b : Transform;
b = Network.Instantiate (Body, SpawnPoints[RN].transform.position, SpawnPoints[RN].transform.rotation, 0);
ReSpawnTimer = ReSpawnDaley;
var t : Transform;
var Tr = b.GetComponent("Tracks");
t = Network.Instantiate (Turret, SpawnPoints[RN].transform.position + SpawnPoints[RN].transform.TransformDirection(Tr.TurretPosition) , SpawnPoints[RN].transform.rotation, 0);
gameObject.GetComponentInChildren( SmoothFollow ).target = t.transform;
gameObject.GetComponentInChildren( SmoothFollow ).Team = b.GetComponent("Health");
t.parent = b;
b.GetComponent("Health").Team = Team;
for (var DHit : Damage in t.GetComponentsInChildren(Damage))
DHit.GetComponentInChildren(Damage).MyHealth = b.GetComponent("Health");
b.GetComponent("Health").Turret = t.transform;

b.GetComponent("Health").PlayerTurret = t.GetComponent("PlayerTurret");
b.GetComponent("Health").DeadTurret = t.GetComponent("PlayerTurret").Dead;
Tank = b;
}

Как мне найти и башню, и корпус на всех клиентах и сервере, а затем удочерить их друг другу?
Пытался таким способом, но выдает ошибку, говорит, что Network.Instantiate должен опираться на префаб:
Код

function Spawn () {
var b : Transform;
b = Instantiate (Body, SpawnPoints[RN].transform.position, SpawnPoints[RN].transform.rotation);
var t : Transform;
t = Instantiate (Turret, SpawnPoints[RN].transform.position + SpawnPoints[RN].transform.TransformDirection(Tr.TurretPosition) ,
t.parent = b;
Tank = Network.Instantiate (b.gameObject, SpawnPoints[RN].transform.position, SpawnPoints[RN].transform.rotation, 0);
}


Сообщение отредактировал VolkOrievith - Пт, 18 Дек 2015, 14:58
 
СообщениеПосмотрел видеоуроки Networking, маленько понял суть.
Делаю мультиплеер для своего танковского проекта.
Танк при спауне собирается из башни и корпуса. При этом башня удочеряется корпусу.
Когда один игрок спаунит танк, у другого башня не удочеряется корпусу.
Спаун происходит в RPC функции через так:
Код

корпус = Network.Instantiate ...
башня = Network.Instantiate ...
башня.родитель = корпус.

У того игрока, который спаунит танк, всё хорошо. У другого игрока башня не удочеряется, и поэтому моргает (то (0, 1.2, -0.4) по локальной, то то же по глобальной)
Скрипт синхронизации такой:
Код
var LastPosition : Vector3;
var LastRotation : Quaternion;

function Start (){
if (!networkView.isMine){
this.enabled = false;
}
}

function Update () {
if ( Vector3.Distance ( transform.position, LastPosition) > 0.05 || Quaternion.Angle ( transform.rotation, LastRotation) > 0.5){
LastPosition = transform.position;
LastRotation = transform.rotation;
networkView.RPC ("SetTransform", RPCMode.OthersBuffered, LastPosition, LastRotation);
}
}
@RPC
function SetTransform ( position : Vector3, rotation : Quaternion){
transform.localPosition = position;
transform.localRotation = rotation;
}


Может в этом скрипте как-то можно написать, чтобы он синхронизировал своего родителя с остальными игроками?

пи-си:
может написал я коряво, но надеюсь, понятно.

Добавлено (17 Дек 2015, 18:10)
---------------------------------------------
Маленько перефразирую:
Имея два объекта с networkView, инстанциированых клиентом, можно ли на сервере удочерить один другому?

Добавлено (18 Дек 2015, 14:58)
---------------------------------------------
Ну же, ребят, нужна помощь!
Вот еще доп. инфа, функция спауна танка:
Код
function Spawn () {
var b : Transform;
b = Network.Instantiate (Body, SpawnPoints[RN].transform.position, SpawnPoints[RN].transform.rotation, 0);
ReSpawnTimer = ReSpawnDaley;
var t : Transform;
var Tr = b.GetComponent("Tracks");
t = Network.Instantiate (Turret, SpawnPoints[RN].transform.position + SpawnPoints[RN].transform.TransformDirection(Tr.TurretPosition) , SpawnPoints[RN].transform.rotation, 0);
gameObject.GetComponentInChildren( SmoothFollow ).target = t.transform;
gameObject.GetComponentInChildren( SmoothFollow ).Team = b.GetComponent("Health");
t.parent = b;
b.GetComponent("Health").Team = Team;
for (var DHit : Damage in t.GetComponentsInChildren(Damage))
DHit.GetComponentInChildren(Damage).MyHealth = b.GetComponent("Health");
b.GetComponent("Health").Turret = t.transform;

b.GetComponent("Health").PlayerTurret = t.GetComponent("PlayerTurret");
b.GetComponent("Health").DeadTurret = t.GetComponent("PlayerTurret").Dead;
Tank = b;
}

Как мне найти и башню, и корпус на всех клиентах и сервере, а затем удочерить их друг другу?
Пытался таким способом, но выдает ошибку, говорит, что Network.Instantiate должен опираться на префаб:
Код

function Spawn () {
var b : Transform;
b = Instantiate (Body, SpawnPoints[RN].transform.position, SpawnPoints[RN].transform.rotation);
var t : Transform;
t = Instantiate (Turret, SpawnPoints[RN].transform.position + SpawnPoints[RN].transform.TransformDirection(Tr.TurretPosition) ,
t.parent = b;
Tank = Network.Instantiate (b.gameObject, SpawnPoints[RN].transform.position, SpawnPoints[RN].transform.rotation, 0);
}

Автор - VolkOrievith
Дата добавления - 18 Дек 2015 в 14:58
Форум Игроделов » UNITY3D » СКРИПТИНГ » Проблемы с синхронизацией позиции башни танка. (сервер - клиент)
  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Game Creating CommUnity © 2009 - 2024