Unity中物体抛物线的实现方式
发表于2017-01-22
很多游戏会用到抛物线,例如说愤怒的小鸟,一起发射炮弹的游戏,都会因为重力原因影响抛物线轨迹,而下面要给大家介绍的就是Unity中物体抛物线的实现方式,一起来看看吧。
和往常一样,先说原理。就是抛物运动,在垂直方向上做加速度运动,在水平方向上,做匀速运动。
在unity上的具体实现为,使用transform进行位移模拟。至于为何不使用刚体的物理模拟,用刚体的物理模拟太占用CPU的计算。
那么如何使用transform模拟呢?让物体同时在两个方向产生位移就行了,一个是初速度方向,一个是垂直方向。
垂直方向的速度 = a*t,a代表重力加速度,t代表已经运行的时间。
新建一个物体,添加rigidbody,然后取消重力选项,因为我们在脚本中模拟其重力的大小。添加下列脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | using UnityEngine; using System.Collections; public class newDus : 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; //已经过去的时间 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; } } |