2

簡単なデモを作成したい。平面の真ん中に、クリックすると色が変わる立方体が欲しいです。(これは簡単に実装できました) キューブを交互にクリックする 2 人のプレイヤーが必要です。自分の番になるとキューブの色が変わります。キューブの色が変わると、両方のプレイヤーの画面に変更が反映されます。私は UNET の例、http://forum.unity3d.com/threads/unet-sample-projects.331978/ を見てきましたがそれらのほとんどには、キーボードで制御するネットワーク化されたキャラクターがあり、この側面があります。私を捨てています。プレイヤーを 2 つ作成する必要がありますが、非表示にして制御スクリプトを持たないようにするだけですか? ブロックをプレハブにする必要がありますか? 私のブロックのスクリプトは次のとおりです。

void Update()
{
      if (Input.GetKeyDown(KeyCode.Space))  
      {
          // Command function is called from the client, but invoked on the server
           CmdChangeColor();
       }
 }

[Command]
void CmdChangeColor()
{
      if (cubeColor == Color.green) cubeColor = Color.magenta;
      else if (cubeColor == Color.magenta) cubeColor = Color.blue;
      else if (cubeColor == Color.blue) cubeColor = Color.yellow;
      else if (cubeColor == Color.yellow) cubeColor = Color.red;
      else cubeColor = Color.green;

      GetComponent<Renderer>().material.color = cubeColor;
 }

また、私のブロックは現在プレハブではないことに注意してください。Network Identity コンポーネントと、ネットワーク トランスフォーム -> Sync トランスフォームを有効にしました。サーバー ホストを起動すると、ブロックの色を変更できますが、クライアントはこれらの変更を表示できません。クライアントがブロックをクリックしても、次のエラー メッセージ以外は何も起こりません:権限のないオブジェクトにコマンドを送信しようとしています。

どんな助けでも大歓迎です!ありがとう http://docs.unity3d.com/Manual/UNetSetup.html

4

1 に答える 1

2

このStackOverflow postのおかげで、ようやくこれを機能させることができました。

これが私のスクリプトです。ネットワーク経由で同期したい非ゲーム オブジェクトではなく、プレイヤー オブジェクトにアタッチしました。

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public class OnTouchEvent : NetworkBehaviour
{
    //this will get called when you click on the gameObject
    [SyncVar]
    public Color cubeColor;
    [SyncVar]
    private GameObject objectID;
    private NetworkIdentity objNetId;


    void Update()
    {
        if (isLocalPlayer)
        {
            CheckIfClicked();
        }
    }

    void CheckIfClicked()
    {
        if (isLocalPlayer && Input.GetMouseButtonDown(0))
        {
            objectID = GameObject.FindGameObjectsWithTag("Tower")[0];                         //get the tower                                   
            cubeColor = new Color(Random.value, Random.value, Random.value, Random.value);    // I select the color here before doing anything else
            CmdChangeColor(objectID, cubeColor);
        }
    }



    [Command]
    void CmdChangeColor(GameObject go, Color c)
    {
        objNetId = go.GetComponent<NetworkIdentity>();        // get the object's network ID
        objNetId.AssignClientAuthority(connectionToClient);    // assign authority to the player who is changing the color
        RpcUpdateCube(go, c);
        // use a Client RPC function to "paint" the object on all clients
        objNetId.RemoveClientAuthority(connectionToClient);    // remove the authority from the player who changed the color
    }

    [ClientRpc]
    void RpcUpdateCube(GameObject go, Color c)
    {
        go.GetComponent<Renderer>().material.color = c;
    }

}
于 2015-12-12T06:14:28.377 に答える