您的位置 首页 kreess

tilemap工具

using System.Collections;using System.Collections.Generic;using UnityEngine;using Unit

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEditor;using UnityEngine.Tilemaps;using System.IO;using System;using System.Timers;using System.Text;using Data;using UnityEditor.Tilemaps;public class TileMapExportWindow : EditorWindow{ public enum DrawType { Tiled, Random, } public enum TileMapSize { _64 = 64, _128 = 128, _256 = 256, _512 = 512 } public Tilemap surfaceTilemap;//地表 // 整圖寬高 const int nMapHeight = 512; const int nMapWidth = 512; // 區域寬高 public int areaMapHeight; public int areaMapWidth; [MenuItem("Tools/世界地圖編輯器")] private static void ExportTitemap() { TileMapExportWindow window = EditorWindow.GetWindow<TileMapExportWindow>(); } #region 繪制 相關變量 DrawType drawType = DrawType.Tiled; TileMapSize mapSizeWidth = TileMapSize._128; TileMapSize mapSizeHeight = TileMapSize._128; public Tilemap drawTileMap; string drawBeginX; int drawBeingValueX = 0; string drawBeginY; int drawBeingValueY = 0; string drawEndX; int drawEndXValue = 0; string drawEndY; int drawEndYValue = 0; string sRandomCount; int randomCount = 0; #endregion 繪制 private void OnGUI() { GUILayout.BeginHorizontal(); GUILayout.Label("繪制地圖"); drawType = (DrawType)EditorGUILayout.EnumPopup(drawType); GUILayout.EndHorizontal(); GUILayout.Space(5); GUILayout.BeginHorizontal(); GUILayout.Label("隨機生成個數"); sRandomCount = GUILayout.TextField(sRandomCount); int.TryParse(sRandomCount, out randomCount); GUILayout.EndHorizontal(); GUILayout.Space(5); GUILayout.BeginHorizontal(); GUILayout.Label("起點 X", GUILayout.Width(50)); drawBeginX = GUILayout.TextField(drawBeginX, GUILayout.Width(50)); int.TryParse(drawBeginX, out drawBeingValueX); GUILayout.Label("終點:", GUILayout.Width(50)); drawEndX = GUILayout.TextField(drawEndX, GUILayout.Width(50)); int.TryParse(drawEndX, out drawEndXValue); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("起點 Y", GUILayout.Width(50)); drawBeginY = GUILayout.TextField(drawBeginY, GUILayout.Width(50)); int.TryParse(drawBeginY, out drawBeingValueY); GUILayout.Label("終點:", GUILayout.Width(50)); drawEndY = GUILayout.TextField(drawEndY, GUILayout.Width(50)); int.TryParse(drawEndY, out drawEndYValue); GUILayout.EndHorizontal(); drawTileMap = (Tilemap)EditorGUILayout.ObjectField("地圖 Tilemap", drawTileMap, typeof(Tilemap), true); GUILayout.Label("從Tile Palette 選取繪制的tile"); GUILayout.BeginHorizontal(); if (GUILayout.Button("繪制")) { DrawTileMap(); } if (GUILayout.Button("重新繪制")) { DeleteAll(); DrawTileMap(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("清空")) { DeleteArea(); } if (GUILayout.Button("全部清空")) { DeleteAll(); } GUILayout.EndHorizontal(); GUILayout.Space(20); GUILayout.BeginHorizontal(); GUILayout.Label("地圖高", GUILayout.Width(100)); mapSizeHeight = (TileMapSize)EditorGUILayout.EnumPopup(mapSizeHeight); areaMapHeight = (int)mapSizeWidth; GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("地圖寬", GUILayout.Width(100)); mapSizeWidth = (TileMapSize)EditorGUILayout.EnumPopup(mapSizeWidth); areaMapWidth = (int)mapSizeWidth; GUILayout.EndHorizontal(); GUILayout.Space(5); GUILayout.Space(5); if (GUILayout.Button("導出")) { Export(); } } public void Export() { GameObject grid = GameObject.Find("Grid"); var tilemaps = grid.GetComponentsInChildren<Tilemap>(); List<Tilemap> objectTilemaps = new List<Tilemap>(); foreach (var kv in tilemaps) { if (kv.gameObject.name.Contains("Terrain")) { surfaceTilemap = kv; } else { objectTilemaps.Add(kv); } } if (surfaceTilemap == null) { Debug.Log("地圖 is null ??"); //return; } if (areaMapWidth == 0) { areaMapWidth = nMapWidth; } if (areaMapHeight == 0) { areaMapHeight = nMapHeight; } string path = FilePathUtil.Combine(Application.dataPath, "Configs", "WorldMapLayout.csv"); if (File.Exists(path)) { File.Delete(path); } string path2 = FilePathUtil.Combine(Application.dataPath, "Configs", "WorldMapSprite.csv"); if (File.Exists(path2)) { File.Delete(path2); } List<string> lineList = new List<string>(); lineList.Add("id,icon"); Dictionary<string, int> tileDict = new Dictionary<string, int>(); // 地表 GameObject tileGameObject = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/TilePaletteAsset/WorldMapTerrain.prefab"); var tileMap = tileGameObject.GetComponentInChildren<Tilemap>(); int tileVal = 1; for (int x = tileMap.cellBounds.xMin; x < tileMap.cellBounds.xMax; x++) { for (int y = tileMap.cellBounds.yMin; y < tileMap.cellBounds.yMax; y++) { Sprite sprite = tileMap.GetSprite(new Vector3Int(x, y, 0)); if (sprite && !tileDict.ContainsKey(sprite.name)) { tileDict.Add(sprite.name, tileVal); lineList.Add(String.Format("{0},{1}", 10000 + tileVal, sprite.name)); tileVal++; } } } Dictionary<string, int> tileDict2 = new Dictionary<string, int>(); // 物件 tileGameObject = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/TilePaletteAsset/WorldMapObject.prefab"); tileMap = tileGameObject.GetComponentInChildren<Tilemap>(); tileVal = 1; for (int x = tileMap.cellBounds.xMin; x < tileMap.cellBounds.xMax; x++) { for (int y = tileMap.cellBounds.yMin; y < tileMap.cellBounds.yMax; y++) { Sprite sprite = tileMap.GetSprite(new Vector3Int(x, y, 0)); if (sprite && !tileDict2.ContainsKey(sprite.name)) { tileDict2.Add(sprite.name, tileVal); lineList.Add(String.Format("{0},{1}", 20000 + tileVal, sprite.name)); tileVal++; } } } // 存儲格式 ABBCC A:障礙碼(1|0)BB:地表 CC:物件 List<string> lineList2 = new List<string>(); for (int y = nMapHeight – 1; y >= 0; –y) { string newLine = null; for (int x = 0; x < nMapWidth; ++x) { string value = string.Empty; { int cellValue = 0; Vector3Int pos = new Vector3Int(x % areaMapWidth, y % areaMapWidth, 0); var sprite = surfaceTilemap.GetSprite(pos); var surfaceColiderType = surfaceTilemap.GetColliderType(pos); if (sprite != null) { int val = tileDict.GetValue(sprite.name); cellValue += val * 100; } Tile.ColliderType ObjectColiderType = Tile.ColliderType.Grid; // 默認不是障礙 // 一個格上隻有一種物件類型 foreach (var kv in objectTilemaps) { sprite = kv.GetSprite(pos); if (sprite != null) { ObjectColiderType = kv.GetColliderType(pos); break; } } if (sprite != null) { int val = tileDict2.GetValue(sprite.name); cellValue += val; } if (ObjectColiderType == Tile.ColliderType.None || surfaceColiderType == Tile.ColliderType.None) { cellValue += 10000; } if (cellValue != 0) { value = cellValue.ToString(); } } newLine += (value + ",").Trim(); } lineList2.Add(newLine); } StringBuilder sb = new StringBuilder(); foreach (string line in lineList) { sb.Append(line + "n"); } File.WriteAllText(path2, sb.ToString()); sb = new StringBuilder(); foreach (string line in lineList2) { sb.Append(line + "n"); } File.WriteAllText(path, sb.ToString()); Debug.Log("導出成功!!!!!!!"); } public void DrawTileMap() { if (drawTileMap == null || drawBeingValueX < 0 || drawEndXValue > nMapWidth || drawBeingValueY < 0 || drawEndYValue > nMapHeight || drawEndXValue < drawBeingValueX || drawEndYValue < drawBeingValueY) { Debug.Log("—–輸入參數有問題!"); return; } var brush = TileMapHelper.GetActiveBrush(); if (brush == null || brush.cellCount < 0) { Debug.Log("—–未選擇tilepalette圖片!"); return; } if (drawType == DrawType.Tiled) { DrawTiled(brush); } else if (drawType == DrawType.Random) { DrawRandom(brush); } EditorUtility.SetDirty(drawTileMap); } void DrawTiled(GridBrush brush) { int brushWidth = brush.size.x; int brushHeight = brush.size.y; for (int x = drawBeingValueX; x < (drawBeingValueX + drawEndXValue) / brushWidth; x++) { for (int y = drawBeingValueY; y < (drawBeingValueY + drawEndYValue) / brushHeight; y++) { int tileIndex = 0; for (int brushY = 0; brushY < brush.size.y; brushY++) { for (int brushX = 0; brushX < brush.size.x; brushX++) { drawTileMap.SetTile(new Vector3Int((x * brushWidth) + brushX, (y * brushHeight) + brushY, 0), brush.cells[tileIndex].tile); tileIndex++; } } } } } void DrawRandom(GridBrush brush) { int brushWidth = brush.size.x; int brushHeight = brush.size.y; GameObject obj = GameObject.Find("Grid"); var tileMaps = obj.GetComponentsInChildren<Tilemap>(); Tilemap terrainMap = null; List<Tilemap> listTileMap = new List<Tilemap>(); foreach (var v in tileMaps) { if (v.gameObject.name.Contains("Terrain")) { terrainMap = v; } else if (v.gameObject.name != drawTileMap.gameObject.name) { listTileMap.Add(v); } } int xCount = (drawEndXValue – drawBeingValueX) / brushWidth; int yCount = (drawEndYValue – drawBeingValueY) / brushHeight; // 找出所有可畫的點,排除障礙和所有地表物件 List<int> pointList = new List<int>(); for (int x = 0; x < xCount; x++) { for (int y = 0; y < yCount; y++) { int posX = drawBeingValueX + x * brushWidth; int posY = drawBeingValueY + y * brushHeight; if (IsCanPutObject(posX, posY, terrainMap, listTileMap, brushWidth, brushHeight)) { pointList.Add(posX * 10000 + posY); } } } int maxRandomCount = pointList.Count-1; if (randomCount > maxRandomCount) { Debug.Log("—–輸入隨機數量有問題!當前區域可隨機的數量是:" + maxRandomCount); return; } List<int> list = new List<int>(); System.Random random = new System.Random((int)TimeUtils.Now().Ticks); int randowNum = randomCount; while (randowNum > 0) { int index = random.Next(0, maxRandomCount); int val = pointList[index]; if (!list.Contains(val)) { list.Add(val); randowNum–; } } // 清空當前 DeleteArea(); foreach (var v in list) { int x = v / 10000; int y = v % 10000; int tileIndex = 0; for (int brushY = 0; brushY < brush.size.y; brushY++) { for (int brushX = 0; brushX < brush.size.x; brushX++) { drawTileMap.SetTile(new Vector3Int(x + brushX, y + brushY, 0), brush.cells[tileIndex].tile); tileIndex++; } } } } void DeleteArea() { if (drawTileMap == null) { return; } for (int x = drawBeingValueX; x <= drawEndXValue; x++) { for (int y = drawBeingValueY; y <= drawEndYValue; y++) { drawTileMap.SetTile(new Vector3Int(x, y, 0), null); } } EditorUtility.SetDirty(drawTileMap); } void DeleteAll() { if (drawTileMap == null) { return; } for (int x = 0; x < nMapWidth; x++) { for (int y = 0; y < nMapHeight; y++) { drawTileMap.SetTile(new Vector3Int(x, y, 0), null); } } EditorUtility.SetDirty(drawTileMap); } bool IsCanPutObject(int x, int y, Tilemap terrain, List<Tilemap> objects, int brushWidth, int brushHeight) { for (int bx = 0; bx < brushWidth; bx++) { for (int by = 0; by < brushHeight; by++) { Vector3Int pos = new Vector3Int(x + bx, y + by, 0); if (terrain != null) { var sprite = terrain.GetSprite(pos); var coliderType = terrain.GetColliderType(pos); if (coliderType == Tile.ColliderType.None) { return false; } } foreach (var kv in objects) { if (kv.GetSprite(pos) != null) { return false; } } } } return true; }}

using System.Collections.Generic;using UnityEngine;using UnityEditor;using System.Linq;using UnityEditor.Tilemaps;using System.Reflection;public class TileMapHelper{ public static GridBrush GetActiveBrush() { var knownType = typeof(GridPaintingState); var gridBrushProperty = knownType.GetProperty( "gridBrush", BindingFlags.Static | BindingFlags.Public); return (GridBrush)gridBrushProperty.GetValue(null, null); }}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

返回顶部