using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; [System.Serializable] public class MyGridMap : MonoBehaviour { private const int V = 0; public static int Row; public static int Col; public static int W = 20; public static int H = 20; public struct MapPos { public MapPos(int r,int c) { this.Row = r; this.Col = c; } int Row; int Col; } public Dictionary mapTiles = new Dictionary(); public Dictionary tileBox = new Dictionary(); private void Awake() { } // Start is called before the first frame update void Start() { } public void AddMyGrid(int r,int c,float w, float h) { GameObject box = GameObject.CreatePrimitive(PrimitiveType.Cube); box.name = "grid_" + r.ToString() + "_" + c.ToString(); box.transform.parent = this.transform; box.transform.SetLocalPositionY(0); box.transform.SetLocalPositionX(w * c); box.transform.SetLocalPositionZ(h * r); box.transform.localScale = new Vector3(w, 20, h); mapTiles.Add(new MapPos(r, c), box.GetOrAddComponent()); box.GetOrAddComponent().isTrigger = true; tileBox.Add(new MapPos(r, c), box.GetOrAddComponent()); } public void OptimizeTerrain(GameObject obj) { ResetGridData(); for (int i = 0; i < obj.transform.childCount; ++i) { Terrain t = obj.transform.GetChild(i).GetComponent(); if(!t) { continue; } t.heightmapPixelError = 200; float offsetX = (int)t.transform.position.x - this.transform.position.x; float offsetZ = (int)t.transform.position.z - this.transform.position.z; MapPos gridPos = new MapPos((int)offsetZ / H, (int)offsetX / W); mapTiles[gridPos].AddSplitTerrain(t); } } public void MateObjToGrid(GameObject obj) { RefresGridData(); for (int i = 0; i < obj.transform.childCount; ++i) { Transform element = obj.transform.GetChild(i); float offsetX = (int)element.transform.position.x - this.transform.position.x; float offsetZ = (int)element.transform.position.z - this.transform.position.z; MapPos gridPos = new MapPos((int)offsetZ / H, (int)offsetX / W); mapTiles[gridPos].AddElement(element.gameObject); } } public void AddSubObjToGrid(GameObject obj) { for (int i = 0; i < obj.transform.childCount; ++i) { Transform element = obj.transform.GetChild(i); float offsetX = Mathf.Abs((int)element.transform.localToWorldMatrix.GetPosition().x - this.transform.position.x); float offsetZ = Mathf.Abs((int)element.transform.localToWorldMatrix.GetPosition().z - this.transform.position.z); MapPos gridPos = new MapPos((int)offsetZ / H, (int)offsetX / W); mapTiles[gridPos].AddElement(element.gameObject); } } public void AddOneObjToGrid(GameObject obj) { obj.SetActive(false); Transform element = obj.transform; float offsetX = Mathf.Abs((int)element.transform.localToWorldMatrix.GetPosition().x - this.transform.position.x); float offsetZ = Mathf.Abs((int)element.transform.localToWorldMatrix.GetPosition().z - this.transform.position.z); MapPos gridPos = new MapPos((int)offsetZ / H, (int)offsetX / W); if (mapTiles.ContainsKey(gridPos)) { mapTiles[gridPos].AddElement(element.gameObject); } else { RefresGridData(); } } public void RefresGridData() { mapTiles.Clear(); for (int i = 0; i < transform.childCount; ++i) { Transform gridTild = transform.GetChild(i); string[] nameStr = gridTild.name.Split('_'); MapPos pos = new MapPos(int.Parse(nameStr[1]), int.Parse(nameStr[2])); mapTiles.Add(pos, gridTild.gameObject.GetOrAddComponent()); } } public void ResetGridData() { for (int i = 0; i < transform.childCount; ++i) { Transform gridTild = transform.GetChild(i); string[] nameStr = gridTild.name.Split('_'); MapPos pos = new MapPos(int.Parse(nameStr[1]), int.Parse(nameStr[2])); mapTiles[pos] = gridTild.gameObject.GetOrAddComponent(); } } }