游戏瞄准的一个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);
}
}
用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
- 游戏瞄准的一个AI算法
- 如何建立一个完整的游戏AI
- 游戏AI算法
- 游戏AI算法
- unity3D引擎:2D游戏自动瞄准算法实现
- 瞄准!干掉一个WP的站点
- 37行代码实现一个简单的打游戏AI
- 一个纸牌游戏的算法
- 积极重返中国的谷歌,这次瞄准了AI入口
- box2d关于投影预瞄准的算法推演过程
- 麻将游戏数据结构和AI算法
- 探讨棋牌类游戏AI算法
- 2048游戏-AI程序算法分析
- 游戏中的AI算法总结与改进
- 麻将游戏结构与AI算法
- 游戏AI的综合设计
- 游戏AI的综合设计
- 体育竞技游戏的团队AI
- word2vec
- vi/vim 快捷键
- MVC
- 开博第一天!
- 将指定的计数添加到该信号量中会导致其超过最大计数
- 游戏瞄准的一个AI算法
- ERROR:NgdBuild:604 - logical block 'Inst_edksub/proc_sys_reset_0' with type 'proc
- 巴菲特致股东的一封信:1995年
- LDAP安装配置
- 设计用户、角色、权限表
- 编程珠玑:位图法排序&搜索
- SVN修改用户名和密码
- oracle的Listener启动不了的解决方案
- 做个优秀的脚本苦工的路径