ちょっと欲しいと思ったので、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は一つです。
なんで こんなこと書いた! 言え!!
HI!ECSでSpriteを使いたかったんです悪気はないんですもうMeshRendererにTextureAnimation流し込んでとかやりたくなかったんですちょっとした出来心だったんdせう
本当はSpriteRendererSystemが来るのを待つべきなのですが、まぁ。
ということでECSで10万体のSpriteを表示するEntityを生成とかやってました。
世は満足じゃ
ちなみにMeshの描画はECSのシステムにMeshInstanceRendererSystemというのが含まれていて、TransformMatrixとMeshInstanceRendererの二つをEntityに含めることで描画が呼ばれるようになります。
関連
最近ECSが面白くなってきた。後はPhysicsをGameObject無しで使えれば色々出来る。自作は正直したくない