Отсутствуют плитки при рендеринге изометрической карты тайлов в шахматном порядке в Unity. ⇐ C#
Отсутствуют плитки при рендеринге изометрической карты тайлов в шахматном порядке в Unity.
Я пытаюсь отобразить тайлы на изометрической шахматной карте тайлов в Unity, но некоторые тайлы отсутствуют. Я думаю, проблема может быть в том, где я размещаю плитки, или в каких-то проблемах с точностью чисел с плавающей запятой.
Основная проблема:
Я читаю тайлы из файла JSON и пытаюсь поместить их в карту тайлов Unity. Но некоторые плитки просто не отображаются. Я перепроверил свои расчеты и даже попробовал внести небольшие изменения, но плиток все еще не хватает.
Вот код, который я использую:
MapLoader.cs — отвечает за загрузку данных карты из пути к файлу.
с использованием System.IO; использование UnityEngine; общедоступный статический класс MapLoader { общедоступный статический MapDataStructure.MapData LoadMapFromPath (строковый путь) { if (!IsValidPath(путь)) возвращает ноль; return DeserializeMap(File.ReadAllText(путь)); } частный статический bool IsValidPath (строковый путь) { if (File.Exists(path)) возвращает true; Debug.LogError($"Невозможно найти или получить доступ к файлу карты по адресу: {path}"); вернуть ложь; } частный статический MapDataStructure.MapData DeserializeMap (строка jsonData) { return JsonUtility.FromJson(jsonData); } } TilePlacer.cs — содержит логику для определения того, какой тайл разместить, и его мирового положения.
с использованием UnityEngine; использование UnityEngine.Tilemaps; публичный класс TilePlacer { частная карта плиток только для чтения _tilemap; частная плитка только для чтения [] _tileAssets; public TilePlacer (карта тайлов Tilemap, Tile [] tileAssets) { _tilemap = карта тайлов; _tileAssets = tileAssets; } public void PlaceTileAtCoordinates(int[] tileData, int x, int y, MapDataStructure.MapData mapData) { int tileIndex = GetTileIndex(tileData, x, y, MapData); если (IsValidTileIndex(tileIndex)) { PlaceTile (tileIndex, x, y, MapData); } еще { Debug.LogWarning($"Неверный индекс плитки {tileIndex} в позиции {y},{x}"); } } частный int GetTileIndex(int[] tileData, int x, int y, MapDataStructure.MapData mapData) { return tileData[y * mapData.width + x] - 1; } частный bool IsValidTileIndex (int tileIndex) { return tileIndex >= 0 && tileIndex < _tileAssets.Length; } Private void PlaceTile(int tileIndex, int x, int y, MapDataStructure.MapData mapData) { Vector3 tileWorldPosition = ComputeTileWorldPosition(x, y, mapData); Vector3Int cellPosition = _tilemap.WorldToCell(tileWorldPosition); _tilemap.SetTile(cellPosition, _tileAssets[tileIndex]); } частный Vector3 ComputeTileWorldPosition(int x, int y, MapDataStructure.MapData mapData) { float worldX = x * mapData.tileWidth; float worldY = y * mapData.tileHeight/2; // Корректируем x для нечетных строк если ((y & 1) == 1) { worldX += MapData.tileWidth/2; } вернуть новый Vector3(worldX, worldY, 0); } } TilemapRenderer.cs — управляет процессом рендеринга тайлов в Tilemap.
с использованием System.IO; использование UnityEngine; использование UnityEngine.Tilemaps; общедоступный класс TilemapRenderer: MonoBehaviour { [Сериализефилд] частная строка MapFileName = «WorldMap.json»; [Сериализефилд] частная плитка [] tileAssets; частная карта тайлов Tilemap; частный TilePlacer tilePlacer; частная константа int DEFAULT_LAYER_INDEX = 0; частная пустота Старт() { tilemap = GetComponent(); tilePlacer = новый TilePlacer (карта плиток, tileAssets); ЗагрузитьИрендерКарта(); } частная пустота LoadAndRenderMap() { строка filePath = BuildFilePath(); MapDataStructure.MapData mapData = MapLoader.LoadMapFromPath(filePath); если (mapData != ноль) { RenderTilesFromLayer (mapData, DEFAULT_LAYER_INDEX); } еще { Debug.LogError("Не удалось десериализовать данные карты из файла."); } } частная строка BuildFilePath() { return Path.Combine(Application.streamingAssetsPath, mapFileName); } частная пустота RenderTilesFromLayer (MapDataStructure.MapData MapData, int LayerIndex) { if (mapData.layers == null || LayerIndex >= mapData.layers.Length) { Debug.LogError("Недопустимый слой карты."); возвращаться; } int[] tileData = mapData.layers[layerIndex].data; for (int y = 0; y
Я пытаюсь отобразить тайлы на изометрической шахматной карте тайлов в Unity, но некоторые тайлы отсутствуют. Я думаю, проблема может быть в том, где я размещаю плитки, или в каких-то проблемах с точностью чисел с плавающей запятой.
Основная проблема:
Я читаю тайлы из файла JSON и пытаюсь поместить их в карту тайлов Unity. Но некоторые плитки просто не отображаются. Я перепроверил свои расчеты и даже попробовал внести небольшие изменения, но плиток все еще не хватает.
Вот код, который я использую:
MapLoader.cs — отвечает за загрузку данных карты из пути к файлу.
с использованием System.IO; использование UnityEngine; общедоступный статический класс MapLoader { общедоступный статический MapDataStructure.MapData LoadMapFromPath (строковый путь) { if (!IsValidPath(путь)) возвращает ноль; return DeserializeMap(File.ReadAllText(путь)); } частный статический bool IsValidPath (строковый путь) { if (File.Exists(path)) возвращает true; Debug.LogError($"Невозможно найти или получить доступ к файлу карты по адресу: {path}"); вернуть ложь; } частный статический MapDataStructure.MapData DeserializeMap (строка jsonData) { return JsonUtility.FromJson(jsonData); } } TilePlacer.cs — содержит логику для определения того, какой тайл разместить, и его мирового положения.
с использованием UnityEngine; использование UnityEngine.Tilemaps; публичный класс TilePlacer { частная карта плиток только для чтения _tilemap; частная плитка только для чтения [] _tileAssets; public TilePlacer (карта тайлов Tilemap, Tile [] tileAssets) { _tilemap = карта тайлов; _tileAssets = tileAssets; } public void PlaceTileAtCoordinates(int[] tileData, int x, int y, MapDataStructure.MapData mapData) { int tileIndex = GetTileIndex(tileData, x, y, MapData); если (IsValidTileIndex(tileIndex)) { PlaceTile (tileIndex, x, y, MapData); } еще { Debug.LogWarning($"Неверный индекс плитки {tileIndex} в позиции {y},{x}"); } } частный int GetTileIndex(int[] tileData, int x, int y, MapDataStructure.MapData mapData) { return tileData[y * mapData.width + x] - 1; } частный bool IsValidTileIndex (int tileIndex) { return tileIndex >= 0 && tileIndex < _tileAssets.Length; } Private void PlaceTile(int tileIndex, int x, int y, MapDataStructure.MapData mapData) { Vector3 tileWorldPosition = ComputeTileWorldPosition(x, y, mapData); Vector3Int cellPosition = _tilemap.WorldToCell(tileWorldPosition); _tilemap.SetTile(cellPosition, _tileAssets[tileIndex]); } частный Vector3 ComputeTileWorldPosition(int x, int y, MapDataStructure.MapData mapData) { float worldX = x * mapData.tileWidth; float worldY = y * mapData.tileHeight/2; // Корректируем x для нечетных строк если ((y & 1) == 1) { worldX += MapData.tileWidth/2; } вернуть новый Vector3(worldX, worldY, 0); } } TilemapRenderer.cs — управляет процессом рендеринга тайлов в Tilemap.
с использованием System.IO; использование UnityEngine; использование UnityEngine.Tilemaps; общедоступный класс TilemapRenderer: MonoBehaviour { [Сериализефилд] частная строка MapFileName = «WorldMap.json»; [Сериализефилд] частная плитка [] tileAssets; частная карта тайлов Tilemap; частный TilePlacer tilePlacer; частная константа int DEFAULT_LAYER_INDEX = 0; частная пустота Старт() { tilemap = GetComponent(); tilePlacer = новый TilePlacer (карта плиток, tileAssets); ЗагрузитьИрендерКарта(); } частная пустота LoadAndRenderMap() { строка filePath = BuildFilePath(); MapDataStructure.MapData mapData = MapLoader.LoadMapFromPath(filePath); если (mapData != ноль) { RenderTilesFromLayer (mapData, DEFAULT_LAYER_INDEX); } еще { Debug.LogError("Не удалось десериализовать данные карты из файла."); } } частная строка BuildFilePath() { return Path.Combine(Application.streamingAssetsPath, mapFileName); } частная пустота RenderTilesFromLayer (MapDataStructure.MapData MapData, int LayerIndex) { if (mapData.layers == null || LayerIndex >= mapData.layers.Length) { Debug.LogError("Недопустимый слой карты."); возвращаться; } int[] tileData = mapData.layers[layerIndex].data; for (int y = 0; y
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Карты Google больше не показывают карты плитки, вместо этого серого экрана
Anonymous » » в форуме Android - 0 Ответы
- 4 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Карты Google больше не показывают карты плитки, вместо этого серого экрана
Anonymous » » в форуме IOS - 0 Ответы
- 2 Просмотры
-
Последнее сообщение Anonymous
-