テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】Unity 2018.1でunsafeなコードを使う

今回はunityでunsafeなコードを使う方法についてです。

 

以前はUnityは公式的にはUnsafeはサポートしていませんでしたが(unsafeを使う手順は存在して、IL2CPPもunsafe向けコードを出力していた)、Unity 2018.1辺り?からオプションとしてunsafeに対応したみたいです。

 

 

Unsafeなコード

まず検証用に適当なunsafeを使用したコードを用意してみました。
構造体の配列を持っているコードで、各要素に対して直接内容の書き換えを行っています。
元々のコードはこちら

gist.github.com

f:id:tsubaki_t1:20180516065032j:plain

実行結果を確認すると、ちゃんとyの中身をxに再設定出来ています。
また3つ目の要素に12を直接代入出来ている事も確認出来ます。

 

なおコードにはIl2CppSetOptionを使用しています。これはIL2CPPでC# からC++に変換する際のオプションで、unsafeでも効果があります。
特に[Il2CppSetOption(Option.NullChecks, false)]はポインタのアクセス時のコストを回避出来ます。ArrayBoundsChecksはポインタ上では要らんですが、まぁ。

Il2CppSetOption.NullChecksやArrayBoundsChecksはNativeArray使う分には要らんかな?どうだろう(未検証

docs.unity3d.com

Unsafeなコードを利用する

Unsafeなコードを利用したい場合、PlayerSettings > Other SettingsのAllow 'unsafe' Codeを有効にします。

f:id:tsubaki_t1:20180516062924j:plain

 

少し注意すべきなのが、Assembly Definition FileにもAllow Unsafe Codeのオプションがあります。これはAssembly Definition File毎にunsafeを許容するかの設定になっています。

f:id:tsubaki_t1:20180516063125j:plain

 

少しややこしいですが、PlayerSettingsのallow unsafe codeはプロジェクト全体の設定(ADFが設定されていないコード全て)ですが、Assembly Definition Fileで更に個別に設定できるという感じみたいです。

f:id:tsubaki_t1:20180516064315j:plain

 

もしIl2CppSetOptionが必要な場合(速度が欲しくてunsafeを使用してる)場合には、Il2CppSetOptionAttribute.csも必要です。
Il2CppSetOptionAttributeは{インストールしたフォルダ}/Editor/Data/il2cpp以下にあるのでプロジェクトに突っ込んでおきます。

もしAssembly Definition Fileを使用してる場合は、依存関係の構築も忘れずに。

f:id:tsubaki_t1:20180516064744j:plain

関連

お馴染みJacksonDunstan.comのIL2CPPでunsafeを使用した時にどのようなコードが生成されるのかの解説記事

jacksondunstan.com

C# 7.2の機能を使用したい場合はincrementalcompilerを導入します。

baba-s.hatenablog.com

unsafeはコチラが分かりやすいです

ufcpp.net

さり気なくunsafeとか使ってたりします。

tsubakit1.hateblo.jp