Unity人工智能实战(原书第2版)
上QQ阅读APP看书,第一时间看更新

2.3 用可视点法表示世界

可视点法是另一种广泛用于表示世界的技术,基于遍布在有效导航区域内的点位,这些点位可能是手动或者通过脚本自动化放置的。我们要通过脚本自动连接手动放置的点位。

准备工作

就像前一种表示法一样,在继续下一步之前,我们要做一些准备工作:

▪ 把Edge类放在与Graph类相同的文件中。

▪ 定义Graph类的GetEdges函数。

▪ 建立Vertex类。

场景中的顶点对象必须附加一个碰撞器组件,还要指定Vertex标签。建议用统一的Sphere对象表示它们。

操作步骤

现在创建图表示类以及自定义的Vertex类:

1. 创建继承自VertexVertexVisibility类:

2. 定义FindNeighbours函数,用于将连接各顶点的过程自动化:

3. 遍历所有对象,发射一条射线,以检测每个对象是否完全可见,如果可见则把它添加到邻接顶点列表中:

4. 创建GraphVisibility类:

5. 编写Load函数,用于把顶点连接起来:

6. 定义GetNearestVertext函数:

7. 定义GetNeighbours函数:

8. 重写GetEdges函数:

运行原理

父类GraphVisibility在场景中对每个顶点进行索引,然后在每个顶点上使用FindNeighbours函数。这是为了构建图并把节点之间连接起来,而完全不需要用户参与,比把可见的点放置在用户认为合适的地方要好。同样,两个点之间的距离被分配为相应边的代价。

延伸阅读

让一个点对另一个点可见,以便让图连接起来很重要。这种方法也适用于构建智能图(例如楼梯和悬崖)。只需要把Load函数移动到一个编辑器可见的类中,以便在编辑模式下调用,然后修改或删除相应的边,就可以达到预期效果。

假如你感觉错过了什么,参见2.3节的“准备工作”,你就能更好地理解开头部分了。

关于自定义编辑器、编辑器脚本化,以及如何在编辑模式下执行代码的更多信息,请参阅Unity的文档,网址如下:

http://docs.unity3d.com/ScriptReference/Editor.html

http://docs.unity3d.com/ScriptReference/ExecuteInEditMode.html

http://docs.unity3d.com/Manual/PlatformDependentCompilation.html