Клиент не получает порожденные игровые объекты с сервера, и наоборот - PullRequest
0 голосов
/ 27 августа 2018

Итак, я борюсь со всей системой 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

Чего мне не хватает?

1 Ответ

0 голосов
/ 02 сентября 2018

Как кажется, весь мой рабочий процесс был не правильным. решение состоит в том, чтобы сначала прикрепить слушателя к кнопке, вместо использования функции onclick на инспекторе -

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

второе - создание игровых объектов, содержащих скрипт «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);
}

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

...