[Unity3D]赛车游戏开发 - 计算机对手AI设计方案

 自己先激动下我的计算机对手终于有点智商了,自己会跑了。然后接下来写教程-.-

 

首先申明,这个车的运动并不是简单的轨迹运动,他的AI是直接加在玩家控制引擎上的,我要做到的就是单一通用脚本,并且电脑没有作弊(想起星际电脑的AI就晕,电脑一开始就有给了自己很多钱,只不过在装他没钱而已)。

 

这是我写的汽车的通用脚本的public属性段,AI那项不钩就是玩家控制的,勾选了就是电脑控制。(顺便炫下我的汽车引擎,那可是按真实汽车引擎转速和齿轮箱比例转换后作用到轮子上的。)嘿嘿,老外公开的代码都没有这些吧,我的齿轮箱是可以设置的,便于以后做改装车游戏用。

回归原题,写AI:

 

1.先给地图加上路径点(WayPoints)

电脑不是你,就算不是电脑,她也不一定知道你想让他往哪里开,开的赛道怎么样,这就需要一些路径提示。想起来以前玩三角洲的那个小地图,绿色的路径线指着目标方向,到了一个目标后继续朝下一个目标指去。OK,就这么做。

 

首先得想到的是路径是要有顺序的,所以每个路径点都必须要有个index属性来标识他在整个路径里的先后关系。(交代清楚下,有些人可能看到w这个字以为我是哪里下的路径组件,可以跟你说,目前没有好用的路径组件,再说了路径点只是个坐标而已(可以创建Empty Object做,因为他就只有坐标信息),没必要这个也copy人家吧,这个w图标是官方的FPS教程里拿出来用的,自己懒得画)。这里W图标和绿线是通过Gizmos,就是开发环境标记,不懂得可以参看我另外一篇日志,这里仅仅是为了开发时候自己看得舒服点而已,编译完运行是不会有的。其实路径点只需要记录2个信息:坐标和索引(index),所以路径的脚本(类)里也必须有这两样。然后要有一个函数把地图上所有路径点整合起来,重点就是完成下面这个功能

var objects : Object[] = FindObjectsOfType(WayPoints);

之后再把当前脚本所在的路径点索引前后两个连接起来,这里用到一个Physics.Linecast()判断,链接时候测试下两个路径点连线中间有碰到其他物体,没有就画绿线,有就画红线(这个可是做AI寻径很重要的函数,判断AI能不能走过去或者判断电脑能不能看到某样东西的时候非常好用)。然后路径点就设置好了。

 

有关于Gizmos部分,参看我另外一篇日志,这里不浪费文字了。

 

2.计算机AI获取下一个目标路径点

这部很简单,在汽车引擎脚本里专门加个AI函数来处理,拿个变量记录下路径索引,到达一个后自动指向下一个就好了(到达最后一个index再回到0)。注意的是这里最好是个范围值,就是判断下车离这个点distance小于某个数值就算踩到这个点了,因为汽车可能拐弯没来得及从点旁边开过去了。

 

3.把控制权交给AI

我们直接在键盘控制那里设个判断,如果AI=true,那就不用等待用户的键盘输入了,直接交给AI函数处理,既然已经知道下一个点应该往哪里走了,获取下下个点坐标,转换为车的本地坐标系,然后判断他的x轴位置,如果大于0就说明点偏汽车右手边,那就需要向右转弯,反之亦然。我写到这里时候也卡了一下下,本来以为几何里有什么运算可以知道点和向量的位置关系,后来发现没办法知道,那最简单就是把点转换为汽车本地坐标系(因为本地坐标系最好判断,车的forward方向就是z轴,right方向就是x轴,up方向就是y轴)。这里的拐弯当然也要设个范围值,不然的话车一拐就过头了,你就会发现AI拼命在摇头了。然后就是让车控制你的键盘输入前进咯。

因为是AI替代了键盘控制而已,至于车怎么开,齿轮箱怎么变换档,刹车怎么处理这个都是汽车引擎封装好的,AI不需要知道,也没有必要知道,他们只要知道加速要按向前键,拐弯要按左右键就可以了。

 

提醒下物体在世界坐标系的坐标转换为本个物体的本地坐标系函数:

var nextPointofLocal = transform.InverseTransformPoint(nextPointPosition);

 

4.更聪明的AI

受别人提醒,见到别人的车要懂得躲避的,甚至以后要让电脑懂得漂移。

躲避方法很简单,一样可以用判断车到路径点中间有没有其他障碍物(其他车辆或者物体),有的话往左或往右转弯就可以了。或者还有其他想法,各位看官自己发挥了。

你可能感兴趣的:(Unity3D)