Unity 5.3のカスタムコルーチン

みなさんこんにちは。 これは公式のUnityエンジンブログからの記事の翻訳です。 バージョン5.3で登場した独自のコルーチンを作成する方法について説明します。







Unity 5.3のすばらしい新機能の中で、私にとって有用であることが判明した小さなものを1つ見つけました。それはあなたにとっても役立つと思います。 これらは、 CustomYieldInstructionクラスで表されるカスタムコルーチンです。 そのおかげで、独自のコルーチンイールドステートメントを非常に簡単に作成できます。 これを実際の例で見てみましょう。



実例-バグ修正



私は最近、Unity 5.2に登場したDropdownユーザーインターフェイス要素のバグを研究しました。 Time.timeScaleタイムスケールを0に設定すると、ドロップダウンは1回だけ機能し、その後、タイムスケールがゼロ以外の値に設定されるまで再び表示されませんでした。



短い検索の後、Showメソッドで問題が発生することがわかりました。





m_Dropdown変数はnullではないため、ドロップダウンが表示されません



最初の表示後、m_Dropdownは折りたたまれて破棄されます。 はい、破棄する必要がありますが、Time.timeScaleがゼロの場合、これは起こりません。



killメソッドを見て、問題を見つけてください。





翻訳者からのメモ
コードの元の記事(およびここ)にエラーがあります-m_Items.Clear()の呼び出しはforループの後であり、ループ内ではありません。 ヒントをくれたHruksに感謝します。



この記事のタイトルのおかげで、問題はWaitForSecondsにあると推測できます。 このクラスはスケーリングされた時間を使用します。 つまり、WaitForSecondsに0.5のタイムスケールで1秒待機するように要求すると、実際には2秒が経過します(1 / 0.5 = 2)。 時間スケールが0の場合、無期限に待機する必要があります(スケールがゼロ以外になるまで)。 WaitForSecondsクラスを使用しているため、ドロップダウンが最初に使用された後に破棄されることはありません。



解決策



リアルタイムを使用して遅延を実装する必要があります。 最もエレガントなアプローチは、新しいyieldステートメント( WaitForSecondsRealtimeクラス)を作成することです 。 もちろん、独自の開発者が一定の時間を使用してWaitForSecondsを実装しなかった場合は、それらを知らせる必要があります。 WaitForSecondsRealtimeはこの約束を増幅します。 また、WaitForSecondsのドキュメントを更新する必要があります。これは、どこでもスケーリングされた時間を意味するものではないためです。



そこで、新しいyieldステートメントを作成するために最近追加されたCustomYieldInstructionクラスを発見しました。



新しい演算子の追加は非常に簡単で、これが問題の解決策になります。





カスタムyieldステートメントでは、 keepWaitingプロパティをオーバーライドする必要があります。 プログラムを続行したい場合、このプロパティはfalseを返す必要があります



バグ修正は次のようになります。





この例では、リアルタイムで各チェックと比較します。 これはもっと簡単なことではありません...新しいyieldステートメントWaitUntilWaitWhileでもっと簡単にできます。 それらを使用して、チェックのために呼び出されるデリゲートを転送できます。



問題を解決する別の方法を次に示します(5秒の遅延を作成したい場合)。





ですから、それはシンプルですが、潜在的に幅広い機会でした。 ここでのモラルは次のとおりであると考えています。リリースバージョンの説明を読むことを忘れてはいけません。 また、カスタムコルーチンが気に入った場合は、 UnityEventsをご覧ください。これは私がお気に入りの機能の1つです。



All Articles