游戏瞄准的一个AI算法

来源:互联网 发布:linux 启动进程 编辑:程序博客网 时间:2024/05/07 10:47
在很多飞行射击类游戏里,都有敌人向玩家自动瞄准并开火的功能。在这里本人

用unity3d引擎新版本的2D系统来实现这个功能。

首先,让我们了解一下原理的理论知识。我们可以把敌人和玩家放到一个坐标系

中,敌人是坐标是的原点((0,0)点),玩家是在这个坐标系中的一点。然后把二

者在坐标系中构建成直角三角形来计算坐标系的X轴旋转多少角度指向玩家。

现在假设玩家分别放在坐标系的四个象限中,假设第一象限坐标为(X,Y),假设第二

象限坐标为(-X,Y),假设第三象限坐标为(-X,-Y),假设第四象限坐标为(X,-

Y)。分别求出它们的角度。

tan角度=(敌人坐标Y-玩家坐标Y)/(敌人坐标X-玩家坐标X).

要用代码求出角度,就要对上面的值进行反正切。注意反正切之后的值是弧度值不

是角度值。我们还要把它进行弧度转角度操作。代码如下。

angle =Mathf.Rad2Deg*Mathf.Atan ((transform.position.y- m_player.position.y) / (transform.position.x - m_player.position.x));

当玩家在第一象限时,旋转角度为正数。当玩家在第四象限时,旋转角度为负数。注

意,这里的旋转角度是敌人坐标X轴指向玩家所要旋转的角度。在unity中一般是把

Y轴为向上方向。所以我们要Y轴指向玩家就要让敌人顺时针旋转90°。也就是让角

度值减90°。
angle=angle-90;

当玩家在第三象限时,旋转角度为正数。当玩家在第二象限时,旋转角度为负数。注

意,这里的旋转角度是敌人坐标-X轴指向玩家所要旋转的角度。我们要Y轴指向玩家

就要让敌人逆时针旋90°。也就是让角度值加90°。
angle=angle+90;

要判断玩家在坐标系的一四象限还是二三象限很简单。敌人X坐标减去玩家X坐标小于

0时,玩家在一四象限。否则在二三象限。
if(transform.position.x - m_player.position.x < 0)
angle=angle-90;
else
angle=angle+90;

求出了旋转角度,下面我们来设置物体的自身欧拉角。由于我们要旋转的是XY轴构成

的平面。我们就要以Z轴为旋转轴来旋转。使物体绕自身坐标系绕Z轴,旋转angle度。
transform.localEulerAngles=new Vector3(0,0,angle);

这样敌人就可以根据玩家的位置自动瞄准了。最终代码如下;
using UnityEngine;
using System.Collections;

public class enemy : MonoBehaviour {
//申请一个变量存储角度值。
private float angle;
//申请一个变量存储玩家位置。
public Transform m_player;
//申请一个变量存储gun游戏物体的prefab。
public Transform gun;

void Start () {

}

void Update () {
//计算角度
angle =Mathf.Rad2Deg*Mathf.Atan ((transform.position.y - m_player.position.y) / (transform.position.x - m_player.position.x));

//判断角度所在象限,并进行修正。
if (transform.position.x - m_player.position.x < 0)
angle=angle-90;
else
angle=angle+90;

//设置物体的自身欧拉角,是物体绕自身坐标系在Z轴,旋转Z度。
transform.localEulerAngles=new Vector3(0,0,angle);
//生成gun物体。
//Instantiate (gun, transform.position, transform.rotation);
}
}
0 0