我正在尝试建立一个像多人游戏一样的生存游戏中的建筑系统。这是代码:
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;。
答案 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
}