Синхронизируйте флип рендерера спрайтов с 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);
    }
}

person Prem sahni    schedule 11.02.2018    source источник
comment
Из вашего сценария я не могу понять, что вы пытаетесь заархивировать...?   -  person derHugo    schedule 12.02.2018
comment
при нажатии клавиш со стрелками влево и вправо я переключаю средства визуализации спрайтов flipX, и этот переключатель я хочу синхронизировать   -  person Prem sahni    schedule 12.02.2018


Ответы (1)


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

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

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


Если это так, вы используете 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);
}
person derHugo    schedule 12.02.2018
comment
Спасибо за ваш ответ я проверю. - person Prem sahni; 12.02.2018