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

拖拽

首先,我的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. HDU 4923

    题目大意: 给出一串序列Ai{0,1},求一个序列Bi[0,1](Bi<Bi+1),使得sigama(Ai-Bi)^2最小 思路: 若B相同,则取A的平均数可使方差最小 若B有序,   若A== ...

  2. 函数flst_remove

    移除 node, node->prev直接指向node->next /*********************************************************** ...

  3. UVa 11889 (GCD) Benefit

    好吧,被大白书上的入门题给卡了.=_=|| 已知LCM(A, B) = C,已知A和C,求最小的B 一开始我想当然地以为B = C / A,后来发现这时候的B不一定满足gcd(A, B) = 1 A要 ...

  4. JavaScript闭包示例

    在下面的例子中,为什么点击所有的段落p输出都是5,而不是alert出对应的0,1,2,3,4. <html> <head> <meta charset="utf ...

  5. dialog组件

    /** * @description Mask 弹层 * @function * @name Mask * @param {Object} options 配置项 */ var passport = ...

  6. Python用smtplib发送邮件

    参照了下面: 1. 先随便照着试试这个: http://blog.csdn.net/zhaoweikid/article/details/1638349 2. 这个写了一个很简洁的代码,看过NO.1就 ...

  7. eclipse 下生成jar包

    eclipse 下生成jar包 第一:普通类导出jar包,我说的普通类就是指此类包含main方法,并且没有用到别的jar包. 1.在eclipse中选择你要导出的类或者package,右击,选择Exp ...

  8. DATAGUARD中手工处理日志v$archive_GAP的方法

    从9i以后,oracle dataguard 备库一般都不需要手工处理丢失的日志,FAL自动会帮我们处理,下面通过个案例来讲下手工处理丢失的日志的方法: 1.在备库查询有哪些日志丢失,没应用到备库 S ...

  9. 获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)

    众所周知,通过PackageManager可以获取手机端已安装的apk文件的信息,具体代码如下: PackageManager packageManager = this.getPackageMana ...

  10. HDU 4267-A Simple Problem with Integers(多个BIT)

    题意: 2种操作 1 a b k c 在区间[a,b]中的(i-a)%k==0的位置i上的数+c 2 a 查询位置a的值 输出每次查询的值 分析: 开始想到多维的线段树,但比较麻烦,看了题解才知道,用 ...