【问题标题】:Unity2D, can't sync my sprite across all clients (multiplayer)Unity2D,无法在所有客户端(多人游戏)中同步我的精灵
【发布时间】:2017-02-19 11:54:07
【问题描述】:

我正在尝试了解 Unet,但我无法掌握它的窍门,尽管遵循了一些教程。

我正在制作一个 2d 游戏,而我目前的困扰是更新我的角色精灵的转动方式(向左或向右)。

我的玩家预制件有:Sprite 渲染器、rigidbody2D、网络身份(设置为本地玩家权限)和网络转换。

这是附加到每个播放器的代码:

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 在本地玩时的方式。

【问题讨论】:

  • 一个很好的建议是将您的客户端和服务器代码放入完全不同的文件。您经常会看到示例代码被硬塞在同一个文件中。如果你只使用两个单独的文件,对于初学者来说实际上更容易也更合乎逻辑。
  • 谢谢,但尝试回答我的问题会更有帮助;)
  • fross - 很公平,但我就是懒得理会。我知道你会想出来的:)

标签: c# unity3d multiplayer unity3d-2dtools unity3d-unet


【解决方案1】:

我在 google 上阅读了前 5 页后发现了这一点,这是我的最终代码,以防遇到同样问题的其他人在这里绊倒:

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

您显然必须在本地和服务器上调用该函数!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 2015-12-16
    • 1970-01-01
    相关资源
    最近更新 更多