查看: 2816|回复: 8
打印 上一主题 下一主题

[项目源码] 游戏瞄准的一个AI算法

[复制链接]

2

主题

3

听众

303

积分

设计实习生

Rank: 2

纳金币
18
精华
0

最佳新人

跳转到指定楼层
楼主
发表于 2014-10-7 11:27:11 |只看该作者 |倒序浏览
在很多飞行射击类游戏里,都有敌人向玩家自动瞄准并开火的功能。在这里本人用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);
}
}


分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

33

主题

1

听众

2680

积分

中级设计师

Rank: 5Rank: 5

纳金币
559
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2014-10-8 08:43:49 |只看该作者
不错不错
回复

使用道具 举报

0

主题

1

听众

1402

积分

助理设计师

Rank: 4

纳金币
267
精华
0

活跃会员

板凳
发表于 2014-10-8 10:16:01 |只看该作者
transform.up = target.position - transform.position
回复

使用道具 举报

wucnj    

1

主题

1

听众

3160

积分

中级设计师

Rank: 5Rank: 5

纳金币
1065
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

地板
发表于 2014-10-9 10:06:18 |只看该作者
感谢分享!!!
回复

使用道具 举报

hyui    

1

主题

2

听众

6671

积分

高级设计师

Rank: 6Rank: 6

纳金币
2715
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

5#
发表于 2014-10-9 16:44:13 |只看该作者
Thanks for sharing this !
回复

使用道具 举报

0

主题

3

听众

2200

积分

中级设计师

Rank: 5Rank: 5

纳金币
0
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

6#
发表于 2014-10-9 21:06:38 |只看该作者
新人学习了,谢谢分享
回复

使用道具 举报

0

主题

2

听众

4092

积分

中级设计师

Rank: 5Rank: 5

纳金币
530
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

7#
发表于 2014-10-10 06:43:59 |只看该作者
Thanks for sharing
回复

使用道具 举报

U3DZQ    

0

主题

1

听众

120

积分

设计实习生

Rank: 2

纳金币
45
精华
0

最佳新人

8#
发表于 2014-11-15 10:16:40 |只看该作者
感谢分享!
回复

使用道具 举报

0

主题

1

听众

939

积分

初级设计师

Rank: 3Rank: 3

纳金币
330
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

9#
发表于 2014-12-10 17:19:37 |只看该作者
感觉挺好的                     
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-15 00:34 , Processed in 0.120292 second(s), 28 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部