2017-02-19 36 views
1

Я пытаюсь узнать об Unet, но у меня возникли проблемы с этим, несмотря на следующие несколько уроков.Unity2D, не удается синхронизировать мой спрайт со всеми клиентами (многопользовательский)

Я делаю 2d-игру, и то, что я сейчас застрял, обновляет способ поворота моего персонажа спрайта (влево или вправо).

Problem shown here

Мой игрок сборного имеет: Sprite визуализатор, rigidbody2D, сетевой идентификации (набор для местной власти игрока) и сеть Transform.

Это код прилагается к каждому игроку:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using UnityEngine.Networking; 

public class CharController : NetworkBehaviour { 

    public float maxSpeed = 1f; 
    [SyncVar] 
    bool facingRight = true; 
    Animator anim; 


    // Use this for initialization 
    void Start() { 
     anim = GetComponent<Animator>(); 
    } 

    // Update is called once per frame 
    void Update() { 

    } 
    void Moving() 
    { 


      float move = Input.GetAxis("Horizontal"); 

      GetComponent<Rigidbody2D>().velocity = new Vector2(move * maxSpeed, GetComponent<Rigidbody2D>().velocity.y); 

      if(move > 0 && !facingRight) 
      { 
       RpcFlip(); 
      } 
      else if(move < 0 && facingRight) 
      { 
       RpcFlip(); 
      } 
      anim.SetFloat("MovingSpeed", Mathf.Abs(move)); 
    } 

    private void FixedUpdate() 
    { 
     if (!isLocalPlayer) 
     { 
      return; 
     } 
     // handle input here... 
     Moving(); 







    } 
    [ClientRpc] 
    void RpcFlip() 
    { 
     if (isLocalPlayer) 
     { 
      //facingRight = !facingRight; 
      //currentSprite.flipX = !currentSprite.flipX; 


     } 

     facingRight = !facingRight; 
      Vector3 theScale = transform.localScale; 
      theScale.x *= -1; 
      transform.localScale = theScale; 

    } 
} 

Я знаю, что это, скорее всего, что-то супер просто я делаю неправильно, что только добавляет больше боли, чтобы просить, но любая помощь очень ценится! Спасибо

Редактировать: Как моя игра настроена, один из игроков - это как хост, так и клиент, я не знаю, делает ли это труднее, но это именно то, как это делает единство, когда вы играете локально ,

+0

Хороший совет - поместить ваш клиентский и серверный код в * совершенно разные файлы *. Вы часто видите пример кода, в котором он находится в одном файле. Это на самом деле проще и логичнее для начинающих, если вы просто используете два отдельных файла. – Fattie

+0

Спасибо, но попытка ответа на мой вопрос была бы более полезна;) – Fross

+0

fross - достаточно честный, но я просто не мог беспокоиться. и я знал, что вы это выясните :) – Fattie

ответ

0

Я понял это после прочтения первых 5 страниц на Google, и вот мой окончательный код, в случае, если кто-то с той же проблемой, натыкается здесь:

public float maxSpeed = 1f; 
    Animator anim; 

    [SyncVar(hook = "FacingCallback")] //Everytime the bool netFacingRight is called, the method FacingCallback is called aswell. 
             //Since the bool only changes when CmdFlipSprite is called, it makes sure that CmdFlipSprite calls 
             //the change on our server, and FacingCallback calls it locally. 
    public bool netFacingRight = true; 

    // Use this for initialization 
    void Start() { 
     anim = GetComponent<Animator>(); 
    } 


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

    //////// 




    // Update is called once per frame 
    void Update() { 

     if (!isLocalPlayer) 
     { 
      return; 
     } 
     float move = Input.GetAxis("Horizontal"); 

     GetComponent<Rigidbody2D>().velocity = new Vector2(move * maxSpeed, GetComponent<Rigidbody2D>().velocity.y); 

     if ((move > 0 && !netFacingRight) || (move < 0 && netFacingRight)) 
     { 
      netFacingRight = !netFacingRight; 
      CmdFlipSprite(netFacingRight); 
      anim.SetFloat("MovingSpeed", Mathf.Abs(move)); 
     } 
    } 

Вы Aparently должны вызвать функцию так и на сервере!