制作2D追踪导弹

本文介绍了在Unity中2D环境下计算对象朝向的方法,对比了Mathf.Atan()和Mathf.Atan2()的区别,并提供了实现代码示例。

 做子弹类的东西少不了角度的计算。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);

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

这是使用物理的方法。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值