Object 使用Mathf.Clamp()限制对象旋转的问题

Object 使用Mathf.Clamp()限制对象旋转的问题,object,unity3d,rotation,clamp,Object,Unity3d,Rotation,Clamp,我正在做一个在z轴上旋转物体的游戏。我需要将总旋转限制在80度。我尝试了下面的代码,但不起作用。minAngle=-40.0f和maxAngle=40.0f Vector3 pos = transform.position; pos.z = Mathf.Clamp(pos.z, minAngle, maxAngle); transform.position = pos; 您发布的代码将夹紧z位置。您需要的是使用transform.rotation void ClampRotation(floa

我正在做一个在z轴上旋转物体的游戏。我需要将总旋转限制在80度。我尝试了下面的代码,但不起作用。minAngle=-40.0f和maxAngle=40.0f

Vector3 pos = transform.position;
pos.z = Mathf.Clamp(pos.z, minAngle, maxAngle);
transform.position = pos;

您发布的代码将夹紧z位置。您需要的是使用transform.rotation

void ClampRotation(float minAngle, float maxAngle, float clampAroundAngle = 0)
{
    //clampAroundAngle is the angle you want the clamp to originate from
    //For example a value of 90, with a min=-45 and max=45, will let the angle go 45 degrees away from 90

    //Adjust to make 0 be right side up
    clampAroundAngle += 180;

    //Get the angle of the z axis and rotate it up side down
    float z = transform.rotation.eulerAngles.z - clampAroundAngle;

    z = WrapAngle(z);

    //Move range to [-180, 180]
    z -= 180;

    //Clamp to desired range
    z = Mathf.Clamp(z, minAngle, maxAngle);

    //Move range back to [0, 360]
    z += 180;

    //Set the angle back to the transform and rotate it back to right side up
    transform.rotation = Quaternion.Euler(transform.rotation.eulerAngles.x, transform.rotation.eulerAngles.y, z + clampAroundAngle);
}

//Make sure angle is within 0,360 range
float WrapAngle(float angle)
{
    //If its negative rotate until its positive
    while (angle < 0)
        angle += 360;

    //If its to positive rotate until within range
    return Mathf.Repeat(angle, 360);
}
void ClampRotation(浮点数角、浮点数角、浮点数角=0)
{
//clampAroundAngle是希望夹钳源自的角度
//例如,值为90,最小值为-45,最大值为45,将使角度与90成45度角
//调整以使0右侧朝上
蛤蜊圈角+=180;
//获取z轴的角度,并将其上下旋转
float z=transform.rotation.eulerAngles.z-clampAroundAngle;
z=河豚(z);
//将范围移动到[-180,180]
z-=180;
//夹紧至所需范围
z=数学夹具(z,minAngle,maxAngle);
//将范围移回[0360]
z+=180;
//将角度设置回变换,并将其旋转回右侧向上
transform.rotation=Quaternion.Euler(transform.rotation.eulerAngles.x,transform.rotation.eulerAngles.y,z+clampAroundAngle);
}
//确保角度在0360范围内
浮动绞盘(浮动角度)
{
//如果它是负的,旋转直到它是正的
而(角度<0)
角度+=360;
//如果其为正旋转,直到在范围内
返回数学重复(角度360);
}
这是Imapler的nice解决方案的静态版本,它不改变角度本身,而是返回倾斜角度,因此可以与任何轴一起使用

public static float ClampAngle(
    float currentValue,
    float minAngle,
    float maxAngle,
    float clampAroundAngle = 0
) {
    return Mathf.Clamp(
        WrapAngle(currentValue - (clampAroundAngle + 180)) - 180,
        minAngle,
        maxAngle
    ) + 360 + clampAroundAngle;
}

public static float WrapAngle(float angle)
{
    while (angle < 0) {
        angle += 360;
    }
    return Mathf.Repeat(angle, 360);
}

谢谢你的这个方法。这几乎解决了我的问题!唯一的问题是,如果我允许旋转超过-50或50,旋转将冻结,不会对鼠标移动作出反应。我确保我遵守了这些限制,而且效果很好!谢谢你的帮助,天才!这个问题在网络上有很多答案,但除了这个,没有一个解决方案是有效的。明亮的
public static float ClampAngle(
    float currentValue,
    float minAngle,
    float maxAngle,
    float clampAroundAngle = 0
) {
    float angle = currentValue - (clampAroundAngle + 180);

    while (angle < 0) {
        angle += 360;
    }

    angle = Mathf.Repeat(angle, 360);

    return Mathf.Clamp(
        angle - 180,
        minAngle,
        maxAngle
    ) + 360 + clampAroundAngle;
}
transform.localEulerAngles.x = YourMathf.ClampAngle(
    transform.localEulerAngles.x,
    minX,
    maxX
);