【Unity】Boltで作ったゲームでAOTのエラーが出るときの対処

【Unity】Boltで作ったゲームでAOTのエラーが出るときの対処

ちょっと前、『サンダーボルトユニティちゃん』というゲームをリリースしました。

 

「よーしBoltでフローをうまく作れたぞ!」なんて意気揚々とこのゲームをビルドした時に、ブラウザでゲームを実行すると音だけ流れて画面が真っ暗になるという恐ろしい事態に出会ったので今日はその話を。

このエラーに出会った際、ブラウザのコンソールを覗いてみるとこんなエラーが……。

大量のエラー
大量のエラー

 

毎フレーム出力されるので数字が大変なことになっていました。LudiqはBoltの開発元なのでBoltで何かが起きているようです。気になるのは「ahead of time (AOT)」の文字。この辺りを中心に探ってみることで、解決の糸口が見つかりました。

ネタバレすると、Boltのマニュアルにも書いてあることだったのでちょっと恥ずかしいのですが、AOT Pre-Buildをしていないことが原因でした。

 

Boltのインストール方法などについては以下の記事もご参照くださいませ。

 

 

 

環境

macOS Catalina 10.15

Unity2019.4.4f1

Bolt 1.4.12

 

エラーの内容

上でも画像で表示した内容ですが、文字に起こしてみます。

ExecutionEngineException: Attempting to call method ‘ほにゃらら’ for which no ahead of time (AOT) code was generated.

AOTのコードがないよーというのがエラーメッセージの主旨です。

AOT(Ahead Of Time)とは「事前に」という意味で、スマホやWebブラウザで動かすゲームの場合、事前にコンパイルされたデータを使ってゲームを動かすことが多いです。

AOTの他に、JIT(Just In Time)でコードを実行する方法も存在しています。こちらは「実行中に」「必要に応じて」という意味で、その名前の通りアプリケーションが実行中にコンパイルして機械語にコンパイルしています。モジュール単位、メソッド単位でコンパイルをすることで、必要に応じた部分だけ使うことができます。これによって動作速度を上げるのが目的です。

しかし、モバイルなどのリソースが限られたプラットフォームの場合、アプリケーションの実行中にコンパイルするのはリソースへの負担が大きくなってしまうため、事前にコンパイルされたコードを使って実行しています。

Unityのマニュアルでは、いくつかのプラットフォームではAOTコンパイルのコードじゃないとダメだよー(意訳)と記載されているので、こちらもご参照ください。

 

原因

さてエラーの内容に戻ると、AOTコンパイルされたコードが見つからないことが問題となっていました。Boltで作成されたフローについては、明示的にAOTの事前ビルドを行う必要があるため、これをやっていなかったことでエラーが発生していたようです。

このゲームでは対象のプラットフォームがWebGLだったので、AOTの事前ビルドをしておかないといけないプラットフォームなのでした。

BGMだけ流れていたのは、シーンのBGMをBoltからではなく、AudioSourceコンポーネントの『Play On Awake』がTrueになっていたことで、Unity側で制御していたためだと思います。

 

解決策

マニュアルにそのままズバリ解決策が書かれていますが、Boltのメニューから『AOT Pre-Build』をしておく必要があります。これはメニューを選択してクリックするだけで実行できるのでめっちゃ簡単です。

 

画面上部のメニューバーから [Tools] -> [Bolt] -> [AOT Pre-Build…] を選択します。

メニューを選択
メニューを選択

 

表示されたウィンドウの [Pre-Build] のボタンをクリックすればOKです。簡単ですね。

ボタンを押すだけ
ボタンを押すだけ

 

あとは通常通りBuild SettingsのウィンドウからゲームをビルドすればOKです。

 

AOT Pre-Buildを行うべきプラットフォーム

事前コンパイルが必要なプラットフォームの例は以下の通りです。

  • Android
  • iOS
  • WebGL

性能が限られているモバイルやWebブラウザでゲームをリリースする場合はこのAOT Pre-Buildが必要になります。

普通にC#でコードを書いている時にはUnityがうまくやってくれるのでAOTかJITか特に気にしていませんでしたが、Boltでこのエラーがあったことでまたひとつ勉強になりました。

 

まとめ

Boltを使ってビルドしたゲームで「ahead of time (AOT)」に関するエラーメッセージが表示されたら、Boltのメニューから『AOT Pre-Build』をしておきましょう。

これ、ボタン一発で解決できるとはいえ、プログラミング初心者がこのエラーに出会ったらびっくりしちゃうかもしれませんね。このページがプログラミング初心者の方の問題解決になることを祈っています。

 

     

ゲーム開発の攻略チャートを作りました!

CTA-IMAGE

「ゲームを作ってみたいけど、何から手を付けていいか分からない!」


そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。


ゲームを作り始めた時にぶつかる壁である「何をしたら良いのか分からない」という悩みを吹き飛ばしましょう!