Объект порождает только серверную часть [NetworkServer/NetworkClient]

Я пытаюсь начать работу с сетевыми функциями Unity и столкнулся с проблемой при попытке создания объектов. Я попытался создать простую демонстрацию, следуя документации, найденной здесь, сервер порождает объект, который меняет цвет каждую секунду, каждый подключенный клиент должен видеть этот объект и его цвет меняется. Клиент/сервер подключаются, но объект появляется только на стороне сервера (без сообщений об ошибках).

Client.cs

public class Client : MonoBehaviour
{
    public GameObject boxPrefab;

    private NetworkClient networkClient;

    private static void OnConnected(NetworkMessage networkMessage)
    {
        Debug.Log(string.Format("[ID: {0}] Connected.", networkMessage.conn.connectionId));
    }

    private void Start()
    {
        networkClient = new NetworkClient();

        ClientScene.RegisterPrefab(boxPrefab);  
        networkClient.RegisterHandler(MsgType.Connect, OnConnected);
        networkClient.Connect("127.0.0.1", 5172);

        Debug.Log("Connecting...");
    }
}

Server.cs

public class Server : MonoBehaviour
{
    public BoxSpawner boxSpawner;

    private void OnConnection(NetworkMessage networkMessage)
    {
        Debug.Log(string.Format("[ID: {0}] Connected.", networkMessage.conn.connectionId));
    }

    private void Start()
    {
        NetworkServer.RegisterHandler(MsgType.Connect, OnConnection);
        NetworkServer.Listen("127.0.0.1", 5172);
        Debug.Log("Listening...");

        NetworkServer.SpawnObjects();
        boxSpawner.Spawn();
    }
}

BoxSpawner.cs

public class BoxSpawner : NetworkBehaviour
{
    public GameObject boxPrefab;

    public void Spawn()
    {
        GameObject box = (GameObject) Instantiate(boxPrefab, transform.position, transform.rotation);
        NetworkServer.Spawn(box);
    }
}

И клиент, и сервер имеют префаб с именем Box, на котором есть следующий скрипт, а также компонент NetworkIdentity.

Box.cs

public class Box : NetworkBehaviour
{
    [SyncVar]
    private Color32 color;

    private IEnumerator ChangeColour()
    {
        while (true)
        {
            color = new Color32((byte)Random.Range(0, 255), (byte)Random.Range(0, 255),
                (byte)Random.Range(0, 255), 255);
            yield return new WaitForSeconds(1.0f);
        }
    }

    private void Start()
    {
        if (isServer)
        {
            StartCoroutine(ChangeColour());
        }
    }

    private void Update()
    {
        GetComponent<SpriteRenderer>().color = color;
    }
}

Я также загрузил оба проекта клиент/сервер в репозиторий GitHub здесь, если кто-то может взгляните и помогите мне, я был бы очень признателен, спасибо.

Примечание. Я пытаюсь сделать это без использования NetworkManager.


person Ben    schedule 13.05.2017    source источник


Ответы (1)


Просто взглянув на ваш код очень быстро, я вижу одну вещь, в которой я не знаю, является ли это причиной, но вы регистрируете свой boxPrefab на клиенте. это должно быть сделано на сервере, я думаю.

person PeterK    schedule 30.05.2017