今回はunityでunsafeなコードを使う方法についてです。
以前はUnityは公式的にはUnsafeはサポートしていませんでしたが(unsafeを使う手順は存在して、IL2CPPもunsafe向けコードを出力していた)、Unity 2018.1辺り?からオプションとしてunsafeに対応したみたいです。
Unsafeなコード
まず検証用に適当なunsafeを使用したコードを用意してみました。
構造体の配列を持っているコードで、各要素に対して直接内容の書き換えを行っています。
元々のコードはこちら。
実行結果を確認すると、ちゃんとyの中身をxに再設定出来ています。
また3つ目の要素に12を直接代入出来ている事も確認出来ます。
なおコードにはIl2CppSetOptionを使用しています。これはIL2CPPでC# からC++に変換する際のオプションで、unsafeでも効果があります。
特に[Il2CppSetOption(Option.NullChecks, false)]はポインタのアクセス時のコストを回避出来ます。ArrayBoundsChecksはポインタ上では要らんですが、まぁ。
Il2CppSetOption.NullChecksやArrayBoundsChecksはNativeArray使う分には要らんかな?どうだろう(未検証
Unsafeなコードを利用する
Unsafeなコードを利用したい場合、PlayerSettings > Other SettingsのAllow 'unsafe' Codeを有効にします。
少し注意すべきなのが、Assembly Definition FileにもAllow Unsafe Codeのオプションがあります。これはAssembly Definition File毎にunsafeを許容するかの設定になっています。
少しややこしいですが、PlayerSettingsのallow unsafe codeはプロジェクト全体の設定(ADFが設定されていないコード全て)ですが、Assembly Definition Fileで更に個別に設定できるという感じみたいです。
もしIl2CppSetOptionが必要な場合(速度が欲しくてunsafeを使用してる)場合には、Il2CppSetOptionAttribute.csも必要です。
Il2CppSetOptionAttributeは{インストールしたフォルダ}/Editor/Data/il2cpp以下にあるのでプロジェクトに突っ込んでおきます。
もしAssembly Definition Fileを使用してる場合は、依存関係の構築も忘れずに。
関連
お馴染みJacksonDunstan.comのIL2CPPでunsafeを使用した時にどのようなコードが生成されるのかの解説記事
C# 7.2の機能を使用したい場合はincrementalcompilerを導入します。
unsafeはコチラが分かりやすいです
さり気なくunsafeとか使ってたりします。