ニートが学ぶUniRx C#7.0とUniTask

はいどーもこんばんは非同期処理の申し子です。
非同期処理が苦手で苦手でたまらない僕ですが、本日は重い腰をあげてUniRxとasync/awaitをUniTaskで併用してみようと思いますよ。
参考にする記事は以下のものです。
http://neue.cc/2018/07/12_567.html

C#7.0を動かす

UniTaskを使うにはC#7.0の機能が必須のようです。
というわけで、まずはUnityでC#7.0の機能を動かせるようにしなければなりません。
https://forum.unity.com/threads/unity-incremental-c-compiler.523993/
上記の記事の「Installation Instructions」を参考にやればOKです。
なお、マニフェストの部分のバージョンが0.0.30になっていますが、現在はもう少し新しいものが出ているようですね。

試してみる

C#7.0の導入が終わったところで、「ニートが学ぶUniRx コルーチンとの連携」で書いたコードをUniTaskバージョンに変えてみます。
なお、UniRx.Async名前空間のusingが必須となります。

「コルーチンからIObservableに変換する」の項目ならこうですかね……。
あんまり自信ないですが……。

続いて「yield returnとの合わせ技」に挑戦しましたが、UniRx.Asyncバージョンへの書き換え方法が不明だったので飛ばします。

次は「コルーチン内部でOnNextを直接発行する」ですが、これも同上。

「IObservableからコルーチンに変換する」の項目はいけそうでした。
こんな感じですかね。

「コルーチンを直列に実行して待ち受ける」もやってみました。
これは確かにUniRx.Asyncバージョンの方が書きやすいですね!

最後は「複数コルーチンを同時に起動して結果を待ち受ける」です。
以下のようにすると、ひとまずは元のコードとほぼ同じ感じで使えました。

ただこれが意図された使い方なのかと言えば……ウーン。
ちょっと自信がありません。

戻り値を取得してみる

これは元のコードにありませんが、UniTaskを通じて戻り値を取得してみます。

TestAsyncを実行すると、合計6秒待ってからランダムな数字を返します。
ちなみにですが、「var result = await TestAsync();」のawaitを取り除くとこのコードはうまく動きません。

終わりに

僕レベルではUniTaskを使いこなすのは難しい、ということがわかりましたw
やはり解説してくれている記事が少ないのが難点ですね。
UniRxとの合わせ方が皆目検討もつきません。
ただ要所要所で便利そうなのは感じているので、いけそうなところでは使いたい気持ちもあります。

落胆しつつも、ほなそんな感じでまた。

フォローする