簡體   English   中英

如何重新啟動協程?

[英]How can I restart coroutine?

我正在嘗試實現一個協程,它將 object 移動到特定點,然后作為 Unity 中的協程返回原點(由我指定),但協程在返回原點后未執行。 怎么了?

public class LineManager : MonoBehaviour
{
    public Vector3 positionToGo = new Vector3(0, -4, 0);
    IEnumerator coroutine;
    void Start()
    {
        coroutine = MoveToPosition(transform, positionToGo, 2f);
    }

    void Update()
    {
        if(transform.position.y == 4)
        {
            StartCoroutine(coroutine);
        }
    }

    public IEnumerator MoveToPosition(Transform transform, Vector3 position, float timeToMove)
    {
        var currentPos = transform.position;
        var t = 0f;
        while (t < 1 && currentPos.y > position.y)
        {
            t += Time.deltaTime / timeToMove;
            transform.position = Vector3.Lerp(currentPos, position, t);
            yield return null;
        }
            transform.position = new Vector3(0, 4, 0);
            StopCoroutine(coroutine);
    }
}

你真的不需要為此重新開始你的例行程序。

但首先要做的是:

transform.position.y == 4

是有風險的,因為它是直接float比較並且可能會失敗。 請參閱浮點數學是否損壞?

無論如何,回到協程重新啟動。 為什么不干脆不按常規移動

public Vector3 positionToGo = new Vector3(0, -4, 0);
public float timeToMove = 2f;

private Vector3 originalPosition;
private float factor;

private void Awake()
{
    originalPosition = transform.position;
}

private void Update()
{
    if(factor >= 1)
    {
        factor = 0;
        transform.position = originalPosition;
    }
    else
    {
        factor += Time.deltaTime / timeToMove;
        transform.position = Vector3.Lerp(originalPosition, positionToGo, factor);
    }
}

作為替代方案,如果您想使用例程,您可以隨時簡單地使其循環

public Vector3 positionToGo = new Vector3(0, -4, 0);
public float timeToMove = 2f;

private IEnumerator Start()
{
    var originalPosition = transform.position;

    while(true)
    {
        for(var factor = 0f; factor < 1f; factor += Time.deltaTime / timeToMove)
        {
            transform.position = Vector3.Lerp(originalPosition, position, factor);
            yield return null;
        }

        transform.position = originalPosition;
    }
}

使用 waitforseconds 調用該 IEnumerator 中的協程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM