5

タイトルが示すように、クライアントから送信されたコマンドがトリガーされないという問題があります。

私が機能させようとしている基本的な機能は、敵がプレイヤーの前にいてクリックすると、そのプレイヤーが一瞬気絶することです。私がホストの場合は問題なく動作し、両側が完全に登録されます。

クライアントとしてプレイしている場合、コマンドを「送信する必要がある」ところまで到達しますが、「非ローカル プレイヤーにコマンドを送信しようとしています」という警告が表示されることに気付きました。同様に、どちらの側でも何も起こりません。明らかに、私はクライアント側で何か間違ったことをしているに違いありませんが、これについて他にどのような方法があるのか​​ わかりません。

「問題」コード。

            if (Input.GetButtonDown("Fire1")) {
            Ray ray = new Ray(transform.position, transform.forward);
            RaycastHit hit = new RaycastHit();
            Physics.Raycast(ray, out hit, 20f);
            if (hit.transform != null) {
                if (hit.rigidbody != null) {
                    PlayerController controller = hit.rigidbody.GetComponent<PlayerController>();
                    if (controller != null) {
                        if (!controller.stunned) {
                            // Send the stun command to the server
                            controller.CmdStun();
                        }
                    }
                }
            }
        }

メソッド呼び出し

[Command]
public void CmdStun() {
    // Report that the stun was sent
    UnityEngine.Debug.Log("Stun Sent");
    RpcStun();
}

[ClientRpc]
public void RpcStun() {
    // Activate the stun timer.
    stunTimer.Start();
    // Track the players original color.
    normalColor = manager.color;
    // Make the players bot look like its shut down.
    manager.InitiateColorChange(Color.black);
    // Other code will check against this before trying to send another stun command.
    stunned = true;
}

編集: リクエストに応じて、2 つのスクリプト全体をここに示します。

http://pastebin.com/mr4A9ZgH

http://pastebin.com/Qg0AjCCD

Unity でのプレーヤー構成:

https://gyazo.com/400c5b3a95c1a58f9b6e930b0c3c853b

https://gyazo.com/c17a7317767a00e2150ff34b03a03e8f

https://gyazo.com/322731aefbe69f9567d2b395523b8f2a

完全な警告メッセージ

ローカル以外のプレーヤーにコマンドを送信しようとしています。UnityEngine.Networking.NetworkBehaviour:SendCommandInternal(NetworkWriter, Int32, String) PlayerController:CallCmdStun() ObjectInteractor:Update() (Assets/Scripts/ObjectInteractor.cs:58)

4

4 に答える 4

1

gameobjectスポーン時にコマンドを呼び出しているnetworkserverか、オブジェクトが既にシーンに存在していると思います。とにかく、オブジェクトは でplayerprefab割り当てるものではありませんNetworkManager's SpawnInfo

したがって、それらのオブジェクトの場合、'Trying to send command for non-local player'. を呼び出すことができるようにするNetworkIdentity必要があります。また、「権限」を与えるには、使用する必要があります 'Authority'[Command]

NetworkIdentity.AssignClientAuthority(connectionToClient).

そして、実際NetworkIdentity.AssignClientAuthorityにはサーバー上でのみ呼び出すことができます。[Command]に別のものが必要'Player'です'AssignClientAuthority'

詳細はこちら:</p>

Unity UNET - プレーヤー オブジェクトの外部で [Command] を呼び出す

(私は中国人なので、私のことをはっきりと表現していないかもしれませんが、ご理解いただければ幸いです。)

于 2016-06-02T05:07:56.803 に答える
0

プレーヤー プレハブに NetworkIdentity コンポーネントがあり、Local Player Authority がオンになっていることを確認してください。次に、問題のコードの上に、次を追加して、ローカル プレーヤーの場合にのみ実行します。

if (!isLocalPlayer)
    return;

編集:リモートでテストしている場合は、Unity のプレーヤー設定 ([編集] -> [プロジェクト設定] -> [プレーヤー]) の [Cloud Project Id] フィールドに ( https://multiplayer.unity3d.comでプロジェクトを登録してから) UPID を必ず含めてください。クライアント。localhost を使用している場合でも、リモート クライアントは Unity のリレー サーバーを使用してホスト ゲームに接続します。

編集 2:への呼び出しをcontroller.CmdStun()に変更してみてくださいcontroller.Stun()。次に、プライベート関数を呼び出すPlayerControllerパブリック関数を追加します。Stun()CmdStun()

于 2015-09-03T20:19:20.317 に答える