递增/递减值而不会过度

时间:2017-04-13 10:29:05

标签: c# unity3d

所以我目前有2个值x和y,我希望x递减/递增y,直到它变为0而不会过去。

float x = 9;
float y = 4;

if (x != 0) {

    if (x > 0) { 
        x -= y; 
    }

    else if (x < 0) { 
        x += y; 
    }
}

如果要运行x将被减去y 3次,将x的值保留为-2,其中下一帧将再次运行并添加y,这将再次结束。

5 个答案:

答案 0 :(得分:0)

您可以通过在减法或添加后在0引入剪辑来更改实现,如下所示。

if (x != 0) {
    if (x > 0) { 
        x -= y;
        x = Math.Max(x, 0.0f);
    }
    else if (x < 0) { 
        x += y;
        x = Math.Min(x, 0.0f);
    }
}

答案 1 :(得分:0)

您可以使用以下内容执行此操作:

if ( x != 0 )
{
    x = x < 0 ? Math.Min(x + y, 0) : Math.Max(x - y, 0);
}

答案 2 :(得分:0)

不确定我是否理解正确,但是如果你希望 x递减/递增y直到它变为0而不会超过,那么应该这样做:

for( ; x>=0; x = x - y);
x = x + y;

答案 3 :(得分:0)

这个函数会在注释中给你这个结果,对于错误的参数,它会避免无限并返回X:

//[9, 4] = 1
//[-9, -4] = -1    
private static float Unnamed(float x, float y)
        {
            float tmp = x;
            float result = x;
            while (true)
            {
                tmp -= y;
                if (y > 0)
                {
                    if (tmp > 0 && tmp < x)
                        result = tmp;
                    else
                        break;
                }
                else
                {
                    if (tmp < 0 && tmp > x)
                        result = tmp;
                    else
                        break;
                }
            }
            return result;
        }

答案 4 :(得分:0)

好的,基于@ Codor的答案,我得到了这个

private float Approach(float value, float targetValue, float step) {

        float result;

        if (value < targetValue) {
            result = Mathf.Min (value + step, targetValue);
        } else {
            result = Mathf.Max (value - step, targetValue);
        }

        return result;
    } 

工作正常,完全符合我的要求,永远不会超过目标价值。然后我遇到了一个已经内置的功能,它完全符合我的要求Mathf.MoveTowards(value, targetValue, step)