unity发射弓箭轨迹的实现
无论是愤怒的小鸟,还是弓箭发射功能,亦或者模拟炮弹受重力影响等抛物线轨迹,都可以使用本文的方法,模拟绝对真实。
和往常一样,先说原理。就是抛物运动,在垂直方向上做加速度运动,在水平方向上,做匀速运动。
在unity上的具体实现为,使用transform进行位移模拟。至于为何不使用刚体的物理模拟,大家自行脑补或者测试。
那么如何使用transform模拟呢?让物体同时在两个方向产生位移就行了,一个是初速度方向,一个是垂直方向。
垂直方向的速度 = a*t,a代表重力加速度,t代表已经运行的时间。
好现在我们来看看一个简单的弓箭轨迹是怎么产生的吧,上代码:

using UnityEngine;
using System.Collections;
/// <summary>
/// 弓箭轨迹模拟
/// 阿亮设计,欢迎交流经验
/// </summary>
public class TestRay : MonoBehaviour { public float Power=10;//这个代表发射时的速度/力度等,可以通过此来模拟不同的力大小
public float Angle=45;//发射的角度,这个就不用解释了吧
public float Gravity = -10;//这个代表重力加速度 private Vector3 MoveSpeed;//初速度向量
private Vector3 GritySpeed = Vector3.zero;//重力的速度向量,t时为0
private float dTime;//已经过去的时间
// Use this for initialization
void Start () {
//通过一个公式计算出初速度向量
//角度*力度
MoveSpeed = Quaternion.Euler(new Vector3(-Angle, 0, 0)) * Vector3.forward * Power; } // Update is called once per frame
void FixedUpdate () { //计算物体的重力速度
//v = at ;
GritySpeed.y = Gravity * (dTime += Time.fixedDeltaTime);
//位移模拟轨迹
transform.Translate(MoveSpeed * Time.fixedDeltaTime);
transform.Translate(GritySpeed * Time.fixedDeltaTime); }
}

怎么样够简单吧?直接把这个脚本托给一个物体,效果就有了。但是等一下,这个纯位移模拟是没错,但是物体移动时的角度变化却是没有了,根本不像弓箭呢!
要解决这个,其实也很简单呢,相信你也能写出来吧。
如何模拟阻力,我就不用解释了吧,在运行过程中,将垂直速度和初速度在水平方向上的速度分量逐渐减小(注意值范围)就行了。
好,大家晚安好梦!
鉴于很多人私下留言说搞不定角度问题,好吧,我自己挖的坑自己填好。
再说说原理,如何同步这个角度呢?三角函数的图我就不划了,估计大家也不想听那些物理或者数学公式,只需要知道,通过垂直方向和水平方向的比值就行了,然后
转化为角度赋值给对象。好了,我知道你最关心的是代码呢?代码如下:

using UnityEngine;
using System.Collections;
/// <summary>
/// 弓箭轨迹模拟
/// 阿亮设计,欢迎交流经验
/// </summary>
public class Radar : MonoBehaviour
{ public float Power = 10;//这个代表发射时的速度/力度等,可以通过此来模拟不同的力大小
public float Angle = 45;//发射的角度,这个就不用解释了吧
public float Gravity = -10;//这个代表重力加速度
public bool IsOne = false; private Vector3 MoveSpeed;//初速度向量
private Vector3 GritySpeed = Vector3.zero;//重力的速度向量,t时为0
private float dTime;//已经过去的时间 private Vector3 currentAngle;
// Use this for initialization
void Start()
{
//通过一个公式计算出初速度向量
//角度*力度
MoveSpeed = Quaternion.Euler(new Vector3(0, 0,Angle)) * Vector3.right * Power;
currentAngle = Vector3.zero;
} // Update is called once per frame
void FixedUpdate()
{ //计算物体的重力速度
//v = at ;
GritySpeed.y = Gravity * (dTime += Time.fixedDeltaTime);
//位移模拟轨迹
transform.position += (MoveSpeed + GritySpeed) * Time.fixedDeltaTime;
currentAngle.z = Mathf.Atan((MoveSpeed.y + GritySpeed.y) / MoveSpeed.x) * Mathf.Rad2Deg;
transform.eulerAngles = currentAngle; }
}

注意,为什么使用FixedUpdate而不是Update,因为FixedUpdate是固定频率执行的,累加时间比较真实。另,代码的运行结果和
通过数学计算出的相差无几,大家可以自行测试。
本文链接:http://www.cnblogs.com/jqg-aliang/p/4806002.htm转载请申明出处,谢谢!
unity发射弓箭轨迹的实现的更多相关文章
- Unity事件处理机制与NGUI事件机制
1 Unity原生 1.1 GUI void OnGUI(){ if(GUI.Button(Rect position, string text)){ //点击后立即执行 } 1.1 Input 每个 ...
- unity射线碰撞检测+LayerMask的使用
射线在unity中是个很方便的东西,对对象查找.多用于碰撞检测(如:子弹飞行是否击中目标).角色移动等提供了很大的帮助,在此做个总结与大家分享下 ,若有不足欢迎吐槽 好了,话补多说啦,直接进入主题: ...
- U3D 抛物线的方法
本文转载:http://www.manew.com/thread-44642-1-1.html 无论是愤怒的小鸟,还是弓箭发射功能,亦或者模拟炮弹受重力影响等抛物线轨迹,都可以使用本文的方法,模拟绝对 ...
- 山寨小小军团开发笔记 之 Arrow Projectile
好久没怎么更新博客了,今天抽空来一篇,讨论一下弓箭的轨迹生成. 一.原理 弓箭的轨迹本质就是一个数学问题,使用一个 bezier 曲线公式就可以插值生成.得到轨迹后,做一个lookAt就可以了. 二. ...
- 发布HTML5 RTS游戏-古代战争
古代战争 游戏介绍 "古代战争"是一个2.5D即时战略游戏,使用了帝国时代2的素材,并参考了它的游戏设计和玩法. 游戏基于YEngine2D引擎开发,具备生产.建造.资源采集.战斗 ...
- 青少年如何使用 Python 开始游戏开发
这是一篇由教程团队成员Julian Meyer发表的文章,一个12岁的python开发人员.你可以在Google+和Twitter上找到他. 你可曾想过如何创建视频游戏吗?它不像你想象的那么复杂! 在 ...
- Defender Game 游戏实践(1) 基本游戏场景实现
在网上看到 郑州|boy 这个博客,里面有几篇文章,记录了其用cocos2d-x这个游戏引擎编写的一个游戏,十分不错,所以这段时间,依样画葫芦,依次学习一下. 由于博主开发的平台是在win32,而且屏 ...
- 使用 Python 开始游戏开发
使用 Python 开始游戏开发 这是一篇由教程团队成员Julian Meyer发表的文章,一个12岁的python开发人员.你可以在Google+和Twitter上找到他. 你可曾想过如何创建视频游 ...
- 什么是AR技术?AR的价值究竟有多大?
什么是AR技术? AR技术,解释来说就是增强现实(Augmented Reality),是一种实时地计算摄影机影像的位置及角度并加上相应图像.3D模型的技术,它的目标是把虚拟世界嵌套进真实世界进行互动 ...
随机推荐
- mindmanager2018官方下载地址
mindmanager2018官方下载地址 CreationTime--2018年6月6日09:09:56 Author:Marydon 找了很多都是假的链接地址,流氓软件,根本不能输入许可密钥, ...
- (数据库)DBCP连接池配置参数说明
<!-- 数据源1 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicData ...
- Python 常见错误及解决办法
错误: Traceback (most recent call last): File "I:/Papers/consumer/codeandpaper/RegressionandGBDTa ...
- js同域名下不同文件下使用coookie
//写cookies function setCookie(name,value) { var Days = 30; var exp = new Date(); exp.setTime(exp.get ...
- Redis总结(一)Redis安装(转载)
最近项目中需要使用Redis,刚好这两天有时间,便总结记录一下Redis的安装,以及如何在.NET中使用Redis. Redis是一个用的比较广泛的Key/Value的内存数据库.目前新浪微博.Git ...
- centos gnome桌面放大
我不知道gnome 为什么要这么做.但是真的有效: gsettings set org.gnome.desktop.interface scaling-factor # 放大2倍
- .atitit.web 推送实现解决方案集合(3)----dwr3 Reverse Ajax
.atitit.web 推送实现解决方案集合(3)----dwr3 Reverse Ajax 1. 原理实现 1 2. Page 增加配置,增加回调函数dwr.engine.setActiveRev ...
- CYQ学习主要摘要4
http://www.cnblogs.com/cyq1162/archive/2010/11/03/1867642.html Xml的处理 http://www.cnblogs.com/cyq1162 ...
- C# 文件与二进制互转数据库写入读出
//这个方法是浏览文件对象 private void button1_Click(object sender, EventArgs e) { //用户打开文件浏览 using (OpenFileDia ...
- Visual Studio:error MSB8020
状况如下: error MSB8020: The builds tools for v120 (Platform Toolset = 'v120') cannot be found. To build ...