Unity2D, не могу синхронизировать спрайт на всех клиентах (мультиплеер)

Я пытаюсь узнать о Unet, но у меня возникают проблемы с его освоением, несмотря на то, что я следую нескольким руководствам.

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

Здесь показана проблема

В моем префабе плеера есть: визуализатор спрайтов, hardbody2D, сетевая идентификация (настроенная на локальный авторитет игрока) и сетевое преобразование.

Это код, прикрепленный к каждому игроку:

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;

    }
}

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

Редактировать: Моя игра настроена таким образом, что один из игроков является и хостом, и клиентом, я не знаю, усложняет ли это задачу, но именно так Unity делает это при локальной игре.


person Fross    schedule 19.02.2017    source источник
comment
Хороший совет — поместить код клиента и сервера в совершенно разные файлы. Вы часто видите пример кода, втиснутого в один и тот же файл. На самом деле для новичков проще и логичнее использовать два отдельных файла.   -  person Fattie    schedule 19.02.2017
comment
Спасибо, но попытка ответить на мой вопрос была бы более полезной;)   -  person Fross    schedule 19.02.2017
comment
fross - достаточно честно, но меня это просто не беспокоило. а я знал, что ты разберешься :)   -  person Fattie    schedule 19.02.2017


Ответы (1)


Я понял это после прочтения первых 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));
        }
    }

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

person Fross    schedule 19.02.2017