2016-12-29 183 views
0

我需要修改非玩家對象。我能夠做到這一點,但由於某種原因,我得到警告:權限與UNET客戶端

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) 

我已經通過統一的文檔和各種答案,但怪異的一部分消失的是,它的工作,但我希望阻止警告。

首先有一個管理器對象,用於創建中性對象。這發生在主機上。

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; 
} 

主機不會觸發報警。只有遠程客戶端纔會收到警告。當我有很多客戶端時,我可以在編輯器控制檯看到它將打印多少次客戶端。 但是,它確實有效,我可以看到新數據傳播到所有會話中,但我期望稍後會有某些事情停止。

回答

0

所以這個問題來自於更新方法:

void Update() 
{ 
    if (Input.GetKeyDown(KeyCode.Space)) 
    { 
     CmdSetCube(); 
    } 
} 

這裏在於該腳本的所有實例將運行代碼,而只有一個是真正獲得權威的問題。

解決方案:

void Update() 
{ 
    if (this.isLocalPlayer == false) { return; } 
    if (Input.GetKeyDown(KeyCode.Space)) 
    { 
     CmdSetCube(); 
    } 
} 

添加行,以確保這是本地球員調用。