123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- 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<MapPos, MyTile> mapTiles = new Dictionary<MapPos, MyTile>();
- public Dictionary<MapPos, Collider> tileBox = new Dictionary<MapPos, Collider>();
- 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<MyTile>());
- box.GetOrAddComponent<BoxCollider>().isTrigger = true;
- tileBox.Add(new MapPos(r, c), box.GetOrAddComponent<BoxCollider>());
- }
- public void OptimizeTerrain(GameObject obj)
- {
- ResetGridData();
- for (int i = 0; i < obj.transform.childCount; ++i)
- {
- Terrain t = obj.transform.GetChild(i).GetComponent<Terrain>();
- 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<MyTile>());
- }
- }
- 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<MyTile>();
- }
- }
- }
|