我正在尝试开发多人游戏。 我声明了一个必须由服务器同步的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在本地更改,而不是在所有客户端。 点击对象后,必须改变铃声才能在玩家之间交替播放。
答案 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)