我目前正在制作一个测试程序,可以在单击按钮后向上移动播放器。
我正在使用命令和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;
}
}
答案 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!;
}
}