Создание GameObjects через сеть - PullRequest
0 голосов
/ 18 мая 2018

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

enter image description here

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class GenerateLevel : NetworkBehaviour {
public int MapSize = 20;
public GameObject prefab;
public GameObject _LeftW;
public GameObject _RightW;
public GameObject _TopW;
public GameObject _Botw;
public GameObject SpawnLocRed;
public GameObject SpawnLocBlue;

public string map;
public override void OnStartServer()
{
    //base.OnStartServer();
    GetComponent<Renderer>().material.color = Color.blue;

}

void Start()
{
    if (!isServer)
    {
        return;
    }


    for (int c = MapSize / 2; c > -MapSize / 2; c--)
    {

        for (int r = -MapSize / 2; r < MapSize / 2; r++)
        {
            var t = Instantiate(prefab, new Vector3(r, 0, c), 
Quaternion.identity);
            NetworkServer.Spawn(t);
            Debug.Log("Col:" + c + " Row:" + r);

            if (Random.Range(0, 3) == 2)
            {
                t.GetComponent<RAISE>().Run();
                map += 1;
            }
            else
            {
                map += 0;
                if (c < 0 - MapSize / 4 && r > 0 + MapSize / 4)
                {
                   var red= Instantiate(SpawnLocRed, new Vector3(r, 2, c), 
Quaternion.identity);
                }
                if (c > 0 + MapSize / 4 && r < 0 - MapSize / 4)
                {
                   var blue= Instantiate(SpawnLocBlue, new Vector3(r, 2, c), 
Quaternion.identity);

                }
            }

            map += "r";

        }
        map += "c";
    }
    Debug.Log(map);
    if (MapSize % 2 == 0)
    {
        GameObject wt = Instantiate(_TopW, new Vector3(-.5f, 0, -MapSize / 2), Quaternion.identity);
        wt.transform.localScale = new Vector3(MapSize, 5, 1);
        GameObject wb = Instantiate(_Botw, new Vector3(-.5f, 0, MapSize / 2+1), Quaternion.identity);
        wb.transform.localScale = new Vector3(MapSize, 5, 1);
        GameObject wl = Instantiate(_LeftW, new Vector3(-MapSize / 2-1, 0, .5f), Quaternion.identity);
        wl.transform.localScale = new Vector3(1, 5, MapSize+2);


        GameObject wr = Instantiate(_RightW, new Vector3(MapSize / 2, 0, .5f), Quaternion.identity);
        wr.transform.localScale = new Vector3(1, 5, MapSize+2);
    }
    else
    {
        GameObject wt = Instantiate(_TopW, new Vector3(-.5f, 0, -MapSize / 2), Quaternion.identity);
        wt.transform.localScale = new Vector3(MapSize-1, 5, 1);
        GameObject wb = Instantiate(_Botw, new Vector3(-.5f, 0, MapSize / 2 + 1), Quaternion.identity);
        wb.transform.localScale = new Vector3(MapSize-1, 5, 1);


        GameObject wl = Instantiate(_LeftW, new Vector3(-MapSize / 2 - 1, 0, .5f), Quaternion.identity);
        wl.transform.localScale = new Vector3(1, 5, MapSize + 1);


        GameObject wr = Instantiate(_RightW, new Vector3(MapSize / 2, 0, .5f), Quaternion.identity);
        wr.transform.localScale = new Vector3(1, 5, MapSize + 1);
    }
    Debug.Log(MapSize % 2);
}

Вот обновленный фрагментcode

public GameObject[] tiles = new GameObject[1000];
public string map;
public override void OnStartServer()
{
    //base.OnStartServer();
    GetComponent<Renderer>().material.color = Color.blue;

}
public void OnPlayerConnected(NetworkPlayer player)
{
    foreach(GameObject go in tiles)
    {
        NetworkServer.Spawn(go);
    }
}

void Start()
{
    if (!isServer)
    {
        return;
    }
    int temp = 0;

    for (int c = MapSize / 2; c > -MapSize / 2; c--)
    {

        for (int r = -MapSize / 2; r < MapSize / 2; r++)
        {
            var t = Instantiate(prefab, new Vector3(r, 0, c), Quaternion.identity);
            tiles[temp] = t;
            NetworkServer.Spawn(t);
         }
     }
}

После некоторой проверки я получил тайлы для появления, но они не синхронизируются с персонажами, которые henerate запускает для каждого клиента отдельно.

enter image description here

1 Ответ

0 голосов
/ 18 мая 2018

Вы не можете просто использовать функцию Instantiate, чтобы показывать префабы в сети.Есть и другие вещи, которые вы должны сделать:

1 . Вы должны зарегистрировать префаб через компонент NetworkManager.Если имеется более одного префаба, вы должны сделать это для всех из них:

enter image description here

2 .Attach NetworkIdentityКомпонент для сборного.Обратите внимание, что если вы также хотите синхронизировать преобразование объектов, вы должны также присоединить NetworkTransform к префабу.

3 . После создания префаба используйте NetworkServer.Spawn, чтобы также создать его экземплярв сети тоже.

Например:

//Instantiate on this device
GameObject red = Instantiate(SpawnLocRed, new Vector3(r, 2, c), 
Quaternion.identity);
//Instantiate it on all clients
NetworkServer.Spawn(red);

Наконец, вы можете захотеть обернуть весь код внутри isLocalPlayer, чтобы убедиться, что вы создаете только экземпляры из локального проигрывателя.

if (isLocalPlayer)
{
    //Instantiate on this device
    GameObject red = Instantiate(SpawnLocRed, new Vector3(r, 2, c), 
    Quaternion.identity);
    //Instantiate it on all clients
    NetworkServer.Spawn(red);    
}
...