代码之家  ›  专栏  ›  技术社区  ›  Dooodoo

客户端无法从服务器获得衍生的游戏对象,反之亦然

  •  0
  • Dooodoo  · 技术社区  · 6 年前

    所以,我在和整个联合国教科文组织系统斗争。现在,我要做的就是从一端到另一端生成对象。但即使这样也不行。它在每个服务器和客户机上生成对象。但不同步。我搜了那么多地方,看了那么多视频——都没用。这是代码和检查员的详细信息

    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

    我错过了什么?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Dooodoo    6 年前

    看起来,我的整个工作流程不正确。解决方案是首先将侦听器附加到按钮,而不是在检查器上使用onclick函数-

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

    第二种方法是创建gameobjects,其中包含一个脚本“GameManager”(控制您的板)和一个“RpcManager”(包含Rpc函数)。然后在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);
    }
    

    版主之家

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

    RPC管理器

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

    希望,这将有助于人们理解联合国教科文组织。 我通过仔细研究这个项目学会了这一点 https://www.youtube.com/watch?v=8Kd2RAfgzW0