转: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游戏自动瞄准算法实现的更多相关文章

  1. Unity3D 2D游戏中寻径算法的一些解决思路

    需求 unity3d的3d开发环境中,原生自带了Navigation的组件,可以很便捷快速的实现寻路功能.但是在原生的2d中并没有相同的功能. 现在国内很多手机游戏都有自动寻路的功能,或者游戏中存在一 ...

  2. 《Unity3D/2D游戏开发从0到1(第二版本)》 书稿完结总结

    前几天,个人著作<Unity3D/2D游戏开发从0到1(第二版)>经过七八个月的技术准备以及近3个月的日夜编写,在十一长假后终于完稿.今天抽出一点时间来,给广大热心小伙伴们汇报一下书籍概况 ...

  3. 【2D游戏引擎】WIP反思

    WIP(Working In Progress)是我初学游戏引擎开发时候开发的一个2D游戏引擎,当时计划为它实现类似Unity一样的编辑器,具有和Unity相似的工作流,但是由于水平不够,走了很多弯路 ...

  4. 发布HTML5 2D游戏引擎YEngine2D

    关于YEngine2D YEngine2D是一个开源的.采用HTML5技术和Javscript语言创建的2D游戏框架,用来构建web二维游戏. GitHub地址 最新版本 v0.1.2 浏览器支持 C ...

  5. 配置JDKAndroid 2D游戏引擎AndEngine

    配置JDKAndroid 2D游戏引擎AndEngine JDK全称为Java Development Kit(也即Java开发包),是用于支持Java 编程的基础.无论是什么编程,只要用到了Java ...

  6. 【转】 各种 基于Unity3d 引擎的Android游戏优化 (drawcall)

     合并纹理,减少贴图数量,合并网格,ui上减少不必要的层级叠加关系等   1. 更新不透明贴图的压缩格式为ETC 4bit,因为android市场的手机中的GPU有多种,每家的GPU支持不同的压缩格式 ...

  7. unity3d 2d游戏制作的模式

      经过了4个月不懈的努力,我和图灵教育合作的这本3D游戏开发书预计下个月就要出版了.这里MOMO先打一下广告,图灵的出版社编辑成员都非常给力,尤其是编辑小花为这本书付出了很大的努力,还有杨海玲老师, ...

  8. 关于《Unity3D/2D游戏开发从0到1》书籍再版说明

    关于<Unity3D/2D游戏开发从0到1>第一版本在2015年7月1日全国发行,累计得到不少国内高校教师.培训机构的好评.但是由于Unity官方对于技术不断的升级与版本的快速迭代,基于U ...

  9. 《Unity3D/2D游戏开发从0到1》正式出版发行

    <Unity3D/2D游戏开发从0到1>正式出版发行 去年个人编写的Unity书籍正式在2015年7月正式发行,现在补充介绍一下个人著作.书籍信息:      书籍的名称: <Uni ...

随机推荐

  1. Notepad++的ftp远程编辑功能

    我们主要来说说NppFTP的使用方法: 1.启动notepad++后,点击插件-->NppFTP-->Show NppFTP Window,就可以显示NppFTP的管理窗口了. 2.在Np ...

  2. 泛型(Generic)委托

    泛型(Generic)委托 您可以通过类型参数定义泛型委托.例如: delegate T NumberChanger<T>(T n); 下面的实例演示了委托的使用: using Syste ...

  3. 跨页面传值2之cookie多值使用

    单值cookie结构 CookieKeyName——CookieValue CookieKeyName2——CookieValue2 ............... 通过CookieKeyName进行 ...

  4. C#-01.语法基础

    a. 语法基础 i. 命名空间(namespace):是 C# 中组织代码的方式,用来声明命名空间 . 语法:namespace 命名空间名称{ //命名空间的声明 } . 作用:可以把紧密相关的一些 ...

  5. SVN服务器在Ubuntu16.04下搭建多版本库详细教程

    1  介绍  Subversion是一个自由,开源的版本控制系统,这个版本库就像一个普通的文件服务器,不同的是,它可以记录每一次文件和目录的修改情况.这样就可 以很方面恢复到以前的版本,并可以查看数据 ...

  6. Java设计模式—策略模式

    1.策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern). 定义如下:     Define a family of algorithms,e ...

  7. Windows7中Java64位环境变量配置:javac不是内部命令或外部命令,也不是可运行的程序或批处理文件。

    按照默认设置安装完JDK(Java Developement Kits)后,一般默认路径为:C:\Program Files\Java\jdk1.8.0_05_x64\文件夹. 然后配置环境变量:&q ...

  8. EBS登陆界面IE显示异常

    使用在IE浏览登陆EBS时: 在登陆界面,登录和取消的按钮显示异常: 在进入HOME界面时,显示的职责全为undefined. 原因: 由于IE版本的兼容性. 解决方法: 浏览器 菜单->工具- ...

  9. AE常用代码(标注要素、AE中画带箭头的线、如何获得投影坐标、参考坐标、投影方式、FeatureCount注意事项)

    手上的电脑已经用了将近三年了,想入手一台Surface Pro,所以计划着把电脑上的资料整理下,部分资料打算发到博客上来,资料有同事.也有自己的.也有来自网络的,来源途径太多,也没法详细注明,请见谅! ...

  10. babel 的一些记录

    babel 的作用是将高版本的代码转换成低版本的可支持的代码: 过程是 读取 source code 转换为语法树 -> 经过处理 -> 转换为 code: babel有preset和pl ...