做子弹类的东西少不了角度的计算。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);
但是这样 有一个问题 就是 如果一开始角度 不是指向目标 会一瞬间 指向目标 。 还没想好如何 让他有一个缓动的过程。。。 有谁看见了这个知道的话希望能教教我
这是使用物理的方法。
本文介绍了在Unity中2D环境下计算对象朝向的方法,对比了Mathf.Atan()和Mathf.Atan2()的区别,并提供了实现代码示例。
1915

被折叠的 条评论
为什么被折叠?



