テラシュールブログスマートフォン用の表示で見るテラシュールブログ旧テラシュールウェアブログUnity記事。UnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。今回は構造体を配列(NativeArray)にした時の、そのアクセスについてです。Systemといった機能では、構造体をNativeArrayに乗せて一括制御するアプローチが見られます。いうのもECSやJobSystemはDODの考えでメモリ内にデータが散らばるのを嫌がるので、殆どStructで実装されています。それ自体は大した問題では無いのですが、基本的に構造体の配列は参照渡し出来ないので少しコードが冗長になる印象があります。出来れば構造体でも参照渡しで直接値を書き換えたい所です。今回はそれを色々とやってみます。配列からrefやoutで参照を貰う事は出来ないC#で参照渡しといえばrefやoutです。構造体などの基本的にコピーを生成する受け渡しであっても、refを指定しておければ参照を渡して中身を書き換えることが出来ます。残念なことに、通常の構造体なら問題なくとも配列に対してとなると上手くはいきません。配列(インデクサー)は残念ながらoutやrefを使えないのです。unsafeを使おう最終手段です。unsafeを使います。ポインタを使用してNativeArrayの各要素に直接語りかける訳です。gist.github.comGetUnsafeReadOnlyPtrを使用してNativeArrayのポインタを取得、あとは要素をズラせば中身が取れます。何かの処理を行う場所でもunsafeを要求するのは余り良くないかもしれません。NativeArrayにfixedは必要ありません。NativeArrayは連続していますがComponentDataArray等のECSがInjectする要素は連続してるとは限らないので、要素をずらした時に正しく取れない点に注意です。Compilerを導入すると、C#7.2が使えるようになり要素のrefが使えるようになります。ソレに合わせてArrayElementAsRefというAPIが追加されるので、コレを使って要素をrefで取得してメソッドに受け渡す的な事も出来るようになります。gist.github.comUnsafeUtilityExって、もう少し良い名前は無かったのか感あるので、今後変わる気もします。Compilerの効果についてのまとめです。7.2がつかえるようになる他、コンパイル時間短縮も期待出来ます。現在は記事で紹介されているような、manifest.jsonを書き換えなくともpackagemanagerから導入出来ます。Buffers今回はECSで配列を使用する方法についてです。(1)月別アーカイブはてなブログをはじめよう!tsubaki_t1さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。