Цель: объект может взаимодействовать с обоими игроками, его положение и вращение синхронизируются (LAN).
Настройка сцены: простая сцена, похожая на пример понга в зеркале, когда оба игрока порождаются, создается куб, с которым оба игрока могут взаимодействовать с синхронизацией.
Тестовый куб - зарегистрирован как префаб с возможностью создания в диспетчере сети с идентификатором сети / преобразованием сети и порожден, когда оба игрока присоединяются, и простой сценарий вращения, который перемещает его при нажатии z или x,
public Transform LeftPlayerSpawn;
public Transform RightPlayertSpawn;
GameObject Testcube;
public override void OnServerAddPlayer(NetworkConnection conn)
{
Transform start = numPlayers == 0 ? LeftPlayerSpawn : RightPlayertSpawn;
GameObject player = Instantiate(playerPrefab, start.position, start.rotation);
NetworkServer.AddPlayerForConnection(conn, player);
if (numPlayers == 2)
{
Testcube = Instantiate(spawnPrefabs.Find(prefab => prefab.name == "TestCube"));
NetworkServer.Spawn(Testcube);
}
}
Проблема: любое изменение, сделанное на сервере, отражается на клиентах, и локальный игрок контролирует объект, но не синхронизируется с другим клиентом. Видео без синхронизации
Вопрос: Какова цель полномочий bool-client в компоненте Networktransform, должен ли он автоматически синхронизировать это конкретное преобразование, когда клиент с полномочиями перемещает его, или он позволяет пользователю синхронизировать вручную через скрипты?
Из документов зеркала - по умолчанию Network Transform является авторитетным сервером, если вы не установите флажок для Client Authority. Полномочия клиента применяются к объектам игроков, а также к объектам, не относящимся к игрокам, которые были специально назначены клиенту, но только для этого компонента. Если этот параметр включен, изменения позиции отправляются от клиента на сервер.
Также пытался обновить положение и вращение через [Command] / [CientRpc] через скрипт SyncPosRot, прикрепленный к тестовому кубу,
void Update()
{
if (isLocalPlayer)
{
CmdSyncPosRot(transform.localPosition, transform.localRotation);
}
}
[Command]
void CmdSyncPosRot(Vector3 localPosition, Quaternion localRotation)
{
RpcSyncPosRot(localPosition, localRotation);
}
[ClientRpc]
void RpcSyncPosRot(Vector3 localPosition, Quaternion localRotation)
{
if (!isLocalPlayer)
{
transform.localPosition = localPosition;
transform.localRotation = localRotation;
}
}
Пробовал и не получилось:
- Пробовал со скриптом SyncPosRot и без него,
- Испытано с полномочиями bool-client и без них в компоненте преобразования сети,
- Перемещение идентификатора сети / преобразования сети в верхнюю и нижнюю часть инспектора, поскольку это, казалось, исправляло синхронизацию для других, у которых была аналогичная проблема (не для меня),
Все вышеперечисленное после нескольких сборок и без результатов,
Если исправление представляет собой нечто простое, например создание объекта с сервера - на котором все игроки владеют, может ли кто-нибудь помочь мне?
Также, если есть более простой способ (не обязательно лучший способ / передовая практика), пожалуйста, дайте мне знать.