MyGridMap.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEditor;
  5. [System.Serializable]
  6. public class MyGridMap : MonoBehaviour
  7. {
  8. private const int V = 0;
  9. public static int Row;
  10. public static int Col;
  11. public static int W = 20;
  12. public static int H = 20;
  13. public struct MapPos
  14. {
  15. public MapPos(int r,int c)
  16. {
  17. this.Row = r;
  18. this.Col = c;
  19. }
  20. int Row;
  21. int Col;
  22. }
  23. public Dictionary<MapPos, MyTile> mapTiles = new Dictionary<MapPos, MyTile>();
  24. public Dictionary<MapPos, Collider> tileBox = new Dictionary<MapPos, Collider>();
  25. private void Awake()
  26. {
  27. }
  28. // Start is called before the first frame update
  29. void Start()
  30. {
  31. }
  32. public void AddMyGrid(int r,int c,float w, float h)
  33. {
  34. GameObject box = GameObject.CreatePrimitive(PrimitiveType.Cube);
  35. box.name = "grid_" + r.ToString() + "_" + c.ToString();
  36. box.transform.parent = this.transform;
  37. box.transform.SetLocalPositionY(0);
  38. box.transform.SetLocalPositionX(w * c);
  39. box.transform.SetLocalPositionZ(h * r);
  40. box.transform.localScale = new Vector3(w, 20, h);
  41. mapTiles.Add(new MapPos(r, c), box.GetOrAddComponent<MyTile>());
  42. box.GetOrAddComponent<BoxCollider>().isTrigger = true;
  43. tileBox.Add(new MapPos(r, c), box.GetOrAddComponent<BoxCollider>());
  44. }
  45. public void OptimizeTerrain(GameObject obj)
  46. {
  47. ResetGridData();
  48. for (int i = 0; i < obj.transform.childCount; ++i)
  49. {
  50. Terrain t = obj.transform.GetChild(i).GetComponent<Terrain>();
  51. if(!t)
  52. {
  53. continue;
  54. }
  55. t.heightmapPixelError = 200;
  56. float offsetX = (int)t.transform.position.x - this.transform.position.x;
  57. float offsetZ = (int)t.transform.position.z - this.transform.position.z;
  58. MapPos gridPos = new MapPos((int)offsetZ / H, (int)offsetX / W);
  59. mapTiles[gridPos].AddSplitTerrain(t);
  60. }
  61. }
  62. public void MateObjToGrid(GameObject obj)
  63. {
  64. RefresGridData();
  65. for (int i = 0; i < obj.transform.childCount; ++i)
  66. {
  67. Transform element = obj.transform.GetChild(i);
  68. float offsetX = (int)element.transform.position.x - this.transform.position.x;
  69. float offsetZ = (int)element.transform.position.z - this.transform.position.z;
  70. MapPos gridPos = new MapPos((int)offsetZ / H, (int)offsetX / W);
  71. mapTiles[gridPos].AddElement(element.gameObject);
  72. }
  73. }
  74. public void AddSubObjToGrid(GameObject obj)
  75. {
  76. for (int i = 0; i < obj.transform.childCount; ++i)
  77. {
  78. Transform element = obj.transform.GetChild(i);
  79. float offsetX = Mathf.Abs((int)element.transform.localToWorldMatrix.GetPosition().x - this.transform.position.x);
  80. float offsetZ = Mathf.Abs((int)element.transform.localToWorldMatrix.GetPosition().z - this.transform.position.z);
  81. MapPos gridPos = new MapPos((int)offsetZ / H, (int)offsetX / W);
  82. mapTiles[gridPos].AddElement(element.gameObject);
  83. }
  84. }
  85. public void AddOneObjToGrid(GameObject obj)
  86. {
  87. obj.SetActive(false);
  88. Transform element = obj.transform;
  89. float offsetX = Mathf.Abs((int)element.transform.localToWorldMatrix.GetPosition().x - this.transform.position.x);
  90. float offsetZ = Mathf.Abs((int)element.transform.localToWorldMatrix.GetPosition().z - this.transform.position.z);
  91. MapPos gridPos = new MapPos((int)offsetZ / H, (int)offsetX / W);
  92. if (mapTiles.ContainsKey(gridPos))
  93. {
  94. mapTiles[gridPos].AddElement(element.gameObject);
  95. }
  96. else
  97. {
  98. RefresGridData();
  99. }
  100. }
  101. public void RefresGridData()
  102. {
  103. mapTiles.Clear();
  104. for (int i = 0; i < transform.childCount; ++i)
  105. {
  106. Transform gridTild = transform.GetChild(i);
  107. string[] nameStr = gridTild.name.Split('_');
  108. MapPos pos = new MapPos(int.Parse(nameStr[1]), int.Parse(nameStr[2]));
  109. mapTiles.Add(pos, gridTild.gameObject.GetOrAddComponent<MyTile>());
  110. }
  111. }
  112. public void ResetGridData()
  113. {
  114. for (int i = 0; i < transform.childCount; ++i)
  115. {
  116. Transform gridTild = transform.GetChild(i);
  117. string[] nameStr = gridTild.name.Split('_');
  118. MapPos pos = new MapPos(int.Parse(nameStr[1]), int.Parse(nameStr[2]));
  119. mapTiles[pos] = gridTild.gameObject.GetOrAddComponent<MyTile>();
  120. }
  121. }
  122. }