Unityの場合、各プラットフォームに対応した形でコンパイルされるため、マルチスレッドに対応していないプラットフォーム(WebGLとか、WebGLとか、WebGLとか)なのにマルチスレッドの処理を書けちゃったら大変なことになりますもんね。コルーチンの目的ゲームの実行においては、可能な限り全ての処理を最短の時間で終わらせることが必ずしも正しいとは限りません。いうのも、画面に表示される要素をフェードイン/フェードアウトさせる演出が必要ですし、ウェイトを導入して間を取ることも必要なためです。時間を使って処理させることも大事なんです。以下の例は画面のフェードインを実装してみたもの。左はコルーチンを使わずに一瞬で画面を表示し、右はコルーチンを使って2秒かけて画面のフェードインを行っている例です。ゲーム開始後から少しの間だけ画面が消えているのを入れておきたかったので、Update()の中で10フレーム経過をトリガーとして処理を開始しています。画面が切り替わるのは、意図した演出でない限りは避けた方が無難です。GIFなので徐々に変化する右側が汚くなってるのには目を瞑ってください。信じてください!フェードなし(左)とフェードあり(右)こういった場合にコルーチンを使うのが最適です。ゲームのプレイヤーが視覚的に知覚できるよう画像のアルファ値をフレームごとに段階的に変化させてレンダリング(画面の描画)をしたり、指定時間待って処理を続けることで間を演出したりできます。コルーチンを使うケースというのは、マルチスレッドのように複数CPUを使った並列処理でCPU時間を減らす、という目的とはまたちょっと違うんですよね。目的に応じた使い分けが大事です。Systemが便利です。新規にスレッドを立てる代わりにジョブを発行して、Unity側で起動済みの暇してるワーカースレッドに「お、君暇そうだね。定時(フレーム)内で終わらせてね」なんて仕事を割り振る上司のような機能です。値型しか渡せない制約はあるものの、メインスレッドの負担を減らせるのでCPU時間の削減にはもってこいです。Systemについてはまた別途。コルーチンを使おう!肝心の使い方ですが、戻り値がIEnumeratorのメソッドを用意し、それを任意の場所からStartCoroutine(<コルーチンの名前>)で呼ぶ、という流れ。IEnumeratorはアイ・イニュメレイターとかアイ・エニュメレイターなんて発音します。カタカナ表記は難しい......。先頭に『I』が付いていることから、インタフェースであることが分かります。何のためのインタフェースかというと、C#でコレクション(要素のまとまり・グループ)の中身を見る時に、現在の位置を知るためのプロパティである『Current』や、次の要素に移動させるためのメソッドである『MoveNext()』などを実装するインタフェースなんです。(System.Collections)https://msdn.microsoft.com/ja-jp/library/system.collections.ienumerator(v=vs.110).aspxコルーチンの場合だと、一度中断して指定した時間が経過して処理を再開する時に、どこまで処理を行ったのか知っておく必要があります。このインタフェースを使っているんじゃないかな(想像)StartCoroutineはMonoBehaviourから継承されるメソッドで、UnityEngineの内部にあるソースなので中身が見れず、想像するしかないのよね。......とまぁ説明したものの、初心者の頃は文章で読んでも意味が分かりませんでした。使用例を見ちゃいましょうか。Gist.実装したのは、コルーチンを開始して1秒待ってから待ち時間を出力する機能です。戻り値がIEnumeratorのメソッドであるDelayProcessを定義し、それをStart()の中からStartCoroutineを使って起動しています。IEnumeratorを使う場合にはSystem.Collectionの名前空間を記述しておく必要があります。スクリプトファイルを作成した時に自動的に出力されているはずですが、ない場合は自分で追加しましょ。コルーチンの中身では開始された時刻をローカル変数のstartTimeに保存し、WaitForSecondsによって引数で指定された秒数だけ処理を中断します。再開後にその時刻をendTimeとして取得し、だいたい指定秒数だけ経過していることを確認します。returnを跨いでもスコープの外に出ないので、最初に宣言したローカル変数startTimeも使えています。適当なGameObjectにスクリプトをアタッチしてゲームを実行すると、以下のメッセージが出力されます。*』でウェイト処理が入ってから後続のデバッグ文が出力されています。これを使えば、例えばキャラクター同士の会話で間を簡単に作ることができますね。指定秒数』を超えていたら続きの処理を行う、といった条件になっているみたい。実行するたびに微量だけど終了時刻が前後します。スクリプトリファレンスにも同様の記述があるのでそちらもご覧あれ。興味深いのはデバッグ文の出力順。通常のメソッドであれば、Start()の中に書かれた処理は上から順番に実行されるので、そのメソッド内の処理が終わってから後続の処理が実行されます。今回の例でいえば、DelayProcessが終わってからDebug.Log(“コルーチンを起動しました”);が実行されるイメージ。returnで処理を中断するまでは同じフレームで実行され、中断後はStart()に戻ってDebug.Log(“コルーチンを起動しました”);が実行されています。順番に何らかの値を操作したい場合には、実行順に気をつける必要があるかもしれません。いえコルーチンを使ってそこまで厳密にしなきゃいけないケースもそうそうないかな。まとめコルーチンとは処理を中断した後、同じ部分から続けて再開できる処理のまとまり。ウェイト処理や、数フレームかけて値を変える処理など、時間操作系の処理を行いたい時に便利です。メイン処理の裏で非同期的にリソースをロードしたりする処理も実装可能なので、これが使えると表現の幅がぐっと広がります。みんなで使おうコルーチン。ゲーム開発の攻略チャートを作りました!「ゲームを作ってみたいけど、何から手を付けていいか分からない!」そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。投稿一覧Unityを使ってアプリを作ったり、Assetを作ったりしてる個人開発者。Unity全般ネタとAsset開発の情報を扱っています。Asset開発は日本語の情報が少ないのよね。ことで些細なネタでも情報を蓄積するのが目的です。2019.07.24Unityで頻出する単語を中心に簡単な用語集を作りました。2018.05.09Unityを複数バージョン保持する方法について。2018.05.27Unityで実行するスクリプトの順番を指定する方法を紹介しています。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。todoUnityのアセットを作ったり、スマホ向けのアプリを作っています。このブログではUnity初心者に向けたチュートリアルやテクニックを放出しています。詳しいプロフィールはこちら。お仕事の相談や現在提供中のサービスについては、こちらの『サービス内容』のページをご覧ください。Explorers_todoオンライントレーニングのサイトをオープン!エクスプラボを運営しているtodoが、より集中的にゲーム作りについて学べるオンライントレーニングのサイトをオープンしました。エクスプラボのトレーニングルーム』です。勉強したことの進捗も表示できるようになっているので、どれだけ頑張ったのかが分かるようになっています。ゲーム開発の攻略チャート』というe-bookをプレゼントしています。メルマガではゲーム開発のテクニックを中心に役立つ情報をお届けします。詳しくはこちら!お仕事の依頼はこちら!ゲーム開発のサポートも可能!エクスプラボではゲーム開発のサポートのサービスも行なっています。いう場合にオススメのプランです。詳細はこちら!もちろん、普通に開発依頼をいただいてもお手伝いします。その場合はお問い合わせへ。【Unity】ポストプロセシングを使って簡単にプロっぽいゲーム画面を作るゲームの作り方を学べるオンライン講座のサイトをオープンしました!RANKING【Unity】Mathfの切り上げ、切り捨て、偶数丸め。使い分けが大事よねMathf【Unity】ゲームといえばランダム要素。(12)作ったアプリ空とにゃんこと風船と癒し系縦スクロール避けゲーの『空とにゃんこと風船と』(TODOWORKS名義でリリース)気軽に遊べるスマートフォン向けアプリです。ボクセルアートで彩られるどこかレトロ、でも新しい世界で癒されてみませんか?ぼく、猫ですって!タップ系RPG『ぼく、猫ですって!』(TODOWORKS名義でリリース)気軽に遊べるスマホRPG。