unity3D引擎:2D游戏自动瞄准算法实现
转:http://blog.csdn.net/naitu/article/details/39555373
在很多飞行射击类游戏里,都有敌人向玩家自动瞄准并开火的功能。在这里本人用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 < ) angle=angle-; else angle=angle+; //设置物体的自身欧拉角,是物体绕自身坐标系在Z轴,旋转Z度。 transform.localEulerAngles=new Vector3(,,angle); //生成gun物体。 //Instantiate (gun, transform.position, transform.rotation); } }
unity3D引擎:2D游戏自动瞄准算法实现的更多相关文章
- Unity3D 2D游戏中寻径算法的一些解决思路
需求 unity3d的3d开发环境中,原生自带了Navigation的组件,可以很便捷快速的实现寻路功能.但是在原生的2d中并没有相同的功能. 现在国内很多手机游戏都有自动寻路的功能,或者游戏中存在一 ...
- 《Unity3D/2D游戏开发从0到1(第二版本)》 书稿完结总结
前几天,个人著作<Unity3D/2D游戏开发从0到1(第二版)>经过七八个月的技术准备以及近3个月的日夜编写,在十一长假后终于完稿.今天抽出一点时间来,给广大热心小伙伴们汇报一下书籍概况 ...
- 【2D游戏引擎】WIP反思
WIP(Working In Progress)是我初学游戏引擎开发时候开发的一个2D游戏引擎,当时计划为它实现类似Unity一样的编辑器,具有和Unity相似的工作流,但是由于水平不够,走了很多弯路 ...
- 发布HTML5 2D游戏引擎YEngine2D
关于YEngine2D YEngine2D是一个开源的.采用HTML5技术和Javscript语言创建的2D游戏框架,用来构建web二维游戏. GitHub地址 最新版本 v0.1.2 浏览器支持 C ...
- 配置JDKAndroid 2D游戏引擎AndEngine
配置JDKAndroid 2D游戏引擎AndEngine JDK全称为Java Development Kit(也即Java开发包),是用于支持Java 编程的基础.无论是什么编程,只要用到了Java ...
- 【转】 各种 基于Unity3d 引擎的Android游戏优化 (drawcall)
合并纹理,减少贴图数量,合并网格,ui上减少不必要的层级叠加关系等 1. 更新不透明贴图的压缩格式为ETC 4bit,因为android市场的手机中的GPU有多种,每家的GPU支持不同的压缩格式 ...
- unity3d 2d游戏制作的模式
经过了4个月不懈的努力,我和图灵教育合作的这本3D游戏开发书预计下个月就要出版了.这里MOMO先打一下广告,图灵的出版社编辑成员都非常给力,尤其是编辑小花为这本书付出了很大的努力,还有杨海玲老师, ...
- 关于《Unity3D/2D游戏开发从0到1》书籍再版说明
关于<Unity3D/2D游戏开发从0到1>第一版本在2015年7月1日全国发行,累计得到不少国内高校教师.培训机构的好评.但是由于Unity官方对于技术不断的升级与版本的快速迭代,基于U ...
- 《Unity3D/2D游戏开发从0到1》正式出版发行
<Unity3D/2D游戏开发从0到1>正式出版发行 去年个人编写的Unity书籍正式在2015年7月正式发行,现在补充介绍一下个人著作.书籍信息: 书籍的名称: <Uni ...
随机推荐
- Oracle关于All和Any
简单的说 All等价于N个And语句,Any等价于N个or语句.
- NetCDF 共享软件 中文
NetCDF 共享软件 转载 在 Models-3 模式中,使用的数据存取接口称为 I/O API,其实就是 NetCDF 文件格式.而由于我们需要了解 Models-3 输出档案的数据情况,因此 ...
- Zoj 3870——Team Formation——————【技巧,规律】
Team Formation Time Limit: 3 Seconds Memory Limit: 131072 KB For an upcoming programming contes ...
- jQuery 文本插入和标签移动方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 记升级一次的http2学习
首先,就先对比下http2和http1.X的区别和升级它的优势吧. 在 HTTP .X 中,为了性能考虑,我们会引入雪碧图.将小图内联.使用多个域名等等的方式.这一切都是因为浏览器限制了同一个域名下的 ...
- vue——介绍和使用
一.vue介绍 vue官网说:Vue.js(读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式的JavaScript框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计. ...
- 用JQ帮你实现动画导航 手风琴是导航与下拉导航
1.手风琴式导航,既可以适用于移动端也可使用与PC端 <!DOCTYPE html> <html> <head> <meta charset="UT ...
- 使用Gulp压缩HTML和CSS
---恢复内容开始--- 今天我么继续压缩,但是今天的压缩和之前的不同了!可以说是第二种方法吧! 今天用Gulp来压缩HTML和CSS! 1.首先我们先来安装GUlp:先安装全局gulp 2.然后是开 ...
- asp.net学习视频大全(共800集)
今天在网上找asp.net学习视频时,发现了一些好的学习资源,记录一下供大家学习. 资料名称 下载地址 <ASP.NET4.0从入门到精通>随书教学视频 http://down.51ct ...
- stateless函数里面的参数问题
UI组件文件: function Selector({ status1, status2, status3 }){ return (<div><span>demo</sp ...