团结功能不在客户端工作

时间:2017-12-06 15:41:48

标签: c# unity3d multiplayer unity3d-unet

我正在尝试建立一个像多人游戏一样的生存游戏中的建筑系统。这是代码:

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

    }


}

这是以这种方式工作:玩家在菜单中选择一个对象,就像变量&#34; SelectedObeject&#34;更改为所选对象。选择对象后,预览将开始,如果玩家单击鼠标左键,预览将结束,对象将被&#34;创建&#34;。

主机可以构建没有问题。但客户端没有调用函数&#34; Cmd_Creation()&#34;。

1 个答案:

答案 0 :(得分: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
}