C# 如何在统一的两点之间移动对象?

C# 如何在统一的两点之间移动对象?,c#,unity3d,C#,Unity3d,我试图使用unity的lerp功能将一个棋子上下翻译。但是,每当我触发此脚本时,整个会话都会冻结 使用unity调试器,我已将问题缩小到这段代码 do { float distCovered = (Time.time - startTime) * speed; fracJourney = distCovered / journeyLength; Debug.Log(fracJourne

我试图使用unity的
lerp
功能将一个棋子上下翻译。但是,每当我触发此脚本时,整个会话都会冻结

使用unity调试器,我已将问题缩小到这段代码

            do
        {
            float distCovered = (Time.time - startTime) * speed;
            fracJourney = distCovered / journeyLength;
            Debug.Log(fracJourney);
            transform.position = Vector3.Lerp(startPoint, endPoint, speed);
        } while (fracJourney <= 1);
do
{
float distCovered=(Time.Time-startTime)*速度;
FractJourney=距离覆盖/行程长度;
Debug.Log(fractjourney);
transform.position=Vector3.Lerp(起点、终点、速度);

}然而(p你这里有不止一个问题

第一个是在lerp函数中使用循环。在循环完成之前,游戏不会更新渲染输出。不管循环是否无限,它不会只执行一次迭代,它会执行所有迭代(这也无助于
时间。时间在这个过程中不会改变)

第二个问题是,计算移动的距离是从应用程序开始到当前移动开始的距离

第三,调用Vector3.lerp(),将第三个参数(“浮点百分比”)传递给它,其值为
speed
,而不是应该计算的小数量。例如
Vector3.lerp(startPoint,endPoint,0.5f);
将返回
startPoint
endPoint
之间的中点

第四,没有理由使用四种方法来渲染动画。你只需要一种,但你也必须将其传递到所需的目的地(而不是使用四种表示不同目的地的方法)


第五,您正在计算
journeyLength
作为
起始点
端点
之间的距离,尽管之前已经将
端点
计算为
起始点+距离
(这就是
新向量3(0,0,50)
是一个距离!)

我对c比较陌生,所以我将看看
IEnumerator
yield
但是,do循环本身不在
Update()
例程中。它在
Update()调用的子例程中
除非在这种情况下,这基本上算是同一件事。它算是同一件事啊,好了,现在开始工作了。是的,我现在明白了为什么我的代码只是令人震惊
    public class MovePiece : MonoBehaviour {
    Vector3 startPoint;
    Vector3 endPoint;
    float speed = 10;
    float startTime;
    private bool moving = false;
    private bool up = false;
    private bool across = false;
    private bool down = false;
    public void Start()
    {
        startPoint = gameObject.GetComponent<Transform>().position;
        startTime = Time.time;
        moving = true;
        Debug.Log("Moving Piece");
    }

    void Update() {
        if (!moving)
        {
            Destroy(this);
            return;
        }
        moveManager();
            }
    void moveManager()
    {
        if (!up)
        {
            lerpUp();
            return;
        }
        if (!across)
        {
            lerpAcross();
            return;
        }
        if (!down)
        {
            lerpDown();
            return;
        }
    }

    private void lerpUp()
    {
        Debug.Log("Upwards");
        startPoint = gameObject.GetComponent<Transform>().position;
        endPoint = startPoint + new Vector3(0, 0, 50);
        float journeyLength = Vector3.Distance(startPoint, endPoint);
        float fracJourney;
        do
        {
            float distCovered = (Time.time - startTime) * speed;
            fracJourney = distCovered / journeyLength;
            Debug.Log(fracJourney);
            transform.position = Vector3.Lerp(startPoint, endPoint, speed);
        } while (fracJourney <= 1);
        up = true;
        Debug.Log("Upwards Finished");
        return;
    }
    private void lerpAcross()
         {
             Debug.Log("Across");
             startPoint = gameObject.GetComponent<Transform>().position;
             endPoint = startPoint + new Vector3(0, 50, 0);
              float journeyLength = Vector3.Distance(startPoint, endPoint);
             float fracJourney;
             do
             {
                 float distCovered = (Time.time - startTime) * speed;
                 fracJourney = distCovered / journeyLength;
                 transform.position = Vector3.Lerp(startPoint, endPoint, speed);
             } while (fracJourney <= 1);
        across = true;
        Debug.Log("Across Finished");
        return;
         }
    private void lerpDown()
    {
        Debug.Log("Down");
        startPoint = gameObject.GetComponent<Transform>().position;
        endPoint = startPoint + new Vector3(0, 0, -50);
        float journeyLength = Vector3.Distance(startPoint, endPoint);
        float fracJourney;
        do
        {
            float distCovered = (Time.time - startTime) * speed;
            fracJourney = distCovered / journeyLength;
            transform.position = Vector3.Lerp(startPoint, endPoint, speed);
        } while (fracJourney <= 1);
        down = true;
        Debug.Log("Down Finished");
        moving = false;
        Debug.Log("Moving Finished");
        return;
    }

}
}
do
    {
        float distCovered = (Time.time - startTime) * speed;
        fracJourney = distCovered / journeyLength;
        Debug.Log(fracJourney);
        transform.position = Vector3.Lerp(startPoint, endPoint, speed);
    } while (fracJourney <= 1);
public IEnumerator MyLoop()
{
    while (fracJourney <= 1)
    {
        float distCovered = (Time.time - startTime) * speed;
        fracJourney = distCovered / journeyLength;
        Debug.Log(fracJourney);
        transform.position = Vector3.Lerp(startPoint, endPoint, speed);

        yield return null;     //< --- yield out and let a frame pass
    }
}