背景まずasync/awaitについて、(Unityでない)通常のC#開発の場合がどうとか、Unityで何が問題で使えなかったかとか、Rxとの住み分けとかについて書こうかと思います。登場C#界隈で非同期処理がらみの話題がホットになったのはだいたい2010年前後からです。5.0のasync/awaitが主流になりました。普及にはみな慎重だったという辺りです。バージョンが古いUnityでは、いまだRxにかかる期待は大きいJavaScriptにもES7でasync/awaitが入り、(後述の住み分けはあるものの、それが合う場面では)async/awaitが主流になっていくと思われるということも言えます。async/awaitとRx今回、「Unityでもasync/awaitを使えるようにしたよ」という話をするわけですが、これでRxはお役御免になるかというとそうでもなくて、Rxの用途は残ります。push型で、ストリームデータを送ってもらう場合に有効という住み分けになります。サーバーからデータを受け取るような場合を想定すると、async/awaitがよさそうな場面はログイン時、ユーザーデータを一括で取りたいユーザーの行動時、即座に決まる範囲で行動の結果を返してもらいたいRxがよさそうな場面は他のユーザーの行動で自分が受ける影響を、サーバーからpush通知してほしいとかになります。4.0機能を先行取り込み)だったはず。C#は、古いフレームワーク上でも最新の言語機能を使えたりします。Frameworkバージョン」で書いていますが、ここで「2.0や3.0で動く」となっている機能は、コンパイラーさえバージョンアップすればUnity上でも使えます。6.0の新機能の大半は何もしなくても古いフレームワーク上で動きます。簡単なクラスの自作で動かせます。重たいですが、頑張って実装すれば動かせます(これが本稿の主題)。Integration)ロジックの大部分をUnityの外でコンパイルしてしまうとなります。後者のやり方をしています。Assetsフォルダー以下にコピーするスクリプトを書いて使っています。移植Unity上でasync/awaitを使おうと思うと、Taskクラスの移植が必要になります。Interlocked.CompareExchange<T>とかがiOS上(AOTコンパイル)で動かないという問題があって、移植は絶望的でした。IL2CPPが安定してきた今、やってみたら案外あっさり移植できたという状態です。MinimumAsyncBridge導入文でも書いていますが、あっさり動きすぎて、コミットが少なすぎて非アクティブに見える...まあ、「Minimum」という名前通り、Taskクラスのうち、async/awaitに必要な部分だけの実装になります。Runメソッド(別スレッドで処理を開始する)は実装していません。これに関しては、他の非同期処理ライブラリ(Unityのコルーチンとか、Rxとか)とつないで使う想定です。ちなみに、Rxに対するつなぎ処理も書いています。UniRx.AsyncBridgeIObservableに対するawaiter実装になります。2.8系のAOTコンパイルの制限に起因するものが多いです。それが、IL2CPPが安定してきたことによって少し緩和しています。3.0に留まる理由もなくなっていて、async/awaitのバックポーティングもうまくいっています。その移植したライブラリが以下のものです。ついて運営者について。