转载:http://www.gopedu.com/article/736
在前面发表了一篇《A 星寻路》,但是在那篇文章没有具体讲怎么使用,导致一些朋友密我,其实 A 星已经有很多成熟的插件,这主要看大家的选择了,在前面没有讲 A* 配置文件的生成,这儿我就详细的介绍了一下,可能大家也有很多不同的方法,但这儿我是通过射线检测来生成配置文件的,另外在这个例子中,我也对摄像机的移动以及缩放有一些优化。
生成 A* 寻路配置文件的原理是通过射线来检测物体的标签,如果标签是不可以行走(在这儿是 Box),就把格子位置(x,y)记为 1,否则记为 0。
测试的场景来自网络,如图:
然后我们把场景中不可以行走的地方用立方体遮挡起来,如图:
设置好遮挡之后,我们给这些立方体添加一个标签(Tag),主要是方便射线的检测,如图:
最后我们新建立一个类,取名:SceneDataController.cs,根据需要,这儿直接输出配置文件,类的代码如下:
using UnityEngine; 02 using System.Collections; 03 using System.Text; 04 05 /// <summary> 06 /// 场景格子配置生成文件 07 /// </summary> 08 public class SceneDataController : MonoBehaviour 09 { 10 public int gridCols; 11 public int gridRows; 12 13 public Camera mainCamera; 14 15 void Awake() 16 { 17 StringBuilder stringBuilder = new StringBuilder (); 18 stringBuilder.Append ("private string gridText = \""); 19 20 for (int i = 0; i < this.gridCols; i ++) 21 { 22 for(int j = 0; j < this.gridRows; j ++) 23 { 24 if(!ValidWalkable(j + 0.5f, i + 0.5f)) 25 { 26 stringBuilder.Append("1"); 27 }else{ 28 stringBuilder.Append("0"); 29 } 30 } 31 if(i != this.gridCols - 1) 32 { 33 stringBuilder.Append("\"\n + \""); 34 } 35 } 36 37 stringBuilder.Append ("\";"); 38 39 Debug.Log (stringBuilder.ToString ()); 40 } 41 42 private bool ValidWalkable(float posX, float posZ) 43 { 44 RaycastHit raycastHit = new RaycastHit (); 45 if (Physics.Raycast (new Vector3 (posX, 100f, posZ), Vector3.down, out raycastHit)) 46 { 47 if(raycastHit.collider.tag == "Box") 48 { 49 return false; 50 } 51 } 52 return true; 53 } 54 }
然后把这个 SceneDataController.cs 挂载到一个对象上,并设置好相关属性,如图:
运行游戏我们就可以把配置文件生成出来了,有了配置文件,我们就可以直接在 A 星寻路中使用了,限于篇幅,后面的就不仔细说明了,大家可以下载源码自行查看,最终效果如图: