Unity Networking: переворачивание спрайтов в многопользовательской игре не меняет хост

Я работаю над небольшой многопользовательской 2d-платформерной игрой. Мне удалось заставить его воспроизводить анимацию, движение и переворачивание спрайтов по сети, но у меня есть ошибка, которую я не могу понять. Код для переворачивания спрайтов отлично работает для хоста - он может видеть, как другие игроки меняют сторону при повороте влево или вправо, но все остальные не могут видеть переворачивание хоста. Также третий игрок не может видеть ход второго игрока и т. Д. Что-то не так, и было бы здорово, если бы кто-нибудь мог взглянуть на мой код.

Код в основном скрипте Player:

if (input.x > 0 && !facingRight)
     {
         FlipSprite();
         GetComponent<Player_SyncPosition>().FlipSprite();
     }
     else if (input.x < 0 && facingRight)
     {
         FlipSprite();
         GetComponent<Player_SyncPosition>().FlipSprite();
     }

Код в дополнительном скрипте Player_SyncPosition на плеере:

 [ClientCallback]
 public void FlipSprite()
 {  
     if (isLocalPlayer)
     {
         CmdFlip();
     }
 }
 [Command]
 void CmdFlip()
 {
     if (!isLocalPlayer)
     {
         print("Switching sides");
         facingRight = !facingRight;
         Vector3 SpriteScale = GetComponent<Transform>().localScale;
         SpriteScale.x *= -1;
         GetComponent<Transform>().localScale = SpriteScale;
     }
 }

Изменить:

Игрок

Player_SyncPosition pSync;
void Awake()
{
    pSync = GetComponent<Player_SyncPosition>();
}

void Update () 
{
if ((input.x > 0 && !pSync.facingRight) || (input.x < 0 && pSync.facingRight))
    {
        pSync.FlipSprite();
    }
}

Player_SyncPosition

[SyncVar(hook = "FaceDirCallback")]
public bool facingRight = true;

[ClientCallback]
public void FlipSprite()
{
    if (isLocalPlayer)
    {
        CmdFlip();
    }
}
[Command]
void CmdFlip()
{
    print("Switching sides");
    facingRight = !facingRight;
    Vector3 SpriteScale = transform.localScale;
    SpriteScale.x *= -1;
    transform.localScale = SpriteScale;
}

void FaceDirCallback(bool newValue)
{
    print(facingRight);
    print(newValue);
    facingRight = newValue;
}

person Marcin L.    schedule 18.12.2015    source источник
comment
Не используйте GetComponent. Когда вы инициализируете объект (например, в Start () или Awake (), используйте там getcomponent и сохраните его как локальную переменную. Получать преобразование каждый раз бессмысленно. Также вы можете использовать this.transform.   -  person Reinstate Monica    schedule 18.12.2015
comment
Player_SyncPosition второй блок кода?   -  person user3071284    schedule 18.12.2015
comment
Готово, но это же оптимизация? Все еще не решила мою проблему. @ user3071284 Да, это так   -  person Marcin L.    schedule 18.12.2015


Ответы (1)


У меня было множество разных проблем (движение назад и т. Д.), И это работает:

Игрок:

void Awake()
     {
         syncPos = GetComponent<Player_SyncPosition>();
     }

void Update()
 {
  if ((input.x > 0 && !facingRight) || (input.x < 0 && facingRight))
         {
             facingRight = !facingRight;
             syncPos.CmdFlipSprite(facingRight);
         }
 }

Player_SyncPosition:

 [SyncVar(hook = "FacingCallback")]
     public bool netFacingRight = true;

 [Command]
     public void CmdFlipSprite(bool facing)
     {
         netFacingRight = facing;
         if (netFacingRight)
         {
             Vector3 SpriteScale = transform.localScale;
             SpriteScale.x = 1;
             transform.localScale = SpriteScale;
         }
         else
         {
             Vector3 SpriteScale = transform.localScale;
             SpriteScale.x = -1;
             transform.localScale = SpriteScale;
         }
     }

     void FacingCallback(bool facing)
     {
         netFacingRight = facing;
         if (netFacingRight)
         {
             Vector3 SpriteScale = transform.localScale;
             SpriteScale.x = 1;
             transform.localScale = SpriteScale;
         }
         else
         {
             Vector3 SpriteScale = transform.localScale;
             SpriteScale.x = -1;
             transform.localScale = SpriteScale;
         }
     }
person Marcin L.    schedule 04.01.2016