假设同一平面中有AB两点,A点向B点水平射击,很容易想象子弹会沿由A指向B的向量方向前进,经过时间t后到达B点,若此时A点不再水平射击,改为以抛物线的方式向B点投射,同样需要在时间t后击中B点,那么如何确定被修正后的初速度呢。(这时就不得不提那万恶的游戏平衡性了Orz)

想想也不难,只要保证初速度在A指向B方向的速度分量与加速度分量与之前水平射击时一致即可。进一步简化问题则为,额外计算重力加速度g值产生的y轴方向的初速度。

匀变速运动中的一些与加速度相关公式:

1. Vt-V0=at;

2.Vt2-V02=2as;

3.s=V0t+0.5*at2

实际上以上三个公式就可以解决所有这类问题,至于抛物线的一些额外公式都非常容易通过这三个公式推导,就不再列举了。

 1 using UnityEngine;
2
3 public class ParabolaBullet : Bullet
4 {
5 //高度
6 public float height = 3.0f;
7
8 private Vector3 Vyt;
9 private Vector3 Vxt;
10 private Vector3 For;
11 private float Gy;
12 private float Vyo;
13 private float Vxo;
14
15 public override void Init()
16 {
17 TargetPos = Target != null ? Target.transform.position : TargetPos;
18
19 //平面向量
20 var of = TargetPos.FixV3ToFloor() - transform.position.FixV3ToFloor();
21 //平面距离
22 var Sx = of.magnitude;
23 //平面末速度
24 var Vxt = Mathf.Sqrt(Mathf.Abs(2 * Acceleration * Sx + Velocity * Velocity));
25 //平面运动时间
26 var Tx = Acceleration == 0 ? Sx / Velocity : (Vxt - Velocity) / Acceleration;
27 //到达最高点时间为平面运动时间的一半
28 var Ty = 0.5f * Tx;
29 //重力加速度
30 Gy = 2 * height / (Ty * Ty);
31 //高度初速度
32 Vyo = Mathf.Sqrt(2 * Gy * height);
33
34 Vxo = Velocity;
35 For = transform.forward;
36 dTime = 0;
37 }
38
39 private float dTime = 0;
40 private void FixedUpdate()
41 {
42 var dt = Time.fixedDeltaTime;
43 dTime += dt;
44 //vt=vo+at 两个方向(竖直方向与原始运动方向) 注意重力G为与初速度方向相反,取负
45 Vyt.y = Vyo - Gy * dTime;
46 Vxt = (Vxo + Acceleration * dTime) * For.FixV3ToFloor().normalized;
47
48 //分别在两个方向上进行运动,注意为世界空间
49 transform.Translate(Vxt * dt, Space.World);
50 transform.Translate(Vyt * dt, Space.World);
51
52 //子弹的前向指向两个速度单位向量的和单位向量
53 transform.forward = (Vxt + Vyt).normalized;
54 }
55 }

上面的脚本采用了固定高度的方式动态计算加速度常量的值,当然感兴趣的读者也可通过固定加速度常量来计算,这样更为简单。

Unity 定点投射固定高度抛物线的更多相关文章

  1. Unity物理投射相关问题整理

    1.投射目标是否需要附加刚体,是否可忽略触发器? 默认既支持触发器,也支持刚体.投射的最后一个参数queryTriggerInteraction可以设置,是否包含触发器事件. 2.非射线投射,是否有接 ...

  2. javascript抛物投栏(抛物线实践)

    平面内,到定点与定直线的距离相等的点的轨迹叫做抛物线.水平抛物线就是水平匀速,垂直加速的运动. 抛物线的性质:面内与一个定点F和一条定直线l 的距离相等的点的轨迹叫做抛物线. 定点F叫做抛物线的焦点. ...

  3. 关于Unity动态物体无法向使用使用custom shader和lightmap的物体投射阴影

    最近在做unity shader forge和marmoset的优化,TA那边遇到了一个阴影显示的问题,具体如下:   在Forward Rendering状态下,静态场景使用了是shader for ...

  4. unity两点之间抛物线,完美金手指

    学校享受的日子一去不复还了,呜呜.话说面试了几个公司,真心没准备好就上了,结果当然是小悲催.还好有容身之处,就算是搬砖,也有可能为自己盖楼,吼吼. 好,下面我来分享一道有意思的面试题,说他有意思,是因 ...

  5. Unity中各类物理投射性能横向比较

    最近在优化摄像机部分代码,抽了个时间对物理投射这块进行了系统性的测试,发现了不少东西 测试工程下载地址: http://files.cnblogs.com/files/hont/RaycastTest ...

  6. 如何在Unity中画抛物线

    using UnityEngine; using System.Collections; using System.Collections.Generic; [ExecuteInEditMode] p ...

  7. Unity 5 中的全局光照技术详解

    貌似是某位好人翻译的 https://unity3d.com/cn/learn/tutorials/topics/graphics/unity-5-lighting-and-rendering#rd? ...

  8. Unity 5 中的全局光照技术详解(建议收藏)

    本文整理自Unity全球官方网站,原文:UNITY 5 - LIGHTING AND RENDERING (文章较长,请耐心阅读)简介全局光照,简称GI,是一个用来模拟光的互动和反弹等复杂行为的算法, ...

  9. Unity 5--全局光照技术

    本文整理自Unity全球官方网站,原文:UNITY 5 - LIGHTING AND RENDERING 简介全局光照,简称GI,是一个用来模拟光的互动和反弹等复杂行为的算法,要精确的仿真全局光照非常 ...

随机推荐

  1. spring MVC 3.2中@ResponseBody(Post接口)返回乱码的完美解决方案

    本来因为ajax跨域http远程调用时有问题,在服务端响应时用以下方式解决了,但IE8及下有问题. response.addHeader("Access-Control-Allow-Orig ...

  2. sublime text 2应用

    http://www.sublimetext.com/2 可以下一个 a portable version  我自己的是win版和linux版都有 1.添加注释 先选择要注释的内容,然后按 ctrl ...

  3. spring源码学习笔记之容器的基本实现(一)

    前言 最近学习了<<Spring源码深度解析>>受益匪浅,本博客是对学习内容的一个总结.分享,方便日后自己复习或与一同学习的小伙伴一起探讨之用. 建议与源码配合使用,效果更嘉, ...

  4. PTA 1014 Waiting in Line (30分) 解题思路及满分代码

    题目 Suppose a bank has N windows open for service. There is a yellow line in front of the windows whi ...

  5. 2019牛客暑期多校训练营(第四场)A-meeting(树的直径)

    >传送门< 题意:n给城市有n-1条路相连,每两个城市之间的道路花费为1,有k个人在k个城市,问这k个人聚集在同一个城市的最小花费 思路:(官方给的题解写的挺好理解的) 考虑距离最远的两个 ...

  6. c++中几种swap

    在c与c++中,有多种办法可以通过函数交换传入的两数的值,但有容易有一些问题产生,因而本文将几种交换方式及容易出错的点进行了分类. 1.传引用这是c++中最常见方式如下: int swap1 (int ...

  7. 使用eclipse写第一个Java_web的hello_world项目

    1.先创建一个Java_web项目 如果你没有下载过Tomcat服务器,不会配置,建议看一下我得这一篇博客:https://www.cnblogs.com/kongbursi-2292702937/p ...

  8. Educational Codeforces Round 94 (Rated for Div. 2) String Similarity、RPG Protagonist、Binary String Reconstruction、Zigzags 思维

    题目链接:String Similarity 题意: 首先题目定义了两个串的相似(串的构成是0.1),如果两个串存在对于一个下标k,它们的值一样,那么这两个串就相似 然后题目给你一个长度为2n-1的串 ...

  9. UVA 10480 Sabotage (最大流) 最小割边

    题目 题意: 编写一个程序,给定一个网络规范和破坏每个连接的成本,确定要切断哪个连接,以便将首都和最大的城市分离到尽可能低的成本. 分割-------------------------------- ...

  10. Windows环境下Robot Framework 下载及安装流程

    1.安装包下载 注意安装包统一64位或32位 1)python-2.7.16.amd64.msi 2)robotframework-3.0.2.tar.gz 3)robotframework-ride ...