Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 与UNET客户的授权_Unity3d_Unity3d Unet - Fatal编程技术网

Unity3d 与UNET客户的授权

Unity3d 与UNET客户的授权,unity3d,unity3d-unet,Unity3d,Unity3d Unet,我需要修改一个非玩家对象。我能够做到,但出于某些原因,我得到警告: Trying to send command for object without authority. UnityEngine.Networking.NetworkBehaviour:SendCommandInternal(NetworkWriter, Int32, String) ModelControl:CallCmdSetCube() ModelControl:Update() (at Assets/Scripts/Mo

我需要修改一个非玩家对象。我能够做到,但出于某些原因,我得到警告:

Trying to send command for object without authority.
UnityEngine.Networking.NetworkBehaviour:SendCommandInternal(NetworkWriter, Int32, String)
ModelControl:CallCmdSetCube()
ModelControl:Update() (at Assets/Scripts/ModelControl.cs:21)
我已经阅读了unity文档和各种答案,但奇怪的是它确实有效,但我希望避免出现警告

首先,有一个管理器对象,用于创建中性对象。这在主机上发生

public class ObjectControl : NetworkBehaviour
{
    public GameObject cube;
    public override void OnStartServer()
    {
        if (GameObject.Find("Cube") != null) { return; }
        GameObject cubeInstance = (GameObject)Instantiate(this.cube,
            new Vector3(0f, 0f, 5f), Quaternion.identity);
        cubeInstance.name = "Cube";
        NetworkServer.Spawn(cubeInstance);
    }
}
那么每个玩家都有以下内容:

private void CmdSetCube()
{
    GameObject cube = GameObject.Find("Cube"); // This is the neutral object
    if (cube != null)
    {
        NetworkIdentity ni =cube.GetComponent<NetworkIdentity>();
        ni.AssignClientAuthority(connectionToClient);
        RpcPaint(cube, new Color(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f)));
        ni.RemoveClientAuthority(connectionToClient);
    }
}

[ClientRpc]
void RpcPaint(GameObject obj, Color col)
{
    obj.GetComponent<Renderer>().material.color = col; 
}
private void CmdSetCube()
{
GameObject cube=GameObject.Find(“cube”);//这是中性对象
if(多维数据集!=null)
{
NetworkIdentity ni=cube.GetComponent();
ni.指定客户权限(连接客户);
RpcPaint(立方体,新颜色(Random.Range(0f,1f),Random.Range(0f,1f),Random.Range(0f,1f));
i.撤销客户授权(连接客户);
}
}
[客户端RPC]
void RpcPaint(游戏对象对象对象,颜色列)
{
obj.GetComponent().material.color=col;
}
主机不会触发警告。只有远程客户端才会收到警告。当我有很多客户机时,我可以在编辑器控制台中看到它将打印与客户机相同的次数。
但同样,它确实有效,我可以看到新数据被传播到所有会话,但我希望稍后会出现一些问题

所以问题来自更新方法:

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        CmdSetCube();
    }
}
这里的问题是,该脚本的所有实例都将运行代码,而只有一个实例真正获得了授权

解决方案:

void Update()
{
    if (this.isLocalPlayer == false) { return; }
    if (Input.GetKeyDown(KeyCode.Space))
    {
        CmdSetCube();
    }
}
添加线路以确保这是本地玩家呼叫