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; ...
随机推荐
- Spring下载
Spring官网改版后找了好久都没有找到直接下载Jar包的链接,下面汇总些网上提供的方法,亲测可用. 1.直接输入地址,改相应版本即可:http://repo.springsource.org/lib ...
- LeetCode Number of Islands 岛的数量(DFS,BFS)
题意:0代表水,1代表陆地,那么被水围起来的就是岛了,给一个01矩阵,问有多少个岛? 思路:DFS还是比较短,实现了一下.如果一个点已经被遍历过了,那就将其置为0就行了,不要去搜0的. class S ...
- VS2010开发2dx无法解析的外部符号解决记录
首先新建HelloWorld项目... 想使用Cocos2d扩展包需要引入相关头文件,如:#include “cocos-ext.h”...接下来我们右键工程属性->配置属性->c/c++ ...
- liunx下mysql数据库使用之三范式,关系模型设计注意项,安装目录结构
数据库的三范式第一范式===>每行记录的属性,是原子的,拆到不可拆为止.===>例如:一个人的籍贯,可以拆分为,省,市,县,乡,村 第二范式===>每行记录的非主属性(非主键属性), ...
- Oracle 课程七之分析和动态采样
课程目标 完成本课程的学习后,您应该能够: •引子—统计信息的作用 •如何收集统计信息 •系统统计信息 •对象统计信息—表.字段.索引统计信息 •动态采样 统计信息的作用 Optimizer st ...
- sharepoint SPFolder的使用
转:http://blog.csdn.net/pclzr/article/details/7591731 SPFolder是SharePoint对象模型中文件夹相关的类,它的使用方法相对比较简单.获取 ...
- hdu 2155 小黑的镇魂曲(dp) 2008信息工程学院集训队——选拔赛
感觉蛮坑的一道题. 题意很像一个叫“是男人下100层”的游戏.不过多了个时间限制,要求在限定时间内从某一点下落到地面.还多了个最大下落高度,一次最多下落这么高,要不然会摔死. 一开始想dp的,然后想了 ...
- java web 学习十五(jsp基础语法)
任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用. 一.JSP模版元素 JSP页面中的HTML内容称之 ...
- Android Dialog用法
摘要: 创建对话框 一个对话框一般是一个出现在当前Activity之上的一个小窗口. 处于下面的Activity失去焦点, 对话框接受所有的用户交互. 对话框一般用于提示信息和与当前应用程序直接相关的 ...
- http://jingyan.baidu.com/article/4dc40848e7b69bc8d946f127.html
http://jingyan.baidu.com/article/4dc40848e7b69bc8d946f127.html