0

ノンプレイヤー オブジェクトを変更する必要があります。私はそれを行うことができますが、いくつかの理由で警告が表示されます:

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)

私はユニティドキュメントとさまざまな回答を調べましたが、奇妙な部分はそれが機能することですが、警告を防ぎたいです。

まず、ニュートラル オブジェクトを作成する Manager オブジェクトがあります。これはホストで発生します。

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

ホストは警告をトリガーしません。リモート クライアントのみが警告を受け取ります。多くのクライアントがある場合、エディター コンソールで、クライアントの数だけ印刷されることがわかります。しかし、繰り返しになりますが、実際には機能します。新しいデータがすべてのセッションに伝播されていることがわかりますが、後で何かがダウンすることを期待しています.

4

1 に答える 1

0

したがって、問題は Update メソッドから発生しました。

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

ここでの問題は、そのスクリプトのすべてのインスタンスがコードを実行する一方で、実際に権限を取得しているのは 1 つだけであるということです。

解決:

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

この行を追加して、これがローカル プレーヤーの呼び出しであることを確認します。

于 2016-12-30T09:58:39.473 に答える