客户端不会从服务器生成游戏对象,反之亦然

问题描述 投票:0回答:1

所以,我正在努力与整个Unet系统。现在,我想做的就是从一端到另一端产生对象。但即使这样也行不通。它在每个服务器和客户端上生成对象。但不同步。我搜索了很多地方并观看了很多视频 - 没有人帮忙。这是代码和检查员的详细信息

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class NetworkController : NetworkBehaviour
{
    public GameObject[] Spawns;
    GameObject Canvas;
    GameObject spawn;
    [SyncVar]
    public NetworkInstanceId ParentId;
    // Use this for initialization
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {

    }

    [Command]
    public void CmdspawnPrefab()
    {
        Transform trns = GameObject.Find("Canvas").transform;
        trns.position = trns.position + new Vector3(100, 200, 0);
        GameObject go = Instantiate(Spawns[0], trns);
        NetworkServer.Spawn(go);
    }
}

enter image description here

我错过了什么?

c# visual-studio unity3d unity3d-unet
1个回答
0
投票

看起来,我的整个工作流程都不正确。解决方案首先是将监听器连接到按钮,而不是使用检查器上的onclick功能 -

        Button b = BoardController.Buttons[0].GetComponent<Button>();
        b.onClick.AddListener(delegate () { Cmd_ButtonPressed(1); });

第二个是创建游戏对象,包含控制你的棋盘的脚本“GameManager”,以及一个包含Rpc功能的“RpcManager”。然后在playerobject脚本中,使用命令。

这里是我用过的类,更新图像而不是产生一个对象,这个想法基本相同 - 低于Unet的基础和传递命令。

public class PlayerObject : NetworkBehaviour {

public BoardManager BoardController;
public ClientRPCmanager ClientRPCManager;
// Use this for initialization
void Start () {
    ClientRPCManager = GameObject.FindGameObjectWithTag("ClientRPCmanager").GetComponent<ClientRPCmanager>();
    BoardController = ClientRPCManager.BoardController;
    Button b = BoardController.Buttons[0].GetComponent<Button>();
        b.onClick.AddListener(delegate () { Cmd_ButtonPressed(1); });
}
// Update is called once per frame
void Update () {

}

public void SetButton(int i)
{
    BoardController.SetButton(i);
}
[Command]
public void Cmd_ButtonPressed(int i)
{
    ClientRPCManager.Rpc_ButtonPressed(i);
}

boardmanager

public class BoardManager : NetworkBehaviour
{

// Use this for initialization
void Start()
{

}
// Update is called once per frame
void Update()
{

}

public GameObject[] Buttons;
public Sprite[] Sprites;
public void SetButton(int index)
{
    GameObject img = GameObject.Find("X");
    img.GetComponent<Image>().sprite = Sprites[0];
}

RpcManager

public class ClientRPCmanager : NetworkBehaviour {

public BoardManager BoardController;
public NetworkManager Manager;
// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

}

[ClientRpc]
public void Rpc_ButtonPressed(int index)
{
    BoardController.SetButton(index);
}

希望,这将有助于人们了解Unet。我通过仔细查看这个项目https://www.youtube.com/watch?v=8Kd2RAfgzW0了解到了这一点

© www.soinside.com 2019 - 2024. All rights reserved.