2017-12-06 23 views
-3

私はマルチプレイヤーで動作するサバイバルゲームのような構築システムを作ろうとしています。クライアントでユニティfuctionが動作しない

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

public class CreationSystem : NetworkBehaviour { 

public static GameObject SelectedObeject; 

bool Preview; 
GameObject X; 
Material normal; 

[SerializeField] 
Material previewMaterial; 

void Update(){ 
    Cmd_Creation(); 
} 

[Command] 
void Cmd_Creation() { 


    if(Preview == false && MainMenu.GoPreview && SelectedObeject != null){ 

     RaycastHit rh; 
     if(Physics.Raycast(transform.GetChild(0).position,transform.GetChild(0).forward,out rh,60)){ 

      X = (GameObject)Instantiate (SelectedObeject, rh.point, SelectedObeject.transform.rotation); 
      normal = X.GetComponent<Renderer>().material; 
      X.GetComponent<Renderer>().material = previewMaterial; 
      X.GetComponent<Collider>().enabled = false; 

      if(X.transform.childCount > 0){ 
       for(int i=0; i<X.transform.childCount;i++){ 
        X.transform.GetChild(i).GetComponent<Renderer>().material = previewMaterial; 
        X.transform.GetChild(i).GetComponent<Collider>().enabled = false; 
       } 
      } 

      NetworkServer.Spawn (X); 
      Preview = true; 
     } 


    } 

    if(Preview){ 
     RaycastHit rh; 

     if(Physics.Raycast(transform.GetChild(0).position,transform.GetChild(0).forward,out rh,60)){ 
      X.transform.position = rh.point; 
     } 

     if(Input.GetKeyDown(KeyCode.Mouse0)){ 
      MainMenu.GoPreview = false; 
      X.GetComponent<Renderer>().material = normal; 
      X.GetComponent<Collider>().enabled = true; 

      Preview = false; 

      if(X.transform.childCount > 0){ 
       for(int i=0; i<X.transform.childCount;i++){ 
        X.transform.GetChild(i).GetComponent<Renderer>().material = normal; 
        X.transform.GetChild(i).GetComponent<Collider>().enabled = true; 
       } 
      } 
     } 

    } 


} 

それはこのように動作するようにした:ここでは、コードであるプレイヤーは、メニュー内のオブジェクト、変数「SelectedObeject」は、選択したオブジェクトに変更された方法を選択します。オブジェクトを選択すると、プレビューが開始され、プレーヤーが左マウスボタンをクリックすると、プレビューが終了し、オブジェクトが「作成済み」になります。

ホストは問題なく構築できます。しかし、クライアントは関数 "Cmd_Creation()"を呼び出していません。

答えて

0

コマンドはクライアントで呼び出されますが、サーバー上で実行されます。以前のコマンドのために何が起きたとしても、サーバーがクライアントと通信する必要がある場合は、リモートプロシージャコールまたはRPCを使用できます。

// invoked on client but executed on server 
[Command] 
private void CmdMakeServerSayHelloToClient() 
{ 
    RpcSayHelloToClient(); // invoked on server but executed on client 
} 

[ClientRpc] 
private void RpcSayHelloToClient() 
{ 
    Debug.Log("Hello from server."); // logged on client but not on server 
} 
関連する問題