AOTコンパイルってなんぞ?

C#などの.Net言語はCILという中間言語コンパイルして、それをVM上で動かすようにできています。

しかし、実際にVM上で走らせなければどんなコードが動くか分からないってのはセキュリティ上よくないので、iOSではそれを許していません。

UnityはVMからJITコンパイルする部分を排除し、事前にネイティブコードを吐くようにすることでこの問題を回避しています。

事前にコンパイルしていることから、この部分のコンパイルをAOT(Ahead of Time)コンパイルと言います。

しかし、この事前コンパイル、そのそも.Net言語が想定していたものではないため(たぶん)、いろいろと制限があるそうです。

わかり易い例として、C#にはReflection.EmitというCILコードを直接生成する関数があるのですが、これはAOTでは使えません。

そのような制限があることから、UniRxを使用する際にbackendとしてMonoを選択するとエラーが発生するようです。

UniRxは正式にAOTのサポートを切っているそうなので、おとなしくIL2CPPを使うしかなさそうです。

デバッグ向けにコンパイルする時はbackendとしてMonoを選択したほうが圧倒的にビルドが早く多用していたので、ちょっとどうするか悩んでます。

参照:iPhoneでC#アプリが審査に通るワケ − @IT
参照:neue cc - UniRx 5.0 - 完全書き直しによるパフォーマンス向上とヒューマンリーダブルなスタックトレース生成