【Unity】限制旋转角度的天坑

天坑一: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)
{
  ...
}

看完我这个还是很难理解我说的啥米,你可以看看相关文章的例子。我是看到这个文章才突然觉得有必要做一篇这方面的问题解答文章,以便以后遇到这种神坑而很好地解决,也欢迎大家来讨论别的问题,以后也会继续更新这篇文章。

  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值