如果语句Float不交换值并保持循环?

时间:2019-09-11 17:52:25

标签: c# unity3d

因此,我有一个matrix3x3脚本,该脚本是我制作的一个平移和旋转脚本,还有一个我在场景中渲染的2D网格物体,我试图在两点之间反弹。

右为10,左为-10

当物体碰到点时,我希望它改变方向和旋转(平移和角度)

运行代码时,对象首先移至右侧(10),然后到达该点并开始抖动...就像它一直与两个值保持战斗,并且不会将方向或角度变回-10 < / p>

仅供参考:UpdateMesh用于渲染场景中对象的网格,顶点和颜色

我已经将其放在自己的方法中(而不是仅将其放在Update中),并尝试摆弄值,但是我仍然遇到相同的问题...

我希望有人可以指向正确的方向(我感觉这与我的编码顺序有关,但我不确定...)

void RotateAndTranslate()
{
    UpdateMesh();

    Vector3[] vertices = mesh.vertices;
    //angle += rotationSpeed * Time.deltaTime;
    //offset2 += 1 * Time.deltaTime * Speed;
    offsetpos = offset2;

    if (offset2 <= 10)
    {

        offset2 += 1 * Time.deltaTime * Speed;
        angle -= rotationSpeed * Time.deltaTime;

    }
    else if (offset2 >= -10)
    {
        offset2 += -1 * Time.deltaTime * Speed;
        angle += rotationSpeed * Time.deltaTime;
    }




    //Get The transformation matrix
    Matrix3x3 T = Transform.Translate(offsetpos, 0);
    Matrix3x3 R = Transform.Rotate(angle);
    //Matrix3x3 T2 = Transform.Translate(-offset.x, -offset.y);
    Matrix3x3 T2 = Transform.Translate(-offset.x, -offset.y);
    Matrix3x3 M = T * R;
    for (int i = 0; i < vertices.Length; i++)
    {
        vertices[i] = M.MultiplyPoint(vertices[i]);
    }

    mesh.vertices = vertices;

}

public void Update()
{
    RotateAndTranslate();

}

1 个答案:

答案 0 :(得分:1)

看看您的

if (offset2 <= 10)
{
    offset2 += 1 * Time.deltaTime * Speed;
    angle -= rotationSpeed * Time.deltaTime;
}
else if (offset2 >= -10)
{
    offset2 += -1 * Time.deltaTime * Speed;
    angle += rotationSpeed * Time.deltaTime;
}

这里发生了什么?假设您从0开始。

  1. 因为0 <= 10true,所以执行了第一个块。

  2. 有时您会达到10+x或更高的值。

  3. 现在,由于10+x <= 10false10+x >= -10true,因此执行第二个块。因此,在此框架中,您可以再次减小offset2

  4. ,因此在接下来的几帧中,它将很快很快再次达到值<= 10

→因此,由于每隔几帧甚至每隔一帧您就改变方向,因此它开始在值10附近抖动。


对此的一种解决方案是使用简单的bool标志:

private bool isGoingRight;

...

int offsetSign = isGoingRight ? 1 : -1;
int angleSign = isGoingRight ? -1 : 1;

if (isGoingRight && offset2 >= 10)
{
    isGoingRight = false;
}
else if (!isGoingRight && offset2 <= -10)
{
    isGoingRight = true;
}

offset2 += offsetSign * Speed * Time.deltaTime;
angle += angleSign * rotationSpeed * Time.deltaTime;

区别:现在,只有达到相应的限制时,这才反转一次