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 ...
随机推荐
- 网页生命周期-PageLoad事件
PageLoad事件的作用 l 页面载入是执行的处理命令 l 可以动态创建控件 l 可以设置现有控件的属性和状态 l 常用来设置数据库的连接 l 每次页面载入都会执行
- 【读书笔记】C#高级编程(一).NET体系结构
写在前面:从业两年来,一直停留在会用的阶段,而没有去仔细思考过为什么这么用,之前也大致扫过<c#高级编程>一书,这次想借一袭脑海中的冲动,再次好好仔细过过这本书,夯实基础,温故知新. 一. ...
- The Dangers of the Large Object Heap(转载,LOH内存碎片情景重现)
原文地址:https://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/ You'd h ...
- 编程提取字符串"Java is a programming language"中的各个单词,并打印输出。
import java.lang.String; import java.util.StringTokenizer; public class StringGetWord{ /* 编程提取字符串&qu ...
- Facade模式实现文件上传(Flash+HTML5)
一.前言 确定了渐进式增强的上传方式,接下来我们需要将上传功能从具体的业务逻辑中剥离出来,作为公共组件供业务层调用.这就要求我们必须对业务层隐藏上传细节,只暴露统一的上传API.这时候大家是不是跟我一 ...
- cf1064D. Labyrinth(01BFS)
题意 题目链接 给出一个\(n \times m\)的网格,给出起始点,要求向左走不超过\(L\)步,向右走不超过\(R\)步,求出能遍历到哪些点 Sol 一个很直观的想法,BFS的时候状态里记录下还 ...
- maven项目的创建
·做了两年多Java Web一多半的项目都是SSM架构的,只搭建过两次,趁着周末做个总结整理. Eclipse搭建Maven项目 1.new project --> Maven project ...
- angular监听移动端键盘的弹起和收回
页面的提交按钮采用的是固定定位在页面的底部,键盘弹出后,提交按钮紧挨着键盘的上方,输入框获得焦点后,键盘弹出,并且输入框回自动定位上方的空白处,此时由于键盘上方固定定位的提交按钮的原因有可能会遮挡住获 ...
- 超简便的ListView中Adapter的写法
对于 ListView 的使用,他有两个重点的部分,一个是下拉刷新和加载更多,这个今天我们不讲,另外一个是 BaseAdapter 的使用,这个是今天的主角,BaseAdapter 中又有 ViewH ...
- String, StringBuffer and StringBuilder
一 String 概述: String 被声明为 final,因此它不可被继承. 在 Java 8 中,String 内部使用 char 数组存储数据. public final class Stri ...