DONUTSでは、勤務地や事業部の垣根を越えて各エンジニアが主催する勉強会「Tech Talk」を定期的に開催しています。
今回は8月にDONUTS GAMES(ゲーム事業部)のエンジニアが主体となって開催されたTech Talk特別編についてレポートします。
DONUTSは外部顧問に、株式会社Cysharp CEOの河合宜文氏を迎えています。
河合氏はUnity製のゲームではほぼデファクトスタンダードとして使用されているUniRx、UniTaskをはじめとする数々のOSS(オープンソースソフトウェア)を世に送り出してきた、C#研究開発における第一人者です。
本講演では、河合氏にご登壇いただき、ご自身が開発したUniTask、UniRx、そしてUniRx後継であるR3のそれぞれのメリットや使い分けなどについて特別にご講演いただきました。
はじめに、UniTaskおよびUniRx(R3)を理解する上で重要となる非同期処理の仕組みを、非同期を同期的に扱う仕組みである「async/await」と合わせて紹介しました。その上でUniTask、UniRx(R3)をどのように優先的に使うべきか説明がありました。
また、Unity6(プレビュー版)で導入されている型「Awaitable」にも触れながら、UniTaskとの類似点や相違点などを紹介しました。
UniTaskについて
UniTaskは、Unity用に最適化された非同期処理の仕組み「async/await」を導入できるライブラリです。
最近では世界中で人気の大型タイトルにも採用されており、世界各国の様々なタイトルで導入されている信頼性の高いOSSです。DONUTSでも「Tokyo 7th シスターズ」、「D4DJ Groovy Mix」、「ブラックスター -Theater Starless-」などほぼ全てのタイトルに採用しています。
講演内では、ゲームでの採用率が高い理由について、UniTaskで導入されている「async/await」の考え方を導入することで、同期処理とほぼ変わらず非同期処理を実装でき、 .NET Taskと比較してゲームに必要な処理がほぼUniTaskで実現できることが挙げられました。
続けて最新版のUnity6(プレビュー版)で導入されている「Awaitable」にも言及。河合氏いわく、「Awaitable」はコルーチンの完全互換を目指しているので、「async/await」を活かした機能としては不足しており、あくまでUnityでの非同期処理に使えるパターンを定型化して提供しているとの説明がありました。
そして補足として、UniTaskを導入したとしても非同期処理は難しい、という話題に。見た目は正常系や同期と一緒になっているが、非同期になることでやれることが増えているため、どうしても途中で処理を止めるキャンセル処理が必要とされ、適切なハンドリングが難しいと話されていました。
解決策として、自分の中で答えを持っておくことが大事である、とのアドバイスもあり、参加者は熱心に耳を傾けていました。
UniRx(R3)について
続くUniRx(R3)の説明パートでは、トピックの冒頭でUnite2017で行われた「黒騎士と白の魔王」のUniRx活用事例セッションが紹介されました。
河合氏いわく、同タイトル内でUniRxを使用して実現した「シーン遷移」「各シーンの起動ポイント」「アセットロード」「通信」「アニメーション」の部分などが現在はほぼUniTaskで実現できることが紹介されました。ただ、その上で、UniRxの後継であるR3の使いどころはある、とのこと。
最近リリースされたばかりのR3ですが、前身となるUniRxがリリースされたのは2014年で既に10年が経っています。10年が経過しても数々のUnity製タイトルで使用されているUniRxですが、R3になることで様々な点が改善されているとのことでした。
なぜ10年たって後継を出したのか?という疑問については、UniTask登場、「async/await」以降UniRxの価値が低下したこともあり、後継のライブラリとしてR3が開発された経緯があったものの、UniRxとの完全な互換性は無いそうです。
さらにUniRxからR3への変更・追加点として、
・「async/await」との共存、統合を意識してモダンC#を活用し現代的に再設計されている
・Observable Tracker(中央集権管理機能)を実装することでメモリーリークの箇所を特定しやすくなっている
ことが紹介されました。今年リリースされたばかりのライブラリですが、早速採用しているアプリもあるとのことでした。
まとめ
最後に、本講演のまとめとして、
・単一の非同期は必ずUniTaskで扱っていくこと
・その上で非同期の最上流のパターンを作ることと、メモリーリークを起こさないようCancellationTokenは(原則)必ず渡すこと
また、R3を使用する上では、
・複数の非同期シーケンスを扱う際にR3の使用を推奨すること
・複数の非同期シーケンスを合成できるが、複雑なコードになりやすいので、「async/await」で手続き型コードにばらしても良いこと
など、それぞれの注意点とメリットについて説明がありました。
最新版のR3について河合氏は、「かなり使いやすい良いライブラリが開発できたと自負しているので、ぜひ使ってほしい。」と話し、約1時間半に及ぶ充実の講演を締めくくりました。
その後の質問コーナーでは、「Unity6のAwaitable機能との共存について、使いどころ」など熱心な質問が寄せられ、講演終了後も議論が盛り上がりました。
DONUTSでは勉強会を多数開催!
DONUTSでは今回開催されたTechTalk以外にも、UIデザイナーが主体となる「UIデザイン勉強会」、社内のエンジニアの体験談やレビューを語る「CodeCafe」、社外の方にも参加いただける「DONUTS Engineer Meeting」など、社員有志による勉強会を多数開催しており、今後もさまざまなイベントを開催してまいります。
タイトル | 過去講演内容(一部) |
TechTalk | 「エンジニアによる、エンジニアのための、人材育成テクニック(リベンジ)」「NO MORE DEADLOCK」「【学生時代の研究】教材向けのゲーミフィケーションに用いる視覚的表現に関する研究」 |
UIデザイン勉強会 | 「ゲームにおけるフォントの使い方と運用入門」「初心者向けUI演出作成のはじめかた」 |
CodeCafe | 「UnityDebugSheetを導入した話」「StreamDeck 買っちったので紹介する」「AWS LambdaでSlackのスラッシュコマンドを作ってみた」 |
Engineer Meeting | 第6回 「電子カルテのアプリケーションエンジニアが影でやっていること〜スタートアップからの転換期〜」「技術多様性と統合のジレンマ 〜ジョブカンにおけるDevOps改革〜」 |
また、DONUTSでは一緒に働く仲間を募集しています。
選考に関係なく事業や業務のお話をするカジュアル面談も随時受け付けていますので、気になる求人がありましたら、ぜひご応募ください。
DONUTSの最新ニュースはこちら
https://www.donuts.ne.jp/news/2024/