天坑一:Inspector面板的Transform组件的Rotation真实数值如何获取的问题.
transform.eulerAngles保存了这个Rotation显示的修改后的数值,经测试发现在Unity2017版本,transform.eulerAngles.x , y ,z在[0,90]范围内是与Inspector面板处显示的Rotation数值保持一致,但是当它大于90后,其x,y,z值会被unity修改,会被用180减去原生值返回给transform.eulerAngles,例如:Inspector上RotationX显示150,那么transform.eulerAngles.x是180-150=30。
我们可以使用下方链接文章的方法来获取真实值,也就是Inspector上Rotation的数值,而不是修改后的值,相信很多人都没察觉到这个问题。
https://blog.csdn.net/qq_34444468/article/details/83929841
天坑二:Inspector面板的Transform组件的Rotation旋转值与负数度数的关系问题.
相关文章:https://blog.csdn.net/qq_15386973/article/details/76255694
上面列出的链接文章处说到,当你想限制旋转角度为[-30,30]区间时,假设伪代码如下:
下面是伪代码
//假设限制X轴的旋转角度
int minRotateX = -30;
int maxRotateX = 30;
float currentRotateX = transform.eulerAngles.x;//被unity修改后的旋转值(天坑一),但是这里没有影响,就用它来获取当前物体的旋转轴X的值
if(currentRotateX < minRotateX || currentRotateX > maxRotateX)
{
//Do Something...
}
上面的代码就会有问题,因为unity旋转值是在[0,360)区间的,并没有所谓的负数,当你给他赋值负数角度时,会修改为360-负数的相反数,例如:-5度 会修改为360-5=355度。如何解决这个问题呢?
很简单啊,你unity不就是将 我的负数用这个公式:(360 - 负数相反数 = 360 + 负数 = 负数被unity修改后的值) 吗?
上面如果还是太抽象的话可以以-5°被修改的情况理解: 360 - 5 = 360 + (-5) = 355 (负数被unity修改后的值 )
那我想要得到的是负数,而不是修改后的,那就是:(负数 = 负数被unity修改后的值 - 360)(由上面公式推导出,小学生都会啦),这个(负数被unity修改后的值)这玩意其实就是我们的currentRotateX(transform.eulerAngles.x)。
并且测试发现只有当currentRotateX是大于180度后,才属于我所说的负数修改而来的值,例如:-1度是359度来表示,-179度是181度来表示。
//将unity修改后的旋转值恢复回来 ,也就是负数 保持原样
if(currentRotateX > 180)
{
currentRotateX = currentRotateX - 360;//这样-5度还是-5度 而不是355!
}
//如果currentRotateX是正数,那么是正常的!不用改哦。
//之后再进行角度限制
if(currentRotateX < -30 || currentRotateX > 30)
{
...
}
看完我这个还是很难理解我说的啥米,你可以看看相关文章的例子。我是看到这个文章才突然觉得有必要做一篇这方面的问题解答文章,以便以后遇到这种神坑而很好地解决,也欢迎大家来讨论别的问题,以后也会继续更新这篇文章。