1. 程式人生 > >Unity A*尋路演算法(人物移動AI)

Unity A*尋路演算法(人物移動AI)

最近閒來無事,從網上看了一些大神的心得,再融合自己的體會,寫了一個簡單點的尋路演算法,廢話不多說,直接上程式碼

<Grid> usingUnityEngine; usingSystem.Collections; usingSystem.Collections.Generic; usingSystem; ///<summary> ///格子型別 ///</summary> publicenumGridType { //正常型別 Normal, //障礙物型別 Obstacle, //起點型別
Start, //終點型別 End } ///<summary> ///格子類(實現IComparable方便排序) ///</summary> publicclassGrid:IComparable { //格子座標x-y publicintx; publicinty; //格子A*三屬性f-g-h publicintf; publicintg; publicinth; //格子型別 publicGridTypetype; //格子的歸屬(父格子) publicGridparent; //構造賦值
publicGrid(intx,inty)        { this.x=x; this.y=y;        } ///<summary> ///實現排序介面方法 ///</summary> ///<returns>The to.</returns> ///<param name="obj">Object.</param> publicintCompareTo(objectobj)        { Gridgrid= (Grid)obj; if(this
.f<grid.f) { //升序 return-1;               } if(this.f>grid.f) { //降序 return1;               } return0;        } } <MyAStar> usingUnityEngine; usingSystem.Collections; usingSystem.Collections.Generic; publicclassMyAStar:MonoBehaviour { ///<summary> ///單例指令碼 ///</summary> publicstaticMyAStarinstance; // 白色格子 publicGameObjectreference; //格子陣列 publicGrid[,]grids; //格子陣列對應的參考物(方塊)物件 publicGameObject[,]objs; // 開啟和關閉列表 publicList<Grid>openList; publicList<Grid>closeList; //目標點座標 publicinttargetX; publicinttargetY; //起始點座標 publicintstartX; publicintstartY; //格子行列數 privateintrow; privateintcolomn; //結果棧 privateStack<string>parentList; //基礎物體 privateTransformplane; //流顏色引數 privatefloatalpha= 0; privatefloatincrementPer= 0; voidAwake()        { instance=this; plane=GameObject.Find("Plane").transform; parentList=newStack<string> (); openList=newList<Grid> (); closeList=newList<Grid> ();        } voidStart()        { Init(); StartCoroutine(Count());        } ///<summary> ///初始化操作 ///</summary> voidInit()        { //計算行列數 // 單位1,放大20倍,每行放20個格子 intx= (int)(plane.localScale.x* 20); inty= (int)(plane.localScale.z* 20); row=x; colomn=y; // 建立20*20的格子 grids=newGrid[x,y]; objs=newGameObject[x,y]; // 白色方塊起始座標(-2,0,-2) Vector3startPos= newVector3(plane.localScale.x*-2 , 0, plane.localScale.z*-2 ); //生成參考物體(Cube) for(inti= 0;i<x;i++) { for(intj= 0;j<y;j++) { grids[i,j] =newGrid(i,j); GameObjectitem= (GameObject)Instantiate(reference, newVector3(i* 0.5f, 0,j* 0.5f) +startPos, Quaternion.identity); item.GetComponentInChildren<Reference> ().x=i; item.GetComponentInChildren<Reference> ().y=j; objs[i,j] =item;                      }               }        } ///<summary> ///A*計算