在Vector3.equals和“==”上返回false的相同向量

时间:2017-11-29 09:02:28

标签: c# unity3d vector

我需要提高游戏中的水位。但是,在播放了一段时间之后,应该播放的水的声音不会停止。

我在控制台中输出的输出:

WATERLEVEL NOT AT TARGET
Waterlevel localpos: (1.0, -432.0, -17.4)
target pos: (1.0, -432.0, -17.4)

WATERLEVEL NOT AT TARGET
...(same as previous)

这是我的方法,它向目标移动并在河流处于目标位置时停止声音

IEnumerator IncreaseWaterLevelCoroutine()
{
    //determine target
    Vector3 target = waterLevel.transform.localPosition;
    target.y += waterStep;

    //prepare
    bool notAtPos = true;
    audioRivierOversteken.Play();

    //start raising water each frame
    while (notAtPos)
    {   
        //raise water level
        float speed = AnimSpeed * Time.deltaTime;
        waterLevel.transform.localPosition = Vector3.MoveTowards(waterLevel.transform.localPosition, target, speed);

        //stop if the waterlevel is at target position
        if (waterLevel.transform.localPosition == target)
        {
            Debug.Log("waterlevel at target");
            StartCoroutine(StopRivierSound(0.5f));
            notAtPos = false;
        }
        else
        {
            Debug.Log("WATERLEVEL NOT AT TARGET");
            Debug.Log("Waterlevel localpos: " + waterLevel.transform.localPosition.ToString());
            Debug.Log("target pos: " + target.ToString());
        }

        yield return null;
    }
}

1 个答案:

答案 0 :(得分:0)

不要相信Vector的控制台输出。 Unity的Vector类中重写的ToString()方法将包含的浮点数显式舍入为精度的单个十进制数字。

例如,此代码:

Vector3 v1 = new Vector3(0.1f, 0, 0);
Vector3 v2 = new Vector3(0.12f, 0, 0);
Debug.Log(v1);
Debug.Log(v2);
Debug.Log(v1 == v2);

打印:

(0.1, 0, 0)
(0.1, 0, 0)
false

然而,(0.10001, 0, 0)的向量将等同于(v1),即使0.10.10001在直接比较时不等于相等。