using Sirenix.OdinInspector; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace Ether { public class AStarTest : SerializedMonoBehaviour { public GameObject gridList; public GameObject gridItemTemp; public Sprite normalGrid; public Sprite startGrid; public Sprite obstacleGrid; public Sprite targetGrid; public Sprite pathGrid; public int width = 14; public int height = 9; public ButtonEx startBtn; public ButtonEx targetBtn; public ButtonEx obstacleBtn; public ButtonEx buildBtn; public ButtonEx resetBtn; private ItemData start; private ItemData target; private AStar astar; List obstacleList = new List(); ClickType curClickType = ClickType.obstacle; private void Start() { gridItemTemp.SetActive(false); GenerateAstarGrid(); startBtn.OnClick.AddListener(() => { curClickType = ClickType.start; }); targetBtn.OnClick.AddListener(() => { curClickType = ClickType.target; }); obstacleBtn.OnClick.AddListener(() => { curClickType = ClickType.obstacle; }); buildBtn.OnClick.AddListener(() => { if (astar == null) { astar = new AStar(width, height, obstacleList); } else { astar.Reset(width, height, obstacleList); } foreach (var itemData in itemList) { if (itemData.isPathPos) { itemData.img.sprite = normalGrid; } } Stack stepList = new Stack(); astar.BuildPath(start.pos, target.pos, stepList); if (stepList.Count > 0) { foreach (var step in stepList) { foreach (var itemData in itemList) { if (itemData.pos == step) { if (itemData.pos != start.pos && itemData.pos != target.pos) { itemData.isPathPos = true; itemData.img.sprite = pathGrid; } } } } } }); resetBtn.OnClick.AddListener(() => { GenerateAstarGrid(); }); } enum ClickType { start, target, obstacle, } class ItemData { public GameObject item; public Image img; public Vector2Int pos; public bool isPathPos; } List itemList = new List(); private void GenerateAstarGrid() { foreach (var itemData in itemList) { itemData.item.SetActive(false); } gridList.SetSize(gridItemTemp.GetSize() * new Vector2(width, height)); int index = 0; for (int i = 0; i < height; i++) { for (int k = 0; k < width; k++) { ItemData itemData; if (index < itemList.Count) { itemData = itemList[index]; itemData.pos = new Vector2Int(k, i); itemData.isPathPos = false; } else { GameObject item = Instantiate(gridItemTemp, gridList.transform); item.name = index.ToString(); itemData = new ItemData() { item = item, img = item.GetComponent(), pos = new Vector2Int(k, i) }; itemList.Add(itemData); } itemData.item.SetActive(true); itemData.img.sprite = normalGrid; ButtonEx btn = itemData.item.GetComponent(); btn.OnClick.RemoveAllListeners(); btn.OnClick.AddListener(() => { Debug.Log("点击了pos:" + itemData.pos); switch (curClickType) { case ClickType.start: if (start != null) { start.img.sprite = normalGrid; } start = itemData; start.img.sprite = startGrid; break; case ClickType.target: if (target != null) { target.img.sprite = normalGrid; } target = itemData; target.img.sprite = targetGrid; break; case ClickType.obstacle: if (obstacleList.Contains(itemData.pos)) { obstacleList.Remove(itemData.pos); itemData.img.sprite = normalGrid; } else { obstacleList.Add(itemData.pos); itemData.img.sprite = obstacleGrid; } break; default: break; } }); index++; } } } //[Button("开始寻路显示")] //public void StartAStar() //{ // Stack stepList = new Stack(); // astar.BuildPath(start, target, stepList); // if (stepList.Count > 0) // { // foreach (var step in stepList) // { // displayTileMap.SetTile((Vector3Int)(step), displayTile); // } // } //} //private void OnDrawGizmos() //{ // Gizmos.color = Color.red; // for (int i = 0; i <= width; i++) // { // Gizmos.DrawLine(new Vector3(0, i, 0), new Vector3(height, i, 0)); // } // for (int i = 0; i <= height; i++) // { // Gizmos.DrawLine(new Vector3(i, 0, 0), new Vector3(i, width, 0)); // } //} } }