命令调用未执行

时间:2018-11-26 05:52:20

标签: unity3d networking multiplayer

我目前正在制作一个测试程序,可以在单击按钮后向上移动播放器。

我正在使用命令和RPC来完成此任务。当我单击主机上的按钮时,主机播放器会向上移动,但是当我单击客户端上的按钮时,主机播放器不会向上移动。我不知道为什么。我收到一个错误消息,说我是

  

试图未经授权就发送对象命令。

但是玩家应该已经拥有权限吗?!播放器预制件具有经过身份验证的本地播放器网络身份。

奇怪的是,我的代码可以完美地产生每个玩家的名字,而至少不能改变客户端位置的代码。

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

public class TestPlayerController : NetworkBehaviour 
{

    void Start() 
    {
        if (!isServer)
        {
            CmdChangeName("Player 2");
        }
        else if (isServer) 
        {
            CmdChangeName("Player 1");
        }
    }

    void Update() 
    {
        if (TestCubeScript.button1Press == true) 
        {
            if (!isServer) 
            {
                CmdMoveCube(new Vector2(transform.position.x, transform.position.y + 1));
                TestCubeScript.button1Press = false;
            }
            else 
            {
                RpcUpdateCube(new Vector2(transform.position.x, transform.position.y + 1));
                TestCubeScript.button1Press = false;
            }
        }
    }

    [Command]
    void CmdMoveCube(Vector2 pos)
    {
        RpcUpdateCube(pos);
    }

    [ClientRpc]
    void RpcUpdateCube(Vector2 pos)
    {
        transform.position = pos;
    }

    [Command]
    void CmdChangeName(string name) 
    {
        RpcUpdateName(name);
    }

    [ClientRpc]
    void RpcUpdateName(string name) 
    {
        transform.name = name;
    }
}

1 个答案:

答案 0 :(得分:0)

关于CMD和RPC的工作方式,该方案应类似于:

private void Foo()
{
  if(isServer)
  {
    RpcFoo();
  }
  else
  {
    if(!hasAuthority)
    {
      setLocalAuthority(); //You should code this behaviour depending of the object
    }
    else
    {
      CmdFoo();
    }
  }
}

[ClientRpc]
private void RpcFoo()
{
  //Do your stuff
}

[Command]
private void CmdFoo()
{
  RpcFoo();
}

所以您的错误可能出在开始位置,其中:

void Start() 
{
  if (!isServer)
  {
      CmdChangeName("Player 2");
  }
  else if (isServer) 
  {
      CmdChangeName("Player 1");
  }
}

应为:

void Start() 
{
  if (!isServer)
  {
      CmdChangeName("Player 2");
  }
  else if (isServer) 
  {
      RpcChangeName("Player 1") //--> The change!;
  }
}