「3秒待ってから爆発させたい」「ロードが終わったら画面を切り替えたい」——“待つ処理”を書こうとして検索すると、コルーチンで書く例と async/await で書く例の両方が出てきて、「結局どっちを使えばいいの?」と手が止まる。Unity開発で誰もが一度は通る分かれ道です。
結論から言うと、両者は競合ではなく、得意分野が違う道具です。この記事では仕組みの違いをイメージで掴み、迷わず選べる使い分け基準、Unity 6で加わった公式のAwaitable、そしてasync特有の落とし穴(破棄されたオブジェクト問題)までを整理します。
この記事でわかること
- コルーチン(フレーム駆動)とasync/await(完了待ち駆動)の仕組みの違い
- 「演出はコルーチン、IO・通信はasync」という使い分けの理由
- Unity 6の公式
Awaitableでできること- asyncの落とし穴:破棄されたオブジェクトで処理が続く問題と
destroyCancellationToken
2つの仕組みをイメージで掴む
まず、両者が「待ち」をどう実現しているかをイメージで比べます。

コルーチンは「フレームの列車」に乗る仕組みです。yield returnのたびに処理を中断し、次のフレーム(あるいは指定した条件のフレーム)で続きから再開します。Unityのゲームループに完全に同期して進むため、「毎フレーム少しずつフェードさせる」のようなフレーム単位の演出と好相性です。詳しい書き方は コルーチンの記事 で解説しています。
async/awaitは「担当者に依頼して完了を待つ」仕組みです。awaitした処理(ファイル読み込み、通信、アセットのロードなど)が終わるまでメソッドの続きが保留され、完了したら再開します。フレームとは無関係に「仕事が終わったかどうか」で進むのが特徴です。
// 同じ「1秒待ってから表示」を2通りで書くと——
// コルーチン版:フレームの列車に乗る
IEnumerator ShowAfterOneSecond()
{
yield return new WaitForSeconds(1f);
panel.SetActive(true);
}
// async/await版(Unity 6のAwaitable使用):完了を待つ
async Awaitable ShowAfterOneSecondAsync()
{
await Awaitable.WaitForSecondsAsync(1f);
panel.SetActive(true);
}
この例だけ見ると同じに見えますが、得意分野の差は「何を待つか」が複雑になるほど開いていきます。
コルーチンが向いている場面
ゲーム内の時間・フレームに紐づく処理はコルーチンの領分です。

- 演出: フェードイン、点滅、ノックバック、カメラシェイクなど「毎フレーム少しずつ」系
- フレーム同期が必要な処理:
yield return nullで1フレーム待つ、WaitForFixedUpdateで物理更新を待つ - GameObjectの寿命と運命を共にしたい処理: コルーチンはGameObjectが破棄されると自動で止まるため、後始末を考えなくていい
3つ目が地味に重要です。敵の点滅演出中にその敵が倒されても、コルーチンなら勝手に止まってくれます。
async/awaitが向いている場面
「ゲームの外」の仕事の完了を待つ処理はasync/awaitの領分です。

- ファイルの読み書き: セーブデータの非同期保存・読み込み
- ネットワーク通信: ランキングの取得、APIの呼び出し
- アセットのロード: Addressablesの
LoadAssetAsyncは、返ってくるハンドルのTaskプロパティをawait handle.Taskの形で待てる - 戻り値が欲しい非同期処理: コルーチンは値を返せないが、
async Task<T>/async Awaitable<T>は結果を返せる
using UnityEngine;
public class SaveService : MonoBehaviour
{
// 戻り値を返せるのがasyncの強み(コルーチンにはできない)
public async Awaitable<string> LoadRankingAsync()
{
await Awaitable.WaitForSecondsAsync(0.5f); // 通信の代わりのダミー待機
return "1位: 12000点";
}
}
「完了に何フレームかかるか分からない仕事を待ち、結果を受け取って続きをする」——この形が出てきたらasyncの出番です。
Unity 6の公式サポート:Awaitable
かつて「Unityでasync/awaitはひと工夫必要」と言われた理由は、コルーチンのyield returnに相当する公式の待機部品がなかったからです。Unity 6(2023.1以降)では Awaitable クラスが標準搭載され、この差がほぼ埋まりました。
| やりたいこと | コルーチン | async/await(Awaitable) |
|---|---|---|
| 秒数を待つ | yield return new WaitForSeconds(1f) | await Awaitable.WaitForSecondsAsync(1f) |
| 1フレーム待つ | yield return null | await Awaitable.NextFrameAsync() |
| 物理更新を待つ | yield return new WaitForFixedUpdate() | await Awaitable.FixedUpdateAsync() |
| フレーム描画の最後まで待つ | yield return new WaitForEndOfFrame() | await Awaitable.EndOfFrameAsync() |
書き味が揃ったことで、「asyncで統一したい派」も公式機能だけで実現しやすくなりました。とはいえ次の注意点を知るまでは、安易な全面移行はおすすめしません。
注意点:asyncはオブジェクトが死んでも走り続ける
コルーチンとasyncの最大の性格の違いがここです。コルーチンはGameObjectの破棄で自動停止しますが、asyncメソッドは止まりません。

シーン遷移や敵の撃破でオブジェクトが消えたあともawaitの続きが実行され、破棄済みのコンポーネントに触ってエラー——これがasync移行時の定番バグです。対策は、MonoBehaviourが標準で持つ destroyCancellationToken を渡すことです。
using UnityEngine;
public class ExplosionTimer : MonoBehaviour
{
async void Start()
{
// このGameObjectが破棄されたら、待機ごとキャンセルされる
await Awaitable.WaitForSecondsAsync(3f, destroyCancellationToken);
Explode(); // 破棄済みなら、ここには到達しない
}
private void Explode()
{
Debug.Log("爆発!");
}
}
補足: キャンセルされた
awaitは例外(OperationCanceledException)で中断されます。async voidの最上位まで届いた例外はUnityエンジンが受け取り、Consoleにログとして出力されます(静かに消えるわけではありません)。キャンセルを「正常な終了」として扱いたい場合はtry-catchでOperationCanceledExceptionを受け止めるのが確実です。ここが「コルーチンより一段むずかしい」と言われる所以です。
おまけ:先に知っておくと良いこと
使い分けの土台ができたら、次はこのあたりが視野に入ってきます。
- コルーチンの基本を固める:
yield returnの種類や止め方は コルーチンの記事 で整理できます。本記事の前提です。 - 実戦の定番ライブラリ UniTask: コミュニティ製の
UniTaskは、Awaitable登場以前からUnityのasyncを支えてきた定番です。GC負荷ゼロの待機や豊富な演算子など、公式より強力な部分も多く、asyncを本格採用するなら一見の価値があります。 - asyncが本領を発揮するロード処理: シーンやアセットの非同期ロードは相性抜群の応用先です。SceneManagerの記事 のLoadSceneAsyncや Addressables入門 が実践の場になります。
まとめ
コルーチンとasync/awaitは、どちらが新しい・偉いではなく役割が違う道具です。
- コルーチン: フレームの列車に乗る仕組み。演出・フレーム同期・GameObjectと寿命を共にする処理に。破棄で自動停止が強み。
- async/await: 完了待ち駆動の仕組み。ファイルIO・通信・アセットロード・戻り値が欲しい処理に。
- Unity 6の
Awaitableで、秒待ち・フレーム待ちなどコルーチン相当の待機がasyncでも公式に書けるようになった。 - asyncは破棄後も走り続ける。
destroyCancellationTokenでキャンセルを仕込むのが鉄則。 - 両者は併用してよい。「ゲーム内の時間はコルーチン、ゲーム外の仕事はasync」から始めるのが現実的。
どちらか一方を覚えて満足せず、「この待ちはフレームの話か、仕事の完了の話か?」と問いかける癖をつければ、迷いは消えていきます。