テラシュールブログ

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

【Unity】Unityでベクターグラフィック(SVG)を利用する

https://github.com/Unity-Technologies/vector-graphics-samples/blob/master/Documentation/vectorgraphics.md

f:id:tsubaki_t1:20180522235702g:plain

UnityのPackageManagerにSVGを利用するライブラリが追加されました。
Unity 2018.1でプレビュー版を使用することが出来ます。

 

 

どんな事が出来るの?

機能については下の動画を見てもらう方良さそうです。
結構色々なことが出来るみたいです

www.youtube.com

使い方

PackagesのManifest.jsonの中身に以下の行を追加します。

そうするとステージングのPackageManagerにアクセス出来るので、あとはVectorGraphicsをImportするだけです。

f:id:tsubaki_t1:20180523000423j:plain

f:id:tsubaki_t1:20180523000237j:plain

 

パッケージのインポート後は、SVG形式のファイルをSpriteとして使用することが出来るようになります。

f:id:tsubaki_t1:20180523000844j:plain

 

ShaderはUnlit/Vectorという新しいシェーダーを使用して表現しているので、シェーダーを差し替える場合には注意が必要そうです。

またTessellation SettingsのTargetResolutionを高く設定することで、ズームしたときにより滑らかに見えます。
SVGなのでズームしてもボケませんが、低解像度向けは少しカクカクします。逆に高解像度向けは非常にハイポリで表現されます)

f:id:tsubaki_t1:20180523001300j:plain


なおUIには現在使えないみたいです。

関連

現状プレビュー機能でちょくちょく変化してます。要望とかはフォーラムで出すと良さそうです。

https://forum.unity.com/threads/vector-graphics-preview-package.529845/

 

マニュアルです

https://github.com/Unity-Technologies/vector-graphics-samples/blob/master/Documentation/vectorgraphics.md

 

チラっと紹介しました

www.slideshare.net

【Unity】Allocator.TempJobで作ったNativeArrayを自動的に開放する

今回はNativeArrayの開放の方法についてです

 

NativeArrayの削除

NativeArrayでコンテナを作る際、アロケータのモードに「Temp」「TempJob」「Persistent」の3つを選択することが出来ます。

 

Persistentは普通にComponentやComponentSystemのAwake的なタイミングで作ってOnDestroy的なタイミングで消せば良いんですが、TempやTempJobのように一時割当するタイプはどう消せばよいのか。

 

.Tempは普通に開放

.Tempは基本的に自身で開放する必要があります。開放を忘れると「A Native Collection has not been disposed, resulting in a memory leak.」とコンソールに表示されます(エディターならば)

 

で、この開放のタイミングですが自分で開放する必要があるので、フレームの終わりやメソッドの終わりのタイミングでDisposeします。

Allocator.Tempは「ジョブの結果を受け取りたい」みたいな場合に使用します。結果を抽出したら用済みなので始末して下さい。

 

.TempJobは少し楽

TempJobこちらはC# Job Systemで使う前提の一時割当で、実は少し楽に開放が出来ます。
DeallocateOnJobCompletion属性をJobSystemのフィールドにセットしておくと、そのNativeArrayをジョブ終了時に自動的に開放してくれるみたいです。

f:id:tsubaki_t1:20180521100416j:plain

下のサンプルコードでも、Allocator.TempJobで生成したNativeArrayは投げっぱなしで開放してませんが、ちゃんとDeallocateOnJobCompletionが片付けてくれます。

 

コレが使えるのはあくまで.TempJobで生成したNativeArrayのみで、Tempで作ったものは開放出来ません。

またジョブが終わったら速やかに開放されてしまうので、中身をジョブ外で受け取りたい場合にはTempを使うのが良いです。

 

サンプル

gist.github.com

Gobe2というフィットネストラッカーについての私見

f:id:tsubaki_t1:20180520173238j:plain

Gobe2というフィットネストラッカーを購入してからそろそろ半年になるので、ここでレビュー的なものを書いてみようと思います。

 

  • Gobe2はフィットネストラッカーの一つ
    • デザインは…厚い
    • 時計として使えなくはない
    • 一日の摂取カロリーは、多分あってるような気がする
    • Gobe2「水を飲め水を」
    • バッテリーは3日も持たない
    • アプリは「雰囲気で使う」
  • 結論
  • 関連

 

続きを読む

【Unity】構造体の配列(NativeArray)と参照渡し

今回は構造体を配列(NativeArray)にした時の、そのアクセスについてです。

 

 

ECSとJobSystemは構造体の配列を使う

最近よく紹介されているECSやC# Job Systemといった機能では、構造体をNativeArrayに乗せて一括制御するアプローチが見られます。
というのもECSやJobSystemはDODの考えでメモリ内にデータが散らばるのを嫌がるので、殆どStructで実装されています。


それ自体は大した問題では無いのですが、基本的に構造体の配列は参照渡し出来ないので少しコードが冗長になる印象があります。

f:id:tsubaki_t1:20180520123709j:plain

出来れば構造体でも参照渡しで直接値を書き換えたい所です。

今回はそれを色々とやってみます。

 

配列からrefやoutで参照を貰う事は出来ない

C#で参照渡しといえばrefやoutです。
構造体などの基本的にコピーを生成する受け渡しであっても、refを指定しておければ参照を渡して中身を書き換えることが出来ます。

ただ残念なことに、通常の構造体なら問題なくとも配列に対してとなると上手くはいきません。配列(インデクサー)は残念ながらoutやrefを使えないのです。

f:id:tsubaki_t1:20180520124204j:plain

 

そうだ、unsafeを使おう

最終手段です。unsafeを使います。ポインタを使用してNativeArrayの各要素に直接語りかける訳です。

gist.github.com 

GetUnsafeReadOnlyPtrを使用してNativeArrayのポインタを取得、あとは要素をズラせば中身が取れます。
ただ、何かの処理を行う場所でもunsafeを要求するのは余り良くないかもしれません。

なおNativeArrayにfixedは必要ありません。

またNativeArrayは連続していますがComponentDataArray等のECSがInjectする要素は連続してるとは限らないので、要素をずらした時に正しく取れない点に注意です。

 

ArrayElementAsRefで要素のrefを取得する

Incremental Compilerを導入すると、C#7.2が使えるようになり要素のrefが使えるようになります。ソレに合わせてArrayElementAsRefというAPIが追加されるので、コレを使って要素をrefで取得してメソッドに受け渡す的な事も出来るようになります。

f:id:tsubaki_t1:20180520131528j:plain

gist.github.com

UnsafeUtilityExって、もう少し良い名前は無かったのか感あるので、今後変わる気もします。

 

関連

Incremental Compilerの効果についてのまとめです。
要するにC# 7.2がつかえるようになる他、コンパイル時間短縮も期待出来ます。
但し、現在は記事で紹介されているような、manifest.jsonを書き換えなくともpackagemanagerから導入出来ます。

baba-s.hatenablog.com

Unsafeの設定方法について

tsubakit1.hateblo.jp