テラシュールブログ

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

【Unity】SpriteをMeshとして利用可能にする

f:id:tsubaki_t1:20180418225853j:plain

ちょっと欲しいと思ったので、SpriteをMeshに変換する方法を探してみました。

 

 

Spriteという機能

Unityは2D表現の機能を追加するにあたり、Meshの他にSpriteという新しいアセット概念を追加しました。
Spriteは「ポリゴン・UV・テクスチャへの参照」の3つが合わさったアセットで、Unityの2D表現はこのSpriteを差し替えることで実現しています。

 

なおフィルレートが問題になりやすい昨今の環境では、テクスチャをQUAD(板ポリ)に貼るより、アルファに沿って綺麗に切り抜いたポリゴンを表示した方が高速と言われています。
Cutoutが最近のGPUでは相性が悪いのも、こう言われてる要因の一つです。

 

Meshは使えるがSpriteでは使えない機能

Spriteが理にかなっているのは良いのですが、それでもMeshを使いたいと思う時があります。例えばオブジェクトを大量に描画する場合には、出来る限りGameObjectを使用したくないといった心象です。

1つのGameObject=1つのレンダラーとしたくなり場合、メッシュの結合もしくはDrawMesh系のAPIを使用することが考えられます。

 

とは言え、DrawMesh系のAPIもメッシュの結合もSpriteには対応していないのが現状です。
なので、SpriteをMeshに変換してみます。

SpriteをMeshに変換する

SpriteをMeshに変換するコードの考え方はそれ程難しくはありません。MeshもSpriteもTrianglesやVertices、UVといった情報は取得できますし、セットすることが出来ます。
なので、Spriteのソレらの情報をMeshに移植してやれば良い話です。

下のコードは、SpriteからMeshを作ってCommandBufferで表示しています。沢山のSpriteを表示してもGameObjectは一つです。

gist.github.com

f:id:tsubaki_t1:20180418232142j:plain

なんでこんなこと書いた! 言え

HI!ECSでSpriteを使いたかったんです悪気はないんですもうMeshRendererにTextureAnimation流し込んでとかやりたくなかったんですちょっとした出来心だったんdせう

 

本当はSpriteRendererSystemが来るのを待つべきなのですが、まぁ。

f:id:tsubaki_t1:20180418233330j:plain

ということでECSで10万体のSpriteを表示するEntityを生成とかやってました。
世は満足じゃ

 

ちなみにMeshの描画はECSのシステムにMeshInstanceRendererSystemというのが含まれていて、TransformMatrixとMeshInstanceRendererの二つをEntityに含めることで描画が呼ばれるようになります。

f:id:tsubaki_t1:20180418233636j:plain

関連

最近ECSが面白くなってきた。後はPhysicsをGameObject無しで使えれば色々出来る。自作は正直したくない

tsubakit1.hateblo.jp