2017-05-03 11 views
0

私はNetworkServer/NetworkClient間の単一ネットワークで作業しています。私はNetworkManagerを使用しませんGameObjectを転送するUnity NetworkServer/NetworkClient

ここに私のクライアントコードの一部です。

public void StartPaintClient() 
{ 
    client = new NetworkClient(); 
    client.Connect(host, port); 
    client.RegisterHandler(NetworkMeta.PaintPrefabId, OnMouseButtonDown); 
} 
public void OnMouseButtonDown(NetworkMessage netMsg) 
{ 
    var receivedPrefab = netMsg.ReadMessage<NetworkMeta.PaintPrefab>(); 
    GameObject prefab = Instantiate(receivedPrefab.p); 
    prefab.name = "" + index++; 

} 

ここは私のサーバーコードの一部です。

public GameObject prefab; 
public void StartPaintServer() 
{ 

    if (NetworkServer.active) 
    { 
     Debug.Log("Server is already acitve"); 
     return; 
    } 
    NetworkServer.Listen(port); 
} 
void Update() 
{ 
    if(Input.GetMouseButtonUp(0)) 
    { 
      prefab = Instantiate(Line_Prefab); 
      var newPrefab = new NetworkMeta.PaintPrefab(); 
      newPrefab.p = prefab; 
      NetworkServer.SendToAll(NetworkMeta.PaintPrefabId, newPrefab); 
    } 
} 

私には2つの質問があります。

  1. 私が代わりにNetworkServer.Spawn(obj)NetworkServer.SendToAll(msgType, msg)を使用する理由は何もコンソールにエラーがなかった場合でも、全く働いていませんでした。その理由は何でしょうか?
  2. 上記のコードにも問題があります。 colsoleエラーMSG

ArgumentExceptionが原因NetworkServer.SendToAll(mspType, msg)たび:あなたがインスタンス化したいオブジェクトがnullを。

なぜnewPrefab.pがnullであるのかわかりません.... ネットワークプログラミングの初心者のためのアイデアはありますか?

答えて

0

私はUnetを使用していません。それについてはあまりよく分かりませんが、プレハブを作成する前に次のことを行う必要があります。

。プレハブには、NetworkIdentityスクリプトが添付されている必要があります。

。プレハブを登録する前に登録する必要があります。

Networking.ClientScene.RegisterPrefab(Line_Prefab); 

NetworkServer.Spawnを使用できます。

var line = (GameObject)Instantiate(Line_Prefab, pos, rot); 
NetworkServer.Spawn(line); 

私はプレハブに直接NetworkServer.Spawnを使用していないだということに注意してください。私は(GameObject)Instantiate(Line_Prefab, pos, rot);で生成されたGameObjectでそれを使用しなければなりませんでした。

また、エディタから変数にプレハブを割り当てたことを確認してください。あなたはネットワーク上のオブジェクトをスポークすることについてもっと気を使うことができますhere

+0

クライアントコードとサーバーコードを区別したい場合はどうすればよいですか?そのプレハブはどこに保管されるべきですか?両側で(それは良いと思われません)? –

関連する問題