C# Mathf.Clamp正在Unity 3D中将我的EuleRange重置为minValue

C# Mathf.Clamp正在Unity 3D中将我的EuleRange重置为minValue,c#,unity3d,quaternions,euler-angles,clamp,C#,Unity3d,Quaternions,Euler Angles,Clamp,Mathf.Clamp在EuleRange达到maxValue时将其重置为minValue,而不是将其约束为maxValue。我已经试过了: rotateX = Input.GetAxis("Mouse X") * senseX; player.transform.Rotate(player.up, Mathf.Deg2Rad * rotateX, Space.World); playerXRotation = player.eulerA

Mathf.Clamp在EuleRange达到maxValue时将其重置为minValue,而不是将其约束为maxValue。我已经试过了:

            rotateX = Input.GetAxis("Mouse X") * senseX;
        player.transform.Rotate(player.up, Mathf.Deg2Rad * rotateX, Space.World);

        playerXRotation = player.eulerAngles;

        while (playerXRotation.y > 180f)
            playerXRotation.y -= 360f;

        Debug.Log("Y Rotation: " + playerXRotation.y);
        playerXRotation.y = Mathf.Clamp(playerXRotation.y, lowLimitY, highLimitY);
        player.transform.eulerAngles = playerXRotation;
还有这个:

         rotate = Input.GetAxis("Mouse X") * senseX;
         rotation = player.transform.eulerAngles;
         rotation.y += rotate * RateOfRotate;

         while (rotation.y > 180)
         {
             rotation.y -= 360;
         }
         rotation.y = Mathf.Clamp(rotation.y, lowLimitY, highLimitY);
         player.transform.eulerAngles = rotation;
在这两种情况下,我的下限分别为0和180;我被困在这个问题上,不知道如何解决它。任何帮助都将不胜感激。

如果您的

lowLimit=0
highLimit=180
,然后运行:

while (rotation.y > 180)
{
  rotation.y -= 360; 
}
如果在这种情况下,您的旋转是最大值(180),那么rotation.y将等于-180(180-360=-180)

那么你的夹具就是
Mathf.clamp(-180,0180)//0

如果您试图将y旋转保持在该范围内,那么删除while应该可以做到这一点。如果你想要一个不同的效果,我们需要更多的信息。

因为旋转是四元数 它们被转换为范围为[0-360]的欧拉角,因此
while(rotation.y>180)
将永远不起作用

您需要单独跟踪旋转值,夹紧到所需的值,然后将其应用于对象的旋转

rotation = player.transform.eulerAngles;
float rotationY = rotation.y + rotate * RateOfRotate;
rotationY = Mathf.Clamp(rotationY, lowLimitY, highLimitY);
rotation.y = rotationY;
player.transform.eulerAngles = rotation;

好的,如果值被钳制到下限,那么这意味着要钳制的值小于下限。看看你的
while
循环,如果
playerXRotation.y
playerXRotation.y
while
循环执行后实际上是负值,我不会感到惊讶…@elgonzo你怎么办建议我应该这样做,因为如果没有
循环,相反的情况会发生,当达到下限而不是将其限制为0时,它会将其重置为上限值180。我真的不知道你应该怎么做(我没有Unity3D经验来提供有意义的建议),但测试y值是否大于180,然后将该值减去两倍,这看起来不太合适……当我删除while循环时,情况正好相反,当达到
下限时,而不是将其钳制在
0
处,它会将其重置为
highLimitY
值,即
180
@Kaustav y我们的限制在任何情况下都是错误的。一个圆有360度,而你的夹钳将东西限制在180度。不管你如何获得进入它的值(循环或无循环)限制是错误的。@Draco18s我试图将移动限制在0到180度之间,我不需要完全360度旋转。这就是为什么我要将eulerangle.y的值限制在0到180度之间。我不明白限制怎么可能是错误的?你能解释一下你的意思吗。@Kaustav如果你的东西旋转179度,你的意思是什么吗你的旋转率是5,你想发生什么?你很有可能想让物体挤压到180度的障碍物上。但是现在你要说“184?那超过180!”然后减去360,使之为-176,然后将其钳制为0。只有当你移除环时,它的旋转角度才达到180度的极限,这也不是你想要的。如果你的东西旋转179度,你的
旋转率
为5,你想发生什么?@Draco18s我试着移除环,当我emove循环我的游戏对象冲击180度限制,并被正确地钳制为最大值,但当它冲击最小值0度时,它会以某种方式重置为180度的最大值,而不是被钳制为0度。