Unity3D之飞机游戏追踪导弹制作
最近开发完成一款打飞机的游戏,记录一下制作追踪导弹的方法,最开始在网上找到的资料制作出来的追踪导弹都不够真实,主要的问题是没有对导弹进行一个阀值处理,导弹每帧都始终会面向目标,而不是按照一定的角度进行旋转,导致无法躲避跟踪导弹,下面我来说一下更加真实的跟踪导弹的制作方法。
拖拽
首先,我的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之飞机游戏追踪导弹制作的更多相关文章
- Pygame制作微信打飞机游戏PC版
使用Pygame制作微信打飞机游戏PC版 转至:http://www.cnblogs.com/dukeleo/p/3339780.html 前一阵子看了一篇文章:青少年如何使用Python开始游戏 ...
- python 之路,200行Python代码写了个打飞机游戏!
早就知道pygame模块,就是没怎么深入研究过,恰逢这周未没约到妹子,只能自己在家玩自己啦,一时兴起,花了几个小时写了个打飞机程序. 很有意思,跟大家分享下. 先看一下项目结构 "" ...
- 用canvas整个打飞机游戏
声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 之前在当耐特的DEMO里看到个打飞机的游戏,然后就把他的图片和音频扒了了下来....自己凭着玩的心情重新写了一个.仅供娱乐哈......我 ...
- Unity2016 Unity3D开发VR游戏的经验
http://z.youxiputao.com/articles/8313 在4月12日的Unite 2016大会上,暴风魔镜高级产品经理吴涛分享他用Unity3D开发VR游戏的经验,以下为分享实录: ...
- pygame开发PC端微信打飞机游戏
pygame开发PC端微信打飞机游戏 一.项目简介 1. 介绍 本项目类似曾经火爆的微信打飞机游戏.游戏将使用Python语言开发,主要用到pygame的API.游戏最终将会以python源文件gam ...
- 自制Unity小游戏TankHero-2D(2)制作敌方坦克
自制Unity小游戏TankHero-2D(2)制作敌方坦克 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的. ...
- 自制Unity小游戏TankHero-2D(1)制作主角坦克
自制Unity小游戏TankHero-2D(1)制作主角坦克 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的. ...
- 实例源码--IOS高仿微信打飞机游戏(完整功能)
下载源码 技术要点: 1. IOS游戏开发基础框架 2. 高仿打飞机游戏 3. 游戏背景音频技术 4.源码详细的中文注释 ……. 详细介绍: 1. IOS游戏开发基础框架 此套源码为涉及IOS游戏开发 ...
- 射击的乐趣:WIN32诠释打飞机游戏源码补充
打飞机游戏源码补充 从指定位置加载bmp并显示到对话框. , TRUE);, , LR_LOADFROMFILE); { BITMAP bmpinfo; ...
随机推荐
- bzoj3994
智商太低了 详细题解在这里http://blog.csdn.net/zmoiynlp/article/details/45176129 ; ..max] of longint; g:..max] of ...
- UVa 11572 Unique snowflakes【滑动窗口】
题意:给出 n个数,找到尽量长的一个序列,使得该序列中没有重复的元素 看的紫书,滑动窗口来做的 当右端碰到有相同的数的时候,左端向前滑动一个数 模拟一个样例好理解些 #include<iostr ...
- 【.NET应用技巧】Asp.NET MVC 4 设置IIS下调试
[环境] VS 2012 IIS7.5 [问题] MVC项目在创建时和APS.NET不同,不能够选择服务器类型,不能够直接把项目创建到IIS上. 如果在项目中直接更改属性,更换调试服务器类型,会报错 ...
- 苹果官方 Crash文件分析方法 (iOS系统Crash文件分析方法)
对于提交的苹果官方的app,在审核的时候会给我们一些crash文件,对于这些有用的文件,里面是关于我们的bug的一些信息,那么该如何去调试呢 第一步:在任意目录创建一个目录,用来调试crash,我这里 ...
- 【linux】命令
pwd 显示路径 whereis jupyterhub find / -name base.py reboot 重启 grep
- Nginx & AWStats 安装、配置、使用
—— 参考IBM文章:THIS , 不一样的指导顺序 —— 1. awstats分析nginx - access.log,网上资料大部分都是下载,然后配置.官网下载地址: http://awstats ...
- 省常中模拟 Test1 Day1
临洮巨人 排序 题意:在字符串中找出 A.B.C 三个字母出现次数相同的区间个数. 初步的解法是前缀和,用 a(i), b(i), c(i) 表示在位置 i 之前(包括 i)各有 字母 A.B.C 多 ...
- 【Java集合框架】规则集--Set
集合: Java主要支持三种: 1.规则集(Set) 用于存储一组不重复的元素 2.线性表(List) 用于存储一个由元素构成的有序集合 3.队列(Queue) 同与数据结构中的队列,存储用先进先出的 ...
- 【转】 CATransform3D 矩阵变换之立方体旋转实现细节
原文网址:http://blog.csdn.net/ch_soft/article/details/7351896 第一部分.前几天做动画,使用到了CATransform3D ,由于没有学过计算机图形 ...
- (原创)LAMP教程2-安装虚拟机软件VirtualBox
大家好,今天我们讲的是第二章,安装虚拟机软件VirtualBox 我先讲一下我的电脑的环境,可以看下面的图片说明 大家也看到了我的机子是64位的win7系统(为什么讲这个,因为接下来我们要下载的是ce ...