テラシュールブログ

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

【Unity】ドット絵でゲームを作る時に使いたい、ピクセルパーフェクトなスプライト表現するPixelPerfectCamera

f:id:tsubaki_t1:20180528232856j:plain

今回は先程公開された、ピクセルパーフェクトなスプライト表現をするために(想定)ピクセルに合わせてスプライトやカメラの位置を調整してくれる機能PixelPerfectCameraについてです。
現在はPackageManagerのstagingで提供されています。

 

 

想定解像度に合わせて表現してくれるカメラ

Unityは基本的にカメラからスプライトを撮影する方式をとっているので、スプライトのピクセルを余り重視していませんでした。そのため、ドット絵を表現する場合にはピクセルサイズがゴチャゴチャだったり、1ドット単位で移動するといった表現をするためには一工夫が必要でした。

 

で、今回こういったドットバイドットの表現をコンポーネント一つ足すだけで解決してくれる機能が追加されたみたいです。現状はStagingにありますが、多分そのうち普通にPackageから追加できるようになります。

 

想定する画面の解像度と、PixelPerUnitを指定することで、想定解像度と一致する形でスプライトが表現できるようになります。

 なお、Unity 2018.2から使用できます

導入

導入手順はこんな感じです。

Packagesmanifest.jsonを下のように書き換えます。

{
"dependencies": {
"com.unity.2d.pixel-perfect": "1.0.0-preview"
},
}

これでPixelPerfectCameraが導入されるので、あとはシーン内のMainCameraオブジェクトにPixelPerfectCameraコンポーネントを追加します。

f:id:tsubaki_t1:20180529000417j:plain

 

次にテクスチャとカメラの設定をします。

TextureのPixelPerUnitとPixelPerfectCameraのPixelPerUnitを同じ値にします。これは「1mを何ドットとするか」という情報で、例えば40とすれば40ピクセルがゲーム内での1mになります。
この大きさはゲーム内の物理演算や挙動に大きく関わるので、適当に100とかせずちゃんと決めとくと良いです。決してScaleを使用してはいけません

f:id:tsubaki_t1:20180529000557j:plain

ピクセルパーフェクトな形で動かしたい場合には、Filterも重要な要素の一つです。TextureのFilterModeをPoint(No filter)に設定して、フィルターを外しておきます。
またCompression(圧縮)もNoneに指定したほうが良いです。複数のピクセルをまとめて圧縮されるので、ドット絵系と圧縮は相性が悪いです。ドット絵は解像度が小さめなので、圧縮しなくても何とかなります。

f:id:tsubaki_t1:20180529000942j:plain

最後に画面の想定解像度を設定します。
設定項目はReference Resolutionです。

これはピクセルが何個詰め込めるかという話で、例えば320x320の画面には32x32のスプライトを100個突っ込めます。

この解像度を設定すると、画面に緑色の点線(1)と枠線(2)が表示されます。
点線がPixelPerfectで見た時の解像度で、枠線が実際のゲーム画面の大きさです。

f:id:tsubaki_t1:20180529001649j:plain

ゲームを再生すればカメラの大きさが変化しますが、エディターで即座に確認したければRunInEditModeボタンを押せば良いです。

 

想定解像度に合わせて解像度を変更するUpscale Render Texture

PixelPerfectCameraはSpriteRendererの座標を良い感じに調整する機能ですが、これだと大量のスプライトを表現したときのフィルレートスプライトを斜めにしたときにキレイな絵が出るといった問題が出ます。

 

これを回避する場合には、Upscale Render Textureのチェックを入れておきます。
チェックを入れるとカメラの画面は解像度を下げた状態で描画されるようになり、上記のような問題は出なくなります。
影響範囲はPixelPerfectCameraをセットしたカメラのみなので、UIは影響しない点も面白いです。

f:id:tsubaki_t1:20180531122816j:plain

解像度を下げる(指定解像度に合わせてズームする)という機能ではSetResolutionが思いつきますが、PixelPerfectCameraのこの機能がバッファを縮小して描画するので、SetResolutionは使用するメリットは無さそうです。

f:id:tsubaki_t1:20180531123238j:plain

 

感想

割と面倒だったピクセル単位の移動ですが、これで簡単にできそうです。

関連

マニュアル(英語、ただし絵が多い)

github.com1mを1ピクセルとすればピクセルパーフェクトを表現できるだろ!という暴論的なアイディア。どちらにしろ物理演算や微調整な移動をドット絵でやるとろくな事にならないので、これはこれで良いと個人的に思ってる。

tsubakit1.hateblo.jp

この手のドット絵はフォーマット通りにスプライトを作るので、下の手法が使いやすい

tsubakit1.hateblo.jp

 

PixelPerfectCameraに関する疑問質問お問い合わせはコチラ

https://forum.unity.com/threads/pixel-perfect-preview-package.533433/

 

コチラのスライドでもチラっとPixelPerfectCameraを紹介しました

www.slideshare.net

【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するだけです。

Package ManagerからVector Graphicをインポートするだけです

 

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には現在使えないみたいです。

UIにも対応してました(2019.1で確認、もっと早く使えるかも)。

関連

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

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日も持たない
    • アプリは「雰囲気で使う」
  • 結論
  • 関連

 

続きを読む