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