游戏瞄准的一个AI算法
2015-03-02 11:21
197 查看
在很多飞行射击类游戏里,都有敌人向玩家自动瞄准并开火的功能。在这里本人
用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);
}
}
用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);
}
}
相关文章推荐
- 人工智能(AI)与游戏算法http://www.j2megame.cn/forumdisplay.php?fid=14
- 一个建立完整游戏AI的事例:第二部分(作者:Geoff Howland)
- 一个猜数字游戏的算法
- 【游戏编程】AI-迷宫寻路算法-深度优先搜索和广度优先搜索
- 一个模仿三维的赛车游戏的算法,白话讲解--------
- 一个猜拳游戏的算法设计
- 【游戏编程】AI-迷宫寻路算法-深度优先搜索和广度优先搜索
- 如何建立一个完整的游戏AI
- 编程游戏:划拳机器人比赛-{ 咱们园子是否应该设立一个算法挑战/编程竞赛的平台? }
- 一个硬币移动游戏的求解算法
- win8 开发之旅(9) --五子棋游戏开发 一个屌丝程序员谈ai
- 一个建立完整游戏AI的事例:第一部分(作者:Geoff Howland)
- 怎么编一个五子棋游戏?(带ai)
- 一个找亲戚游戏,引发了一场算法的学习——并查集
- 【AI】A star(A 星)算法在手机游戏开发中的使用