No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

GameObjectCreation.cs 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. using UnityEngine;
  2. using UnityEngine.Tilemaps;
  3. namespace UnityEditor.Tilemaps
  4. {
  5. static class GameObjectCreation
  6. {
  7. private static class Styles
  8. {
  9. public static readonly string pointTopHexagonCreateUndo = L10n.Tr("Hexagonal Point Top Tilemap");
  10. public static readonly string flatTopHexagonCreateUndo = L10n.Tr("Hexagonal Flat Top Tilemap");
  11. public static readonly string isometricCreateUndo = L10n.Tr("Isometric Tilemap");
  12. public static readonly string isometricZAsYCreateUndo = L10n.Tr("Isometric Z As Y Tilemap");
  13. }
  14. const int k_MenuPriority = 3;
  15. [MenuItem("GameObject/2D Object/Tilemap/Rectangular", priority = k_MenuPriority)]
  16. internal static void CreateRectangularTilemap()
  17. {
  18. var root = FindOrCreateRootGrid();
  19. var uniqueName = GameObjectUtility.GetUniqueNameForSibling(root.transform, "Tilemap");
  20. var tilemapGO = ObjectFactory.CreateGameObject(uniqueName, typeof(Tilemap), typeof(TilemapRenderer));
  21. Undo.SetTransformParent(tilemapGO.transform, root.transform, "");
  22. tilemapGO.transform.position = Vector3.zero;
  23. Selection.activeGameObject = tilemapGO;
  24. Undo.SetCurrentGroupName("Create Tilemap");
  25. }
  26. [MenuItem("GameObject/2D Object/Tilemap/Hexagonal - Pointed-Top", priority = k_MenuPriority)]
  27. internal static void CreateHexagonalPointTopTilemap()
  28. {
  29. CreateHexagonalTilemap(GridLayout.CellSwizzle.XYZ, Styles.pointTopHexagonCreateUndo, new Vector3(0.8659766f, 1, 1));
  30. }
  31. [MenuItem("GameObject/2D Object/Tilemap/Hexagonal - Flat-Top", priority = k_MenuPriority)]
  32. internal static void CreateHexagonalFlatTopTilemap()
  33. {
  34. CreateHexagonalTilemap(GridLayout.CellSwizzle.YXZ, Styles.flatTopHexagonCreateUndo, new Vector3(0.8659766f, 1, 1));
  35. }
  36. [MenuItem("GameObject/2D Object/Tilemap/Isometric", priority = k_MenuPriority)]
  37. internal static void CreateIsometricTilemap()
  38. {
  39. CreateIsometricTilemap(GridLayout.CellLayout.Isometric, Styles.isometricCreateUndo);
  40. }
  41. [MenuItem("GameObject/2D Object/Tilemap/Isometric Z as Y", priority = k_MenuPriority)]
  42. internal static void CreateIsometricZAsYTilemap()
  43. {
  44. CreateIsometricTilemap(GridLayout.CellLayout.IsometricZAsY, Styles.isometricZAsYCreateUndo);
  45. }
  46. private static void CreateIsometricTilemap(GridLayout.CellLayout isometricLayout, string undoMessage)
  47. {
  48. var root = FindOrCreateRootGrid();
  49. var uniqueName = GameObjectUtility.GetUniqueNameForSibling(root.transform, "Tilemap");
  50. var tilemapGO = ObjectFactory.CreateGameObject(uniqueName, typeof(Tilemap), typeof(TilemapRenderer));
  51. tilemapGO.transform.SetParent(root.transform);
  52. tilemapGO.transform.position = Vector3.zero;
  53. var grid = root.GetComponent<Grid>();
  54. // Case 1071703: Do not reset cell size if adding a new Tilemap to an existing Grid of the same layout
  55. if (isometricLayout != grid.cellLayout)
  56. {
  57. grid.cellLayout = isometricLayout;
  58. grid.cellSize = new Vector3(1.0f, 0.5f, 1.0f);
  59. }
  60. var tilemapRenderer = tilemapGO.GetComponent<TilemapRenderer>();
  61. tilemapRenderer.sortOrder = TilemapRenderer.SortOrder.TopRight;
  62. Selection.activeGameObject = tilemapGO;
  63. Undo.RegisterCreatedObjectUndo(tilemapGO, undoMessage);
  64. }
  65. private static void CreateHexagonalTilemap(GridLayout.CellSwizzle swizzle, string undoMessage, Vector3 cellSize)
  66. {
  67. var root = FindOrCreateRootGrid();
  68. var uniqueName = GameObjectUtility.GetUniqueNameForSibling(root.transform, "Tilemap");
  69. var tilemapGO = ObjectFactory.CreateGameObject(uniqueName, typeof(Tilemap), typeof(TilemapRenderer));
  70. tilemapGO.transform.SetParent(root.transform);
  71. tilemapGO.transform.position = Vector3.zero;
  72. var grid = root.GetComponent<Grid>();
  73. grid.cellLayout = Grid.CellLayout.Hexagon;
  74. grid.cellSwizzle = swizzle;
  75. grid.cellSize = cellSize;
  76. var tilemap = tilemapGO.GetComponent<Tilemap>();
  77. tilemap.tileAnchor = Vector3.zero;
  78. Selection.activeGameObject = tilemapGO;
  79. Undo.RegisterCreatedObjectUndo(tilemapGO, undoMessage);
  80. }
  81. private static GameObject FindOrCreateRootGrid()
  82. {
  83. GameObject gridGO = null;
  84. // Check if active object has a Grid and can be a parent for the Tile Map
  85. if (Selection.activeObject is GameObject)
  86. {
  87. var go = (GameObject)Selection.activeObject;
  88. var parentGrid = go.GetComponentInParent<Grid>();
  89. if (parentGrid != null)
  90. {
  91. gridGO = parentGrid.gameObject;
  92. }
  93. }
  94. // If neither the active object nor its parent has a grid, create a grid for the tilemap
  95. if (gridGO == null)
  96. {
  97. gridGO = ObjectFactory.CreateGameObject("Grid", typeof(Grid));
  98. gridGO.transform.position = Vector3.zero;
  99. var grid = gridGO.GetComponent<Grid>();
  100. grid.cellSize = new Vector3(1.0f, 1.0f, 0.0f);
  101. Undo.SetCurrentGroupName("Create Grid");
  102. }
  103. return gridGO;
  104. }
  105. }
  106. }