Синхронизировать флип рендерера Sprite с Unet

Я очень новичок в Unity. Я работаю над простой многопользовательской игрой.

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

Ниже приведен код, который я попробовал.

[SerializeField] 
private SpriteRenderer spriteRenderer;

[Command]
void CmdProvideFlipStateToServer(bool state)
{
    spriteRenderer.flipX = state;
}

[ClientRpc]
void RpcSendFlipState(bool state)
{
    CmdProvideFlipStateToServer(state);
}

private void Flip()
{
    facingRight = !facingRight;
    if(isClient){
        spriteRenderer.flipX = !facingRight;
    }
    if(isLocalPlayer){
        RpcSendFlipState(spriteRenderer.flipX);
    }
}

1 ответ

Решение

Я предполагаю, что вы хотите это:

В любой момент функция Flip() вызывается на Клиента.

=> его локальный Sprite изменен, и вы хотите синхронизировать это через сервер с другими клиентами.


Если это тот случай, когда вы используете Command а также ClientRpc неправильный путь:

  • Command: вызывается на клиенте, но выполняется только на сервере
  • ClientRpc: вызывается на сервере, но выполняется только на (ВСЕХ) клиентах

=> Ваш скрипт должен выглядеть как-то так

[SerializeField] 
private SpriteRenderer spriteRenderer;

// invoked by clients but executed on the server only
[Command]
void CmdProvideFlipStateToServer(bool state)
{
    // make the change local on the server
    spriteRenderer.flipX = state;

    // forward the change also to all clients
    RpcSendFlipState(state)
}

// invoked by the server only but executed on ALL clients
[ClientRpc]
void RpcSendFlipState(bool state)
{
    // skip this function on the LocalPlayer 
    // because he is the one who originally invoked this
    if(isLocalPlayer) return;

    //make the change local on all clients
    spriteRenderer.flipX = state;
}

// Client makes sure this function is only executed on clients
// If called on the server it will throw an warning
// https://docs.unity3d.com/ScriptReference/Networking.ClientAttribute.html
[Client]
private void Flip()
{
    //Only go on for the LocalPlayer
    if(!isLocalPlayer) return;

    // make the change local on this client
    facingRight = !facingRight;
    spriteRenderer.flipX = !facingRight;

    // invoke the change on the Server as you already named the function
    CmdProvideFlipStateToServer(spriteRenderer.flipX);
}
Другие вопросы по тегам