2016-10-08 10 views
2

私はカーソルをアニメーション化するために使用しているコルーチンを持っています。コルーチンはこの開始、停止、再開後にコルーチンが2回実行されています

private IEnumerator AnimateCursor(Vector2 targetScreenPoint) 
{ 
    while (true) 
    { 
     // Do animation stuff   

     Debug.Log(targetScreenPoint.ToString()); 
     yield return null; 
    } 
} 

のように見えるすべては罰金、私はコルーチンを最初に起動したときに動作します。カーソルが動いたら、StopCoroutine("AnimateCursor")を呼び出してコルーチンを停止し、targetScreenPointパラメータの新しい値でコルーチンを再開します。

私はコルーチンをもう一度起動すると、アニメーションカーソルが元の位置に描画され、Debug.LogtargetScreenPointという最初の値と第2の値の両方を表示します(なぜなら、コルーチンが各更新ループで2回実行されているからです)。

StopCoroutine("AnimateCursor")StopAllCoroutines()に置き換えた場合、正しく動作し、コルーチンが2回目に起動すると、2番目の値はtargetScreenPointになります。

何が起こっているのか知っていますか?

EDIT:デバッガの実行中にカーソルがまだアニメーション表示されていたのは間違っていました。私は問題が私のStopCoroutineであると思うが、私は理由を知らない。コルーチンがパラメータを取る場合、私はコルーチンを停止しなければならないという特別な方法はありますか?

+0

は、あなたが 'StartCoroutine( "AnimateCursor")のコードを投稿してくださいでした;'。私はあなたが間違ってそれを開始するかもしれないと思っています。あなたがそれをループまたは 'Update()'に入れて、あなたが気づいていないことをしたとしましょう。 –

+0

'StartCoroutine'は2度しか呼び出されないと確信しています。私はデバッガを踏んで、その行に2回だけヒットします。私は 'StopCoroutine'を呼び出した後にアニメーションが停止するのが間違っていたので、元の質問を編集しました。 –

+0

あなたは 'StartCoroutine(" AnimateCursor "、targetScreenPoint);'(文字列の分散)を使用しますか? 'StopCoroutine(" AnimateCursor ")'は、その文字列の分散を使用する場合にのみ機能します。あなたが 'StartCoroutine(AnimateCursor(targetScreenPoint));'を使うと、それはできません。 –

答えて

1

StartCoroutine("AnimateCursor", targetScreenPoint); - 文字列の分散を使用する必要があります。

StopCoroutine("AnimateCursor")は、その文字列の分散を使用する場合にのみ機能します。

StartCoroutine(AnimateCursor(targetScreenPoint)); - IEnumeratorの差異を使用する場合、コルーチンを停止する方法はありません。

-1

「正しい」回答として選択されたものが正しくありません。 StartCoroutineCoroutineを返します。StopCoroutineは、コルーチンを停止する代替オーバーロードとして受け入れることができます。例では

/// <summary> 
    /// Not that it makes any sense to start a Coroutine just to stop it... 
    /// </summary> 
    public void StartAndThenImmediatlyStopCoroutine() 
    { 
     Coroutine coroutine = StartCoroutine(MyCoroutine()); 
     StopCoroutine(coroutine); 
     Coroutine anotherCoroutineExample = StartCoroutine("MyCoroutine");//Ewww... String based co-routine starting. This breaks Find All References in Visual Studios so you can't actually know where it's being called. 
     StopCoroutine(anotherCoroutineExample); 
     Coroutine evenMoreCoroutine = StartCoroutine(MyCoroutineWithParamaters(1, 2.2f, "Paramater Routines Rock!!!")); 
     StopCoroutine(evenMoreCoroutine); 
    } 

    public IEnumerator MyCoroutine() 
    { 
     yield return new WaitForSeconds(1.0f); 
    } 

    public IEnumerator MyCoroutineWithParamaters(int myNumber, float myFloat, string myString) 
    { 
     yield return new WaitForSeconds(1.0f); 
    } 
+0

私はリンクを追加しましたが、引数としてコルーチンを取るオーバーロードを見つけることができませんでした。彼のコメントにリンクを投稿してください。私はそれを編集します。 – Arkadiy

+0

誰かがそれを編集したようです。もしあなたがArkadiyありがとう! – DietChugg

関連する問題