制作2D追踪导弹

来源:互联网 发布:银行卡被网络支付盗刷 编辑:程序博客网 时间:2024/05/16 12:10

 做子弹类的东西少不了角度的计算。3D可以直接使用Lookat() 很方便但是2D就要计算角度了。

要使用到 mathf.ATan()  和 mathf.ATan2() 。首先比较这两个函数的差异

================================================================================

引用:http://www.cnblogs.com/xpvincent/archive/2013/02/15/2912759.html

对于tan(θ) = y / x:

θ = ATan(y / x)求出的θ取值范围是[-PI/2, PI/2]。

θ = ATan2(y, x)求出的θ取值范围是[-PI, PI]。

当 (x, y) 在第一象限, 0 < θ < PI/2.

当 (x, y) 在第二象限 PI/2 < θ≤PI.

当 (x, y) 在第三象限, -PI < θ < -PI/2.

当 (x, y) 在第四象限, -PI/2 < θ < 0.

当点(x, y)在象限的边界也就是坐标轴上时:

当 y 是 0,x 为非负值, θ = 0.

当 y 是 0, x 是 负值, θ = PI.

当 y 是 正值, x 是 0, θ = PI/2.

当 y 是 负值, x 是 0, θ = -PI/2.

由此可知,一般情况下用ATan即可,当对所求出角度的取值范围有特殊要求时,应使用ATan2。

===================================================================================


大概就是这个样子,unity的 Atan2 和 Atan计算出来的值.

那么在unity里旋转 物体坐标系 localEulerAngles。计算他的角度让他对齐 目标就有办法了

            angle = Mathf.Atan2(deltay, deltax);            //计算角度             if (deltax > 0 && deltay > 0)      //一象限                angle = Mathf.PI / 2 + angle;            else if (deltax < 0 && deltay > 0) //二象限                angle = -3 * Mathf.PI / 2 + angle;            else if (deltax < 0 && deltay < 0) //三象限                angle = angle + Mathf.PI / 2;            else                               //四象限                angle = Mathf.PI / 2 + angle;

旋转的角度出来了

 transform.localEulerAngles = new Vector3(0, 0, angle); 
然后移动 物体的物理坐标系,(也可以移动世界坐标系但是那样要将y计算到世界坐标系的y x轴上 比较麻烦),加速运动:

y=y+moveAcc;

 transform.Translate(new Vector3(0,y,0) * Time.deltaTime);

但是这样 有一个问题 就是 如果一开始角度 不是指向目标 会一瞬间 指向目标 。 还没想好如何 让他有一个缓动的过程。。。 有谁看见了这个知道的话希望能教教我

这是使用物理的方法。



0 0
原创粉丝点击