Как заставить Unity Tilemap.SetTile () работать в мультиплеере? - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь создать 2D-многопользовательскую игру со случайно сгенерированной картой.

Вот упрощенный код, который я пробовал

public class Map : NetworkBehaviour
{
    private TilePainter _tilePainter;

    [Command]
    public void CmdStartGenerating()
    {        
        _tilePainter.PaintSection(section)//section is randomly generated map information
    }
}
public class TilePainter : NetworkBehaviour
{
    public Tile tile;    

    private Tilemap _tilemap;

    public void PaintSection(Section section)
    {
        section.Foreach(x=>{
            _tilemap.SetTile(x.Vector3(), tile);
        })
    }
}

Конечно, я сделал их NetworkIdentity и CmdStartGenerating вызывается нажатием кнопки.

Проблема в том, что сгенерированная карта листов видна только в главном проигрывателе.

Другой клиент не может см. сгенерированную карту тайлов.

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

Я пытался сделать их префабами, порождаемыми в сети, но не сработало. (с той же проблемой)

Есть ли какой-либо метод, например NetworkServer.Spawn для тайловой карты ??

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

Спасибо, что прочитали мой вопрос!

#### Edit

Загрузка дополнительного кода, который я тестировал в тестовой сцене.

public class NetTest : NetworkBehaviour
{
    public TileRiverMap tileRiverMap;
    
    private SectionGenerator _sectionGenerator =
        new SectionGenerator(10, 20, 1f);
    
    public void Test()
    {
        Debug.Log("hihi");
        tileRiverMap.PaintSection(_sectionGenerator.GenerateSection((0, 0)), 5);
    }
}

Класс ниже: Объект игрока

public class TestPlayer : NetworkBehaviour
{
    private void FixedUpdate()
    {
        if (isLocalPlayer)
        {
            if (Input.GetButtonDown("Jump"))
            {
                CmdTest();
            }
        }
    }

    [Command]
    private void CmdTest()
    {
        FindObjectOfType<NetTest>().Test();
    }
}
public class TileRiverMap : NetworkBehaviour, IRiverMap
{
    public Tile tile;
    public GameObject stone;

    private Tilemap _tilemap;
    ......
}

Я не думаю, что нужен весь код TileRiverMap

...