本文转载:http://www.manew.com/thread-44642-1-1.html

无论是愤怒的小鸟,还是弓箭发射功能,亦或者模拟炮弹受重力影响等抛物线轨迹,都可以使用本文的方法,模拟绝对真实。
和往常一样,先说原理。就是抛物运动,在垂直方向上做加速度运动,在水平方向上,做匀速运动。
在unity上的具体实现为,使用transform进行位移模拟。至于为何不使用刚体的物理模拟,大家自行脑补或者测试。
那么如何使用transform模拟呢?让物体同时在两个方向产生位移就行了,一个是初速度方向,一个是垂直方向。
垂直方向的速度 = a*t,a代表重力加速度,t代表已经运行的时间。
好现在我们来看看一个简单的弓箭轨迹是怎么产生的吧,上代码:
   
using UnityEngine;
using System.Collections;
/// <summary>
/// 弓箭轨迹模拟
/// 阿亮设计,欢迎交流经验
/// </summary>
public class TestRay : MonoBehaviour { public float Power=;//这个代表发射时的速度/力度等,可以通过此来模拟不同的力大小
public float Angle=;//发射的角度,这个就不用解释了吧
public float Gravity = -;//这个代表重力加速度 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, , )) * 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 = ;//这个代表发射时的速度/力度等,可以通过此来模拟不同的力大小
public float Angle = ;//发射的角度,这个就不用解释了吧
public float Gravity = -;//这个代表重力加速度
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(, ,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是固定频率执行的,累加时间比较真实。另,代码的运行结果和
通过数学计算出的相差无几,大家可以自行测试。

U3D 抛物线的方法的更多相关文章

  1. U3D游戏开发基础

    向量: 1. 向量的长度,即向量的模.计算公式为向量各个分量的平方和,然后开平方. 在D3DX库中,方法为:FLOAT  D3DXVec3Length(CONST  D3DXVECTOR3 * pV) ...

  2. Android属性动画:插值器与估值器

    声明:本篇文章部分内容来自<Android开发艺术探索>. 我们都知道对于属性动画可以对某个属性做动画,而 插值器(TimeInterpolator)和 估值器(TypeEvaluator ...

  3. Noip2016Day2T3 愤怒的小鸟

    题目链接 problem 平面内有n个点,每次可以确定一条过原点且开口向上的抛物线,将这条抛物线上所有的点都删去.问最少需要删几次可以删掉全部的点. solution n比较小,直接状压一下.因为已经 ...

  4. javaSE27天复习总结

    JAVA学习总结    2 第一天    2 1:计算机概述(了解)    2 (1)计算机    2 (2)计算机硬件    2 (3)计算机软件    2 (4)软件开发(理解)    2 (5) ...

  5. unity3D实际的原始视频游戏开发系列讲座12之U3D的2D为了开发实战的新方法

     U3D的2D为了开发实战的新方法 (Unity3d-4.x的打飞机2D游戏开发新的方法应用 ) 大纲介绍:不使用NGUI和TK2d插件,   使用 U3D内置强大的最大的工具. 开发过程设计到例 ...

  6. 【重要】U3D存放本地游戏存档——不同平台载入XML文件的方法——IOS MAC Android

    在PC上和IOS上读取XML文件的方式略有差别,经测试,IOS上不支持如下方法载入XML文件: XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load( ...

  7. (转)U3D不同平台载入XML文件的方法——IOS MAC Android

    自:http://www.cnblogs.com/sifenkesi/archive/2012/03/12/2391330.html 在PC上和IOS上读取XML文件的方式略有差别,经测试,IOS上不 ...

  8. U3D 扩展方法 & Dotween & tolua

    using UnityEngine; using System.Collections; using LuaInterface;//tolua 空间引用 using DG.Tweening;//DOT ...

  9. 机器学习:形如抛物线的散点图在python和R中的非线性回归拟合方法

    对于样本数据的散点图形如函数y=ax2+bx+c的图像的数据, 在python中的拟合过程为: ##最小二乘法 import numpy as np import scipy as sp import ...

随机推荐

  1. bzoj1295

    考虑到这道题n,m都很小,我们考虑先穷举起点i 下面我们要做的是找出移走k个障碍后,点i所能到的最大距离 我们可以把这个问题转化为判定性问题 对于一对点i,j,如果他们之间存在一条路径,障碍数(包括起 ...

  2. C++11内存模型的一些补充阅读材料

    <Intel Threading Building Block> O'REILLY Chapter 7 Mutual Exclusion - Atomic Operation - Memo ...

  3. 浅析五大ASP.NET数据控件

    转自:http://kb.cnblogs.com/page/69207/ 摘要:ASP.NET中有不少的控件,在这当中有一部分是用来处理数据的控件.在这里我们正要讨论的就是ASP.NET数据控件,希望 ...

  4. C#入门经典学习笔记一

    这篇主要讲C#的一些语法. 1.委托 委托类型声明的格式如下: public delegate void TestDelegate(string message); delegate 关键字用于声明一 ...

  5. 参考SQLHelper编写的OracleHelper

    使用 Oracle.ManagedDataAccess.Client 类库参考SQLHelper编写的OracleHelper: // ================================ ...

  6. 《A First Course in Probability》-chape4-离散型随机变量-几种典型分布列

    超几何分布: 超几何分布基于这样一个模型,一个坛子中有N个球,其中m个白球,N-m个黑球,从中随机取n(不放回),令X表示取出来的白球数,那么: 我们称随机变量X满足参数为(n,m,M)的超几何分布. ...

  7. 事物复制中大项目(Large Article)出问题如何快速修复

    事物日志中如果大的发布项目(Article)出问题了,并且影响了系统的使用,如何快速的解决? 一般的做法是重新用快照或者备份初始化,但是如果出问题的表非常大(上亿的记录,几十GB的数据),使用初始化是 ...

  8. solr4.0.0学习(二) 数据库导入clob与blob为索引

    导入clob很简单.但是blob好像没有提供方法,所以改了一下源码,重新编译替换class文件,竟然成功了. 先把配置文件贴上 SCHEMA.XML <?xml version="1. ...

  9. Eclipse修改字体大小

    1.MyEclipse|Window|General|Appearance|Colors and Fonts->点击Text Font->Edit

  10. php分页类代码和使用

    在这要说的一点就是如果你做的分页是有搜索条件的,那么就可以用下面的代码,然后调用之后在new Page()里面把连接加进去就可以了.例如: $href="http://www.***.cn/ ...