为何挂载脚本的物体无论Z轴旋转角度,if语句都会触发?
问题分析与修复
原代码逻辑错误
你写的条件判断存在逻辑问题:
if(Mathf.Abs(transform.rotation.eulerAngles.z) > 90 || Mathf.Abs(transform.rotation.eulerAngles.z) < 180) { mySpriteRenderer.flipY = true; } else { mySpriteRenderer.flipY = false; }
这里用了||(逻辑或),意味着任何数值都会满足其中一个条件——毕竟所有数字要么大于90,要么小于180,所以这个判断永远为true,导致Sprite始终处于翻转状态。
修正后的代码
根据你的需求(Z轴旋转后物体右侧指向左侧时翻转Y轴),正确逻辑应该是判断旋转绝对值处于90到180之间,需要用&&(逻辑与):
float zRotationAbs = Mathf.Abs(transform.rotation.eulerAngles.z); if(zRotationAbs > 90 && zRotationAbs < 180) { mySpriteRenderer.flipY = true; } else { mySpriteRenderer.flipY = false; }
更严谨的优化方案
考虑到欧拉角的循环特性(范围0-360),可以先将旋转值转换到-180到180的区间,再判断是否转向左侧:
float zRotation = Mathf.DeltaAngle(0, transform.rotation.eulerAngles.z); if(zRotation < -90 || zRotation > 90) { mySpriteRenderer.flipY = true; } else { mySpriteRenderer.flipY = false; }
Mathf.DeltaAngle会自动计算两个角度的最短差值,结果范围固定在-180到180,这样判断物体是否转向左侧会更准确。
内容的提问来源于stack exchange,提问作者GamblingGambit
相关产品推荐
相关产品推荐

