2017-05-04 8 views
-1

こんにちは、私はこのエラーが発生しました。 アセット/ TCG/Scripts/card.cs(1232,71):エラーCS1622:値をイテレータから取得します。値を返すためにyield returnステートメントを使用するか、反復を終了するためにブレークするUnity c#イテレータから値を返すことはできません。値を返すためにyield returnステートメントを使用するか、繰り返しを終了するためにブレークする

コードを見て回っていて、私はそれを修正することはできませんが、私はそれを修正しましたが、あなたが穴コードを必要とするなら、それは私がそれを追加することを教えてください、エラーが示す部分です。

IEnumerator PayAdditionalCostAndPlay() 
{ 
    if (DiscardCost > 0 && ValidSpell()) 
    { 
     Player.ActionCancelled = false; 
     Player.targets.Clear(); 
     Debug.Log("this card has an additional discard cost"); 

     for (int i = 0; i < DiscardCost; i++) 
     { 
      Player.NeedTarget = 21; // a card in hand to discard 

      while (Player.NeedTarget > 0) 
      { 
       yield return new WaitForSeconds(0.1f); 
      } 
      if (Player.ActionCancelled) 
      { 
       Debug.Log("action cancelled"); 
       return false; 
      } 
     } 

     foreach (GameObject target in Player.targets) //discard 
     { 
      target.GetComponent<card>().Discard(); 
     } 
    } 
} 

答えて

0

私の疑惑は、ActionCancelledがtrueに設定されているときにコルーチンを終了しようとしていることです。ちょっと修正すれば、これで終わります。

あなたはコルーチンに値を返すことはできませんが、何を行うことができますが、外部メソッドを呼び出すと、あなたは共同ルーチン内returnを使用することはできません(それのトラックにforloopを停止)

IEnumerator PayAdditionalCostAndPlay() 
    { 
     if (DiscardCost > 0 && ValidSpell()) 
     { 
      Player.ActionCancelled = false; 
      Player.targets.Clear(); 
      Debug.Log("this card has an additional discard cost"); 
      for (int i = 0; i < DiscardCost; i++) 
      { 
       Player.NeedTarget = 21; // a card in hand to discard 

       while (Player.NeedTarget > 0) yield return new WaitForSeconds(0.1f); 
       if (Player.ActionCancelled) 
       { 
        Debug.Log("action cancelled"); 
        OnPlayerActionCancelled(); // optional, obviously 
        break; // stop processing the for-loop 
       } 
      } 
      if (!Player.ActionCancelled) 
      { 
       foreach (GameObject target in Player.targets) //discard 
        target.GetComponent<card>().Discard(); 
      } 
     } 
    } 

    private void OnPlayerActionCancelled() 
    { 
     // Do something when a player action is cancelled 
    } 
0

単方法ができないの両方yield returnreturn。どちらか一方を選択する必要があります。

2

を破るれますコルーチン実行を停止したい場合は、次のようにreturn falseの代わりにyield breakを使用してください。 -

IEnumerator PayAdditionalCostAndPlay() 
{  
    if (DiscardCost > 0 && ValidSpell()) 
    { 
     Player.ActionCancelled = false; 
     Player.targets.Clear(); 
     Debug.Log("this card has an additional discard cost"); 
     for (int i = 0; i < DiscardCost; i++) 
     { 
      Player.NeedTarget = 21; // a card in hand to discard 

      while (Player.NeedTarget > 0) 
       yield return new WaitForSeconds (0.1f); 
      if (Player.ActionCancelled) { 
       Debug.Log("action cancelled"); 
       yield break; 
      } 
     } 
     foreach (GameObject target in Player.targets) //discard 
      target.GetComponent<card>().Discard(); 
    } 
} 
関連する問題