using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; public class JiugongGridSegmentation : MonoBehaviour { /// /// 地形 /// public Terrain Terrain; /// /// 角色Transform /// public Transform Target; /// /// 角色位置 /// public Vector2 PlayerPos; /// /// 当前实时位置标号 /// public Vector2 CalPos; /// /// 格子尺寸 /// public Vector2 GridSize = new Vector2(10, 10); /// /// 当前所在标号 /// public byte[] CenterIndex = new byte[2]; /// /// 当前所在格子 /// public Rect CurrentRect; /// /// 格子列表 /// public List GridRects = new List(); /// /// 格子标号与位置信息 /// public Dictionary CellRects = new Dictionary(); private Coroutine SelfInfoCoroutine; //更新坐标协程 private Vector2 TerrainPosition; //地形坐标 private float XCount; //X方向格子数量 private float ZCount; //Z方向格子数量 // Use this for initialization void Start () { Terrain = FindObjectOfType(); TerrainPosition = new Vector2(Terrain.GetPosition().x, Terrain.GetPosition().z); Generate(); SelfInfoCoroutine = StartCoroutine(UpdateSelfPosInfo()); } // Update is called once per frame void Update() { if (Target != null) { PlayerPos = new Vector2(Target.position.x, Target.position.z); CalPos = new Vector2(Mathf.FloorToInt((PlayerPos.x - TerrainPosition.x) / 10), Mathf.FloorToInt((PlayerPos.y - TerrainPosition.y) / 10)); } } void OnDestroy() { StopCoroutine(SelfInfoCoroutine); } /// /// 生成格子 /// public void Generate() { float xwidth = Terrain.terrainData.size.x; float zwidth = Terrain.terrainData.size.z; Vector2 terrainPosxz = new Vector2(TerrainPosition.x, TerrainPosition.y); //起始位置 XCount = xwidth / GridSize.x; ZCount = zwidth / GridSize.y; for (int i = 0; i < ZCount; i++) { for (int j = 0; j < XCount; j++) { Vector2 pos = new Vector2(terrainPosxz.x + GridSize.x * j, terrainPosxz.y + GridSize.y * i); Rect rect = new Rect(pos, GridSize); GridRects.Add(rect); CellRects.Add(new byte[2] { ((byte)j), ((byte)i) }, rect); #if UNITY_EDITOR TestCube(pos); #endif } } } /// /// 生成测试方块 /// /// private void TestCube(Vector2 pos) { GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube); Vector3 position = new Vector3(pos.x, 0, pos.y); position.y = Terrain.activeTerrain.SampleHeight(position); cube.transform.position = position; cube.transform.localScale = Vector3.one; cube.transform.SetParent(this.transform); } /// /// 获取自身位置信息 /// public void GetSelfPosInfo() { if (Target == null) return; Vector2 currentPos = new Vector2(Target.position.x, Target.position.z); for (int i = 0; i < GridRects.Count; i++) { //得到当前Rect if (GridRects[i].Contains(currentPos)) { CurrentRect = GridRects[i]; //找到当前Rect对应的序号 var current = CellRects.FirstOrDefault(rect => rect.Value.Equals(CurrentRect)); CenterIndex = current.Key; break; } } } public float GetTerrainHeight(Vector3 pos) { return Terrain.SampleHeight(pos); } /// /// 更新位置协程 /// /// IEnumerator UpdateSelfPosInfo() { while (true) { yield return new WaitForSeconds(1); GetSelfPosInfo(); } } }