最近开发完成一款打飞机的游戏,记录一下制作追踪导弹的方法,最开始在网上找到的资料制作出来的追踪导弹都不够真实,主要的问题是没有对导弹进行一个阀值处理,导弹每帧都始终会面向目标,而不是按照一定的角度进行旋转,导致无法躲避跟踪导弹,下面我来说一下更加真实的跟踪导弹的制作方法。

拖拽

首先,我的Demo里有两个小飞机,一个是主角,一个是敌机,有一个需求就是这两个飞机可以通过鼠标进行拖拽,所以先给出拖拽的脚本,直接绑定即可,当然记得给GameObject添加一个BoxCollder。

 using UnityEngine;
using System.Collections; /// <summary>
/// 拖拽脚本.
/// </summary>
public class DragAndDrop : MonoBehaviour
{
bool isCatched = false; void Update()
{
if(Input.GetMouseButtonDown())
{
//根据鼠标位置创建一条垂直于屏幕的射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//保存射线信息的结构体
RaycastHit hit;
//对射线进行碰撞, 如果存在碰撞
if(Physics.Raycast(ray, out hit))
{
//碰撞到当前对象时
if(hit.collider.gameObject == this.gameObject)
{
//标记为抓取状态
isCatched = true;
}
}
} if(Input.GetMouseButtonUp())
{
//取消抓取状态
isCatched = false;
} if(isCatched)
{
//获取鼠标点在场景中的位置
Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
pos.z = ;
//设置位置
this.transform.position = pos;
}
}
}

管理类

我使用UGUI添加了一个发射导弹的按钮,需要一个管理类来管理这部分的逻辑:

 using UnityEngine;
using System.Collections; /// <summary>
/// 控制脚本.
/// </summary>
public class TrackDemoScript : MonoBehaviour
{
public GameObject player; public GameObject enemy; /// <summary>
/// 开火.
/// </summary>
public void Fire()
{
GameObject go = Resources.Load<GameObject>("Prefab/Bullet");
GameObject bullet = Instantiate(go, player.transform.position, Quaternion.identity) as GameObject;
bullet.GetComponent<BulletScript>().target = enemy;
}
}

导弹被我制作为了一个预制件。

导弹逻辑

最重要的就是阀值了,我规定了每帧允许旋转的一个最大值,保证模拟出现实世界的效果,导弹要转弯肯定是画出一个弧线而不是马上掉头的。

 using UnityEngine;
using System.Collections; /// <summary>
/// 跟踪导弹脚本.
/// </summary>
public class BulletScript : MonoBehaviour
{
/// <summary>
/// 每秒最大可旋转的角度.
/// </summary>
private const float MAX_ROTATION = ; /// <summary>
/// 每帧最大可旋转的角度.
/// </summary>
private static float MAX_ROTATION_FRAME = MAX_ROTATION / ((float) (Application.targetFrameRate == - ? : Application.targetFrameRate)); /// <summary>
/// 攻击目标.
/// </summary>
public GameObject target; void Start()
{
} void Update()
{
//转向目标
float dx = target.transform.position.x - this.transform.position.x;
float dy = target.transform.position.y - this.transform.position.y;
float rotationZ = Mathf.Atan2(dy, dx) * / Mathf.PI;
//得到最终的角度并且确保在 [0, 360) 这个区间内
rotationZ -= ;
rotationZ = MakeSureRightRotation(rotationZ);
//获取增加的角度
float originRotationZ = MakeSureRightRotation(this.transform.eulerAngles.z);
float addRotationZ = rotationZ - originRotationZ;
//超过 180 度需要修改为负方向的角度
if(addRotationZ > )
{
addRotationZ -= ;
}
//不超过每帧最大可旋转的阀值
addRotationZ = Mathf.Max(-MAX_ROTATION_FRAME, Mathf.Min(MAX_ROTATION_FRAME, addRotationZ));
//应用旋转
this.transform.eulerAngles = new Vector3(, , this.transform.eulerAngles.z + addRotationZ);
//移动
this.transform.Translate(new Vector3(, 2.0f * Time.deltaTime, ));
} /// <summary>
/// 确保角度在 [0, 360) 这个区间内.
/// </summary>
/// <param name="rotation">任意数值的角度.</param>
/// <returns>对应的在 [0, 360) 这个区间内的角度.</returns>
private float MakeSureRightRotation(float rotation)
{
rotation += ;
rotation %= ;
return rotation;
}
}

运行即可查看效果。

源码下载

http://pan.baidu.com/s/1qWBsvSg

Unity3D之飞机游戏追踪导弹制作的更多相关文章

  1. Pygame制作微信打飞机游戏PC版

    使用Pygame制作微信打飞机游戏PC版 转至:http://www.cnblogs.com/dukeleo/p/3339780.html   前一阵子看了一篇文章:青少年如何使用Python开始游戏 ...

  2. python 之路,200行Python代码写了个打飞机游戏!

    早就知道pygame模块,就是没怎么深入研究过,恰逢这周未没约到妹子,只能自己在家玩自己啦,一时兴起,花了几个小时写了个打飞机程序. 很有意思,跟大家分享下. 先看一下项目结构 "" ...

  3. 用canvas整个打飞机游戏

    声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 之前在当耐特的DEMO里看到个打飞机的游戏,然后就把他的图片和音频扒了了下来....自己凭着玩的心情重新写了一个.仅供娱乐哈......我 ...

  4. Unity2016 Unity3D开发VR游戏的经验

    http://z.youxiputao.com/articles/8313 在4月12日的Unite 2016大会上,暴风魔镜高级产品经理吴涛分享他用Unity3D开发VR游戏的经验,以下为分享实录: ...

  5. pygame开发PC端微信打飞机游戏

    pygame开发PC端微信打飞机游戏 一.项目简介 1. 介绍 本项目类似曾经火爆的微信打飞机游戏.游戏将使用Python语言开发,主要用到pygame的API.游戏最终将会以python源文件gam ...

  6. 自制Unity小游戏TankHero-2D(2)制作敌方坦克

    自制Unity小游戏TankHero-2D(2)制作敌方坦克 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的. ...

  7. 自制Unity小游戏TankHero-2D(1)制作主角坦克

    自制Unity小游戏TankHero-2D(1)制作主角坦克 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的. ...

  8. 实例源码--IOS高仿微信打飞机游戏(完整功能)

    下载源码 技术要点: 1. IOS游戏开发基础框架 2. 高仿打飞机游戏 3. 游戏背景音频技术 4.源码详细的中文注释 ……. 详细介绍: 1. IOS游戏开发基础框架 此套源码为涉及IOS游戏开发 ...

  9. 射击的乐趣:WIN32诠释打飞机游戏源码补充

    打飞机游戏源码补充 从指定位置加载bmp并显示到对话框. , TRUE);, , LR_LOADFROMFILE);          {         BITMAP bmpinfo;        ...

随机推荐

  1. Java Web编程的主要组件技术——Struts核心组件

    参考书籍:<J2EE开源编程精要15讲> Struts配置文件struts-config.xml Struts核心文件,可配置各种组件,包括Form Beans.Actions.Actio ...

  2. Python - re - 正则表达式 - 怎么用

    <python cookbook> - 1.18 - 一次完成多个替换 这个blog介绍正则,写得不错,而且,一如既往的‘长’. 1. re.escape(string) THIS,说明函 ...

  3. Java [Leetcode 303]Range Sum Query - Immutable

    题目描述: Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inc ...

  4. T-SQL备忘(1):表联接

    测试用例表如下: 1.取2个成员表中的交集(A∩B) T-SQL: select Member1.Name,Member1.Age from Member1 join Member2 on Membe ...

  5. svn强制提交备注信息

    当我们用tortoisesvn,提交代码时,有很多人不喜欢写注释的,代码版本多了,根本搞不清,哪个版本改了什么东西?所以如果加一些注释的话,我们看起来,也方便很多.所以在提交的时候,我会强制要求,写注 ...

  6. 转载RabbitMQ入门(6)--远程调用

    远程过程调用(RPC) (使用Java客户端) 在指南的第二部分,我们学习了如何使用工作队列将耗时的任务分布到多个工作者中. 但是假如我们需要调用远端计算机的函数,等待结果呢?好吧,这又是另一个故事了 ...

  7. MySql表中key的区别

    我们看到Key那一栏,可能会有4种值,即'啥也没有','PRI','UNI','MUL'1. 如果Key是空的, 那么该列值的可以重复, 表示该列没有索引, 或者是一个非唯一的复合索引的非前导列2. ...

  8. TCP/IP详解学习笔记(3)-IP协议,ARP协议,RARP协议

    把这三个协议放到一起学习是因为这三个协议处于同一层,ARP协议用来找到目标主机的Ethernet网卡Mac地址,IP则承载要发送的消息.数据链路层可以从ARP得到数据的传送信息,而从IP得到要传输的数 ...

  9. centos系统常用软件环境搭建

    yum源制作grub常见问题:http://linux.chinaunix.net/techdoc/beginner/2008/01/04/975921.shtml 系统安装: 2 软件安装:yum ...

  10. Hadoop集群中Hbase的介绍、安装、使用

    导读 HBase – Hadoop Database,是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群. 一.Hbase ...