C# 而移动单位变换的无限循环

C# 而移动单位变换的无限循环,c#,unity3d,while-loop,C#,Unity3d,While Loop,我程序的这一部分使Unity引擎崩溃,我很确定这是一个无限循环,但我不知道为什么或者如何修复它 一般情况下,不要在中执行在每帧基础中应该执行的操作!(谢谢罗恩) 在最好的情况下,while的结果是,你的应用程序会阻塞,直到向量最终匹配,使对象“跳跃”到位。在最坏的情况下,他们永远不会匹配,你的应用程序永远冻结 相反,您应该使用称为“每帧”的方法,每帧只移动对象一步 要比较向量,最好使用。使用forVector3基本上是可以的,但在内部,它的作用相当于 while (transform.posit

我程序的这一部分使Unity引擎崩溃,我很确定这是一个无限循环,但我不知道为什么或者如何修复它

  • 一般情况下,不要在
    中执行在每帧基础中应该执行的操作!(谢谢罗恩)
    在最好的情况下,
    while
    的结果是,你的应用程序会阻塞,直到向量最终匹配,使对象“跳跃”到位。在最坏的情况下,他们永远不会匹配,你的应用程序永远冻结

    相反,您应该使用称为“每帧”的方法,每帧只移动对象一步

  • 要比较向量,最好使用。使用for
    Vector3
    基本上是可以的,但在内部,它的作用相当于

    while (transform.position != new Vector3(desX, desY))
    {
        // 2 - Movement
        Vector3 movement = new Vector3(
            0.1f * desX,
            0.1f * desY,
            0);
    
        //movement *= Time.deltaTime;
        transform.Translate(movement);
    }    
    
  • 将一个对象移动到另一个统一体实际上已经有了一个内置的方法,例如

    这会处理向量3的比较,所以你甚至不再需要它了

  • 为了让它更流畅、更节省,您已经正确地使用了
    Time.deltaTime
    。如果没有这个,它将移动
    0.1米/帧
    ,但您的帧速率可能不稳定。使用
    Time.deltaTime
    可以使其
    0.1米/秒
    ,这在几乎所有情况下都是您实际想要实现的

  • 所以要把它放在一起,你的代码应该是

    transform.position = Vector3.MoveTowards(transform.position, new Vector3 (desX, desY), 0.1f);
    


    请注意,在某些情况下,
    移动仍然不够可靠,例如,如果您想跟踪碰撞或其他情况。在本例中,referent

    将冻结您的应用程序,因为当
    while
    循环中的条件不满足时,您没有给其他脚本运行的机会

    要修复此问题,请将该代码放入协程函数中,然后添加
    yield return null
    切换到
    while
    循环。这使得Unity在每个循环之后等待一个帧,因此给其他脚本运行每个帧的机会。无论
    while
    循环是否退出,这都应该解决冻结问题。我还建议您使用
    Vector3.Distance
    来确定何时接近目的地

    float desX;
    float desY;
    
    float moveSpeed = 0.1f;
    
    void Update()
    {
        var targetPosition = new Vector3 (desX, desY);
    
        transform.position = Vector3.MoveTowards(transform.position, targetPosition, moveSpeed * Time.deltaTime);
    }
    

    如果您真的想随着时间的推移将游戏对象移动到另一个位置,请参阅文章。

    这可能是浮点比较的问题,这些值可能与您要检查的值不完全相同。@RonBeyer是对的。你到底想做什么?看起来你想把一个游戏物体移向一个位置。请看一看,您不应该使用while循环来统一移动对象,这就是Update方法的用途。1<代码>矢量3
    可以接受2个参数。第三个是0。这是为了从
    Vector2
    创建
    Vector3
    。2.这在这里真的无关紧要。OP正在比较
    Vector3
    而不是
    float
    。有一个用于比较两个向量的内置重载。它不是比较浮动,而是检查它们的大小差异。3.您也可以使用
    while
    循环来移动对象。我不知道还能说些什么,但这并不能解决问题。它展示了另一种解决方案,但没有解决当前问题。此外,浮点几乎从不相等(向量由浮点组成)。使用
    Mathf.approximaty
    来比较它们。@DRACO18通常是的,但是比较
    Vector3
    使用已经使用的近似值,在内部做一些比较
    Vector3.Distance(vectorA,vectorB,0.00001)
    所以只需使用一个非常小的阈值
    transform.position = Vector3.MoveTowards(transform.position, new Vector3 (desX, desY), 0.1f);
    
    float desX;
    float desY;
    
    float moveSpeed = 0.1f;
    
    void Update()
    {
        var targetPosition = new Vector3 (desX, desY);
    
        transform.position = Vector3.MoveTowards(transform.position, targetPosition, moveSpeed * Time.deltaTime);
    }
    
    public float reachThreshold = 0.2f;
    
    void Start()
    {
        StartCoroutine(MoveBject());
    }
    
    IEnumerator MoveBject()
    {
        float distance = Vector3.Distance(transform.position, new Vector3(desX, desY));
    
        while (distance > reachThreshold)
        {
            // 2 - Movement
            Vector3 movement = new Vector3(
                0.1f * desX,
                0.1f * desY,
                0);
    
            //movement *= Time.deltaTime;
            transform.Translate(movement);
    
            //Wait a frame
            yield return null;
        }
    }