昨日に引き続きUnity 5.6の新しい機能についてです。
スプライトの描画順制御
Unityのスプライトは、標準設定ならば*1、Sorting LayerとOrder In Layer、あとカメラから見たZ値で制御されます。
Sorting Layerが下の方が前面で、同一レイヤー内ならばOrder In Layerが高い方が前面に、Sorting Layerが同一かつOrder In Layerが同じなら手前にある方が前面に表示されます。
つまり、Sorting Layer > Order In Layer > Z値 です。
この描画順を上手く制御すれば、キャラクターのように幾つかのパーツを組み合わせてキャラクターを作りボーンアニメーションで制御する事が出来ます。
ただ、描画順を考慮しないと若干面倒なことになります。
Order In Layerで制御した時の問題点
例えば下のようなキャラクターを作成します。
下のキャラクターは各パーツに分かれていて、振ってあるナンバーがOrder In Layerの番号です。
顔や肩・腰巻きは、体より手前にあるべきなので体(Order In Layer=0)より大きい値で、逆に腕や奥の足は体より奥に欲しいので、Order In Layerがマイナスの値を持っています。
一見問題無いように見えますが、キャラクターを複数置いた場合に問題が発生します。
描画順的には体より前面に腕が描画されるので、下の図のように並べた際には他の人の体から腕が突き出る事になります。穿け、ハー状態です。もしくはクトゥルフ。
ちなみに、Sorting LayerではなくモデルとZ値で制御している場合、親オブジェクトのZ値をずらす事で問題が解決出来ます。それはソレで問題が無い訳ではないですが、まぁ何とかなると思います。
SortingGroupで描画順を制御
Unity 5.6からスプライト描画系で便利なSorting Groupなるコンポーネントが追加されました。
これはSortingGroup以下のSpriteを、描画順番を維持したまま一つのSpriteのような形で描画順を制御するといった物みたいです。
例えば下のように、キャラクターを表現しているSprite群の親オブジェクトにSortingGroupをセットすると、SortingGroupの描画順を制御するだけで破綻なくスプライトが描画出来ています。
描画順が明確になるからか、FrameDebuggerで確認すると一括で描画されている事が分かります。SortingGroupの有りと無しを比較すると、パス数が明確に違います。
一応Z値で明確に描画順に差を付けた場合もSortingGroupと似たようになりますが、パーティクル等が割り込むと描画順が破綻するので、こういった表現を行いたい場合には、SortingGroupは少し嬉しい機能な気がします。
利用アセット
サンプルとして 2.5D 基本キャラクターパックのキャラクターを利用しています。こちらはメッシュベースで表現しているので、色々と良いです。個人的にこのシリーズはかなりお気に入り。
関連
Spineのような、ボーンベースの2Dアニメーション機能(Anima2D)が2017年の1月から無料で利用出来るようになる予定みたいです。(最終的にエディタに統合)
詳しくはUnite Europe 2016 - 2D Skeletal Animation for Unity: Anima2D で確認出来ますが、曰く、以下の機能が使えるとか何とか。
- 2D ボーン制御
- SpriteからMeshへの変換
- スプライトメッシュエディター (SpriteMesh Editor)
- 自動ウェイト (Automatic weights)
- ウェイトエディター (Weight Editor)
- インバースキネマティックス (IK)
- ポーズの保存 / 読み込み
- Unity のアトラスと互換
- ボーンにアニメーションをベイク
- オニオンスキン
- アバターマスクの作成
*1:5.6から画面下が手前で上が奥といった、特殊なソート方法が追加された