简单敌人AI——自动追踪汽车
这是在一次专业课的大作业里面用到的自动追踪玩家的汽车AI,追踪玩家控制的汽车,碰撞对玩家造成伤害。
为什么不使用unity的使用自带的Navigation寻路组件呢?因为如果使用unity的使用自带的Navigation寻路组件的话,很难模拟汽车的真实效果,还有轮胎的滚动和转弯,所以想了想得到了以下的解决方案。
我的水平不是很高,这只是对我学习的一个记录,一个简单的思路,希望可以帮助的一些有需要的、像我一样的新手程序猿。
汽车AI的基本原理
AI的原理的话就是,就是判断玩家控制的汽车在AI汽车的方位,从而决定AI的应该是加速还是减速,左转还是右转,最终的目的就是撞向玩家控制的汽车,对玩家造成伤害。
那怎么样判断玩家在AI的什么方位呢?这里需要用到两个角度。
如图所示,当∠A小于90°玩家在敌人右侧,当∠A大于90°,玩家在敌人左侧;当∠B小于90°玩家在敌人前侧,当∠B大于90°,玩家在敌人后侧侧。
当然敌人和玩家应该在同一个平面,如果有高度差的话,就要让两个向量的y轴值等于0,然后再计算两个向量的夹角。
汽车AI的代码
我采用了两个变量steerValue,motorValue,来动态的控制汽车的转向和前进。
当玩家在敌人的右侧,steerValue为0-1之间的数,当玩家在敌人的左侧,当steerValue为(-1)-0之间的数,具体的大小和∠A有关。当steerValue为正数时,敌人汽车就会向右边拐弯。当steerValue为负数时敌人汽车就会向左边拐弯。
当玩家在敌人的前侧,motorValue就会0.5-1之间,当玩家在敌人的后侧,motorValue就会0.3~0.5之间,具体大小和∠B角度有关。当前进的力越小,汽车转弯也会更加的方便,掉头之后玩家所在的位置成为了敌人的前方,motorValue就会0.5-1之间,AI就会加速追踪玩家。
代码:
void TrackPlayer()
{
//求出两向量之间的夹角,来判断玩家在左边还是在右边朝向哪边拐弯
float angleA = Vector3.Angle(transform.right, targetDir);
if (0 <= angleA && angleA < 85)
{
//在右边
//使用lerp可以使得steerValue有一个缓慢变化的过程
steerValue = Mathf.Lerp(steerValue, angleA / 90, 0.1f);
}