在所有客户端网络中同步bool

时间:2017-11-09 21:53:13

标签: c# unity3d

我正在尝试开发多人游戏。 我声明了一个必须由服务器同步的bool变量。 这是我的代码:

    public GameObject blueBar, redBar;
public GameObject barH, barV;
[SyncVar] public bool localTurn;



void Start ()
{
    localTurn = true;

    if (!isLocalPlayer)
    {
        Cmdbars();
    }

}

void Update ()
{
        OnClick();       
}


[Command]
void Cmdbars()
{


    GameObject bar1 = Instantiate(barH, GameObject.Find("pos1").GetComponent<Transform>().transform.position, Quaternion.identity) as GameObject;
    NetworkServer.Spawn(bar1);


}


private void OnClick()
{
    if (Input.GetMouseButtonDown(0))
    {
        Vector2 origin = new Vector2(
      Camera.main.ScreenToWorldPoint(Input.mousePosition).x,
      Camera.main.ScreenToWorldPoint(Input.mousePosition).y);

        CmdOnClick(origin.x, origin.y);
    }


}

[Command(channel = 0)]
private void CmdOnClick(float x, float y)
{
    RpcClick(x, y);
}


[ClientRpc(channel = 0)]
private void RpcClick(float x, float y)
{



    Vector2 origin = new Vector2(x, y);
    RaycastHit2D hit = Physics2D.Raycast(origin, Vector2.zero, 0f);

    if (hit && hit.transform.gameObject.tag.Equals("Untagged") && localTurn)
    {
        hit.transform.gameObject.GetComponent<SpriteRenderer>().sprite = blueBar.GetComponent<SpriteRenderer>().sprite;
        hit.transform.gameObject.tag = "ok";
        CmdclientPlaying();
    }


    if (hit && hit.transform.gameObject.tag.Equals("Untagged") && !localTurn)
    {
        hit.transform.gameObject.GetComponent<SpriteRenderer>().sprite = redBar.GetComponent<SpriteRenderer>().sprite;
        hit.transform.gameObject.tag = "ok";
        CmdlocalPlaying();
    }
}

这是更改bool的命令

[Command]
void CmdlocalPlaying()
{
        localTurn = true;
}

[Command]
void CmdclientPlaying()
{
    localTurn = false;
}

一切顺利,除了bool localTurn在本地更改,而不是在所有客户端。 点击对象后,必须改变铃声才能在玩家之间交替播放。

2 个答案:

答案 0 :(得分:0)

尝试更改此if if block to include else if

if (hit && hit.transform.gameObject.tag.Equals("Untagged") && localTurn)
{
    hit.transform.gameObject.GetComponent<SpriteRenderer>().sprite = blueBar.GetComponent<SpriteRenderer>().sprite;
    hit.transform.gameObject.tag = "ok";
    CmdclientPlaying();
}
else if (hit && hit.transform.gameObject.tag.Equals("Untagged") && !localTurn)
{
    hit.transform.gameObject.GetComponent<SpriteRenderer>().sprite = redBar.GetComponent<SpriteRenderer>().sprite;
    hit.transform.gameObject.tag = "ok";
    CmdlocalPlaying();
}

当CmdclientPlaying();被调用它使localTurn为false,这将触发下一个if语句并调用CmdlocalPlaying()

答案 1 :(得分:0)

我改变了代码。我调用函数来改变Rpcclick()之外的bool 它起作用了。 但我现在不知道为什么它以前不起作用。