2015-12-18 7 views
2

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

код в главном игрока сценария:

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; 
    } 
} 

Edit:

игрока

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; 
} 
+0

Не используйте GetComponent. Когда вы инициализируете объект (например, в Start() или Awake(), используйте getcomponent там и сохраняйте его как локальную переменную. Получение преобразования каждый раз бессмысленно. Кроме того, вы можете использовать this.transform. –

+0

Является ли ' Player_SyncPosition' второй кодовый блок – user3071284

+0

Выполнено, но это оптимизация, правда? Не исправлена ​​моя проблема. @ user3071284 Да, это –

ответ

2

я испытал целый ряд различных проблем (перемещение назад и т.д.), и это работает:

игрока:

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; 
     } 
    }