表情差分の抽出と切り替え(Tightメッシュ対応編)

前回の記事で、 FullRectはフィル落とせないから微妙だなぁ、という結論を書いたのですが 表情差分を切り替えやすいメッシュを作りつつもTightメッシュ対応する方法を思いついたので実装してみました。

方法は結構簡単でして、 まず、表情差分領域を除外した領域をTightメッシュ化すべくSpriteに切り出します。 これは4枚のSpriteを使えば実現できます。

f:id:enrike3:20190217032907p:plain

_Tight-L, _Tight-R, _Tight-B, _Tight-Tが該当です。

この状態でSpriteのMesh TypeをTightに指定すると、 Unityが_Tight-L, _Tight-R, _Tight-B, _Tight-Tそれぞれに対してTightメッシュを切ってくれます。

あとは、表情差分用の板ポリと_Tight-L, _Tight-R, _Tight-B, _Tight-Tそれぞれに作られたメッシュを結合します。 今回はMesh.CombineMeshを使用しました。

生まれたメッシュがこちら

f:id:enrike3:20190217033334p:plain

表情差分をコードで切り替えやすいシンプルな板ポリが顔にあって、 あとはTightメッシュできっちりフィルを落とせるのが見て取れます。 ちなみにこれで414頂点です。 2Dゲームは頂点シェーダよりピクセルシェーダに負荷がいきがちであることを考えると、 およそ400頂点増でここまで透明ピクセルを落とせるなら悪くないトレードオフに思います。

もちろん描画結果も問題なし

f:id:enrike3:20190217042501p:plain

16頂点のFullRect版を使うかTightメッシュを使うかは選べるようにしました。 意外と満足のいく出来になってきたので、こんどはTightパッキングに挑戦してみようかな…