1

問題は以下の通り。タイピング ゲームのバリエーションを作成しています。私の問題は、char 配列をループして、ユーザーが正しいキーを押しているかどうかを確認する必要があることです (ユーザー入力を待機する要件を導入しています)。右のキーが押されたら、while ループを停止して for ループに戻り、最初からやり直す必要があります。しかし、リターンを譲ると、両方のループが終了し、Unreachable Code Detected が発生します。

これは、for ループが残りの繰り返しを実行できないことを意味することを知っています..では、どこで譲歩/戻りますか?

IEnumerator TestMyCoroutine() {

    for (int i = 0; i < gCharArray.Length; i++) {
        string charHolder = gCharArray[i].ToString();

        while (true) {

            if (Input.anyKeyDown) {

                if (Input.GetKeyDown(charHolder)) {

                } else {

                    print("Wrong Letter");

                }
                print(charHolder);

            }

            yield return null;
        }
    }
    print("Word Typing Ended");
}
4

2 に答える 2

2

yield returnループの実行を停止するのではなく、(本質的に) ループを一時停止し、現在の値を返します。再開すると、まだループ内にあり、ループでwhile(true)あるため、そこにとどまるため、ステートメントi++は実際には理論的に到達できません。また、print("Word Typing Ended");配列に要素があるかどうかはわかりません。

while従来のステートメントを使用してループを終了できbreakます。または、基本的に列挙子の実行を終了したい場合は、を使用することもできますyield break


それとは別に、yieldオブジェクトの複雑なコレクションを簡単に返すために使用する必要があります。要素の取得にオーバーヘッドが含まれる可能性がある場合、または要素が以前の状態に依存しているが、それ自体は比較的副作用がないはずです。yield return null既存の配列を処理するために使用することは、機能の誤用であると確信しています。

実際にやりたいことを説明してみてください。譲歩を必要としない解決策があるかもしれません。

于 2015-12-16T09:19:46.767 に答える
2

右のキーが押されたら、while ループを停止して for ループに戻り、最初からやり直す必要があります。

それで… continue;

しかし、リターンを譲ると、両方のループを終了し、到達不能コードが検出されます。

いいえ、yield returnループを終了しません。実行は元の場所から再開されます。

「到達不能なコードが検出されました」と表示される理由は、while(true)決して終了しないためi++です。break;: の中に a を追加するwhile (true)と、正しく機能します。yield break;a を追加して列挙子全体を終了することもできますが、それでもに到達することi++はなく、到達不能としてフラグが立てられます。

于 2015-12-16T09:19:54.833 に答える