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

拖拽

首先,我的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. 函数lock_rec_get_first

    /*********************************************************************//** Gets the first explicit l ...

  2. bzoj3261: 最大异或和

    可持久化trie.又是%%%Xs酱... #include<cstdio> #include<cstring> #include<iostream> #includ ...

  3. 深入分析 ThreadLocal 内存泄漏问题

    前言 ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度.但是如果滥用ThreadLocal,就可能 ...

  4. 实现推送功能APP端需要完成的工作

    推送功能简介 实现推送的流程如下: 从APP注册推送功能,到APNS服务器发送推送消息给设备,有五个步骤. 一旦推送注册完成,应用自身的服务器以provider的身份提供推送. APP端实现 在代码方 ...

  5. jsp防盗链代码

    // 禁止缓存   response.setHeader("Cache-Control", "no-store");   response.setHeader( ...

  6. windows批处理中的%0 %1 %2 %3

    原来就是参数的顺序.....倒...我还查了老半天

  7. Binary Tree Level Order Traversal java实现

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  8. [转]LINK:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    LINK:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 原文地址:http://yacare.iteye.com/blog/2010049 很多伙伴在更新VS ...

  9. C# winform 若要在加载设计器前避免可能发生的数据丢失,必须纠正以下错误

    winform中有时添加了新控件之后编译会报错: 若要在加载设计器前避免可能发生的数据丢失,必须纠正以下错误,如图: 解决方案: 1.“解决方案”→“批生成”→“清理”→“确定”: 2.“解决方案”→ ...

  10. TortoiseHg简单的入门使用说明

    参考资料: 互普的 TortoiseHg使用说明_百度文库 Mercurial(Hg)基本操作 - Tim Gong - 博客园 Mercurial与TortoiseHg使用入门教程(转) - mee ...