Unity AddExplosionForce синхронизируется через Network Manager

Я работаю над небольшой 3D-игрой для 2 игроков в Unity. Концепция игры представляет собой космическую гонку, в которой вам предстоит пролетать сквозь кольца. В качестве дополнительной функции я хочу дать игроку возможность толкать другого игрока. Поэтому, когда они нажимают определенную кнопку, их космический корабль должен посылать «ударную волну», которая ударяет другого игрока и отбрасывает его немного назад. Я хотел реализовать это с помощью функций Physics.OverlapSphere и AddExplosionForce. Я проверил это в локальной дополнительной сцене без сетевой функции, и это сработало очень хорошо.

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

Должен сказать, что я уже использую Network Manager, и нормальное движение с помощью «wasd» работает у обоих игроков.

Следуя коду, который я использую (это просто стандартный пример):

Vector3 explosionPos = transform.position;
Collider[] colliders = Physics.OverlapSphere(explosionPos, radius);
foreach (Collider hit in colliders)
{
   Rigidbody rb = hit.GetComponent<Rigidbody>();

   if (rb != null)
   rb.AddExplosionForce(power, explosionPos, radius, 3.0F);
}

Кто-нибудь знает, есть ли что-то, что я должен добавить для сети?


person SeGa    schedule 30.05.2017    source источник
comment
У меня такое чувство, что эффект, которого вы пытаетесь достичь, будет очень трудным без серьезного авторитета, рассчитывающего физику. Из-за задержки в сети игрок 1 (активирующий способность) увидит игрока 2 в другом месте, чем игрок 2 видит себя. Таким образом, передача этого взрыва игроку 2 приведет к приложению другой силы. и игра рассинхронизируется, и вы получите резиновую ленту. Какой клиент правильный? Всегда ли клиент игрока 2 соответствует позиции игрока 2? Является ли игрок 1, потому что он использовал способность?   -  person Draco18s no longer trusts SE    schedule 30.05.2017


Ответы (1)


Попробуйте создать функцию [Command], которая будет запускать функцию [ClientRpc] с предоставленным вами кодом. Это должно выглядеть примерно так:

[Command]
void CmdOnExplosion(float power, Vector3 explosionPos, float radius, float upwardsMod)
{
    RpcExplode(power, explosionPos, radius, upwardsMod);
}

[ClientRpc]
void RpcExplode(float power, Vector3 explosionPos, float radius, float upwardsMod)
{
    Collider[] colliders = Physics.OverlapSphere(explosionPos, radius);

    foreach (Collider hit in colliders)
    {
        Rigidbody rb = hit.GetComponent<Rigidbody>();

        if (rb != null)
        {
            rb.AddExplosionForce(power, explosionPos, radius, 3.0F);
        }
    }
}
person Fiffe    schedule 31.05.2017