technostallion

Unity、プログラム、グラフィック関係の技術ネタを書き殴ります

Unityで2Dゲームを作るならSpineを使うべき17の理由

Spineって?


Spine - Trailer - YouTube

Spineという名前を聞いたことがあるだろうか?
Spineはゲーム向けに作られた多機能な2Dアニメーションソフトウェアで、ここ数年、特にインディーゲーム、モバイルゲーム界隈で俄かに注目を集めつつある。
最近では開発規模の大小やプロアマを問わず導入事例が増えており、勉強会も開催される人気っぷりだ。
私は半年ほど前にこのソフトウェアをホビー用途で購入し、Unity(3D)上で2Dのキャラクターを表現するためのツールとして使用させていただいている。
使えば使うほどにSpineが持つ強力な機能と柔軟性に魅了されて止まない。
日本語ドキュメントの乏しさや知名度の低さから、まだまだ全盛期のFlashほどの地位は得られていないSpineだが、この素晴らしいツールがさらに多くの方々に愛用されることを願って「Unityで2Dゲームを作るならSpineを使うべき17の理由」と題し、そのオススメポイントを紹介してみようと思う。

Spineを使うべき17の理由

1 . エディタ操作の習熟が簡単

f:id:helementsof:20150217213639p:plain

Spineエディタのインターフェースはシンプルで洗練されており、とても分かりやすい。タイムラインベースのアニメーション編集画面やボーンのヒエラルキー構造は一般的な3DCGソフトのそれに近く、何かしらの3DCGソフトの使用経験があれば基本操作の習熟に数日も掛からないはずだ。また文字ベースの情報が少ないため、エディタ操作をマスターするだけならば英語のスキルも殆ど必要ない。

2 . 動作が軽い

2015年2月現在、一般的なミドルレンジクラスのPCであれば動作がモタつくことはないはず。テクスチャパッキングやデータエクスポートも数秒で完了するため、複数ツールを跨ぐワークフローでもストレスが溜まらない。

3 .(個人またはインディーなら)安い

https://esotericsoftware.com/spine-purchase

※ライセンス料は2015年2月当時の情報です。
年間収益が50万ドル未満の企業及び個人であれば289ドルでアップデートを含めた永続ライセンスが購入できる。3万円と聞くと高く感じるかもしれないが、この手のオーサリングソフトとしてはかなり安価な部類。

さらに基本機能のみに限定されたEssential版は69ドルで提供されている。ただし、Essential版は後述のFFD機能を含む大多数の革新的、実用的な機能が省かれているため、本格的に使い込むならやはりPro版が欲しいところ。幸いにもEssensialからProへアップグレードする際はProとの差額だけで済むので、とりあえずEssentialを使ってみるのもアリ。

年間収益が50万ドルを超える法人は2200ドルの基本料金+1ライセンス249ドルの支払いが毎年必要で、Pro版のみの提供となる。

4 . アニメーション制作補助機能の充実

f:id:helementsof:20150217214554p:plain


前後のアニメーションの軌跡を半透明で表示するゴースティング機能、複数キーフレームを同時編集可能なカーブエディタ、キーフレームの始点と終点をドラッグしてアニメーションの尺を自由に調整できるアジャスト機能、ループ機能など、アニメーション制作を強力にサポートする機能が備わっている。


実際のゲーム上での動作を見ながらアニメーションを微調整したい場合、これらの補助機能がトライ&エラーを支援してくれる。

5 . サポートが充実

2015年2月現在、更新頻度が高く、アップデートやバグフィックスが早い。フォーラムも活発で、問題に遭遇した場合は過去ログを検索すれば大抵解決するし、英語に自信があれば自らコミュニケーションを取ってみてもいい。もちろん個別にメールフォームでサポートを求めることもできる。

6 . FFD

f:id:helementsof:20150217221249p:plain

より素晴らしい作例が公式フォーラムにあります。

two girls animation.


スプライトをメッシュ化、分割し、動的にメッシュを変形させる機能(Free Form Deformation)が超強力。

メッシュにボーンをバインドしてウェイトを付け、アニメーションに合わせて自動でパーツを変形させることが出来るほか、頂点の移動、回転を個別にアニメーションさせることも、また双方を組み合わせることもできる。


手足や尻尾といったフレキシブルなボディパーツはもちろん、布や紙のような柔らかい素材が驚くほど滑らかにアニメーションする。また、パースの変化をメッシュの頂点でアニメーションさせることで疑似3Dのような表現も可能。


部分ごとの形状変化に合わせて個別に絵素材を作らずとも、ある程度はこの仕組みで吸収できる上、画像の数を減らせればそれだけインゲームでのメモリの使用量も減る。

FFDはPro限定の機能だが、このためだけでもProにアップグレードする価値がある。

7 . 完全に独立した描画プライオリティの管理システム

パーツ同士の重なりの優先順位はdraworderと呼ばれる独立した項目で制御されており、ボーンの親子関係などに影響されることなく完全にコントロールできる。

また、draworderにもキーフレームを設定することが可能で、アニメーションの特定のタイミングで特定のパーツを手間に出す、または後ろに隠す、といった状況にも問題なく対応できる。

8 . 可変フレームレートのネイティブサポート

f:id:helementsof:20150217221538p:plain


Spineのアニメーションは1秒あたり30フレームがデフォルト。ただし内部的には可変フレームレートを前提として作られており、例えば60fpsの環境なら0.5フレームずつアニメーションが更新される。エディタ上でもShiftキーを押しながらタイムラインを選択することで1/10フレーム単位でのキーフレーム設定が可能。


UnityランタイムではTime.DeltaTimeの値を参照しているため、処理落ちなどでフレーム間の所要時間にばらつきが出た場合でもアニメーションにズレが生じることはない。

9 . Event機能

f:id:helementsof:20150217221945p:plain


アニメーションにはEvent機能が備わっており、アニメーション上に設定したキーフレームのタイミングでプログラム側へint、float、stringの変数を渡すことができる。


上の画像では5フレーム目にjumpという名称のイベントを設定し、このイベントにfloat値(50f)を渡している。
Unity側では以下のようなソースを書くことでイベントにデリゲートを設定できる。

using UnityEngine;
using System.Collections;
using Spine;

public class TestSpineAnimation : MonoBehaviour
{
    // インスペクタからアタッチ
    public SkeletonAnimation skeletonAnimation;
    
    void Start ()
    {
        // Track Index 0 に"hop"アニメーションをループで設定
        TrackEntry entry = skeletonAnimation.state.SetAnimation( 0, "hop", true);
        
        entry.Event += delegate(Spine.AnimationState state, int trackIndex, Spine.Event e)
        {
            // jumpイベントならrigidbodyに上方向の力を加える
            if (e.Data.name == "jump")
            {
                this.gameObject.rigidbody.velocity += Vector3.up * e.Float;
            }
        };
    }
}

これにより、Spine側で設定したイベントをフックしてキャラクターのあらゆる動作をコントロールすることができる。ジャンプするタイミングやジャンプ力を変えたければ、アニメーション側のEventキーフレームとその変数を調整するだけでいい。ロジックとインプットの明確な分離が開発効率の向上に貢献することは言うに及ばないだろう。

10 . drawcallが少ない

Spineで作られたキャラクターのテクスチャは一枚のスプライトシートにパーツを敷き詰めたテクスチャアトラスにコンバートされる。テクスチャアトラス1つに対して1つのマテリアルが割り振られるため、複雑な形状のキャラクターでもテクスチャアトラス一枚に収まる限りはdrawcallの消費は1。モバイルフレンドリー。

(加算合成を使う場合はこの限りではない)

なお、テクスチャサイズがUnityのテクスチャインポート上限サイズを超えた場合は複数のアトラスに分割され、その数に比例してdrawcallも増える。

11 . ランタイムがオープンソース

ランタイムはオープンソースで拡張性が高い。ビルトインのシェーダーに不満があれば、より高機能なシェーダーを自分で書いてもいいし、機能やインスペクタに不満があればライブラリそのものを拡張してもいい。不具合への対処も同様である。

12 . プログラムからの操作が容易

f:id:helementsof:20150217225952p:plain


Unity上にインポートしたキャラクターはボーンの親子関係に基づいたヒエラルキーを持つGameObjectとして動作する。それぞれのTransformにColliderコンポーネントをアタッチして当たり判定を設定したり、Transformを直接弄ってプログラムからボーンを個別操作することもできる。

特定のオブジェクトが画面に現れるとキャラクターの頭や目がその方向を向く、といった表現も簡単に実現できてしまう。

13 . 物理演算との親和性

前述のようにボーンをTransformで直接操作できるため、rigidbodyコンポーネントをアタッチしてHinge Jointで接合すれば風になびくマントやロングヘアーといった「揺れモノ」を物理演算任せで簡単に作れる。このような部位はデータ側でモーションを用意しなくとも、物理演算で動かすことで自然かつ視覚的にインパクトのある視覚効果が得られる。

14 . アニメーションブレンド

f:id:helementsof:20150217230431p:plain

SpineのUnityランタイムにはアニメーション同士のトランジションを自動で補間するモーションブレンド機能が備わっている。モーションからモーションへの遷移は直前のキーフレームの状態に基づいて補間され、滑らかにシミュレーションされる。


もちろん補間時間やブレンドの有無を調整することも可能。緩慢なモーションはブレンドに頼って滑らかさを重視し、ジャンプ、攻撃のような瞬間的な切り替わりを要するモーションへの遷移にはメリハリを付けるといった差別化が可能。

15 . 複数アニメーションのミキシング

SpineのアニメーションにはTrackと呼ばれるアニメーション並列処理のための枠組みが用意されており、これを使えば同時に複数のアニメーションをミキシングすることが可能だ。


例えば、顔の表情、上半身のモーション、下半身のモーションといった具合に3つのアニメーションを制作し、それらを別々のTrackで再生すれば、各部位をアニメーション単位で分割管理するといった応用に繋げられる。


Spineはパーツ単位でのRGBA値の変化もアニメーション化できるため、通常モーションを維持しつつカラーアニメーションを適用したい!といったケースにも柔軟に対応できるのだ。

16.Mecanimとの連動

2015年2月のUnityランタイムアップデートにより、MecanimのアニメーションコントローラーでSpineのデータが制御できるようになった。これにより、ステートマシンでの制御が可能となり、Mecanimコンポーネントを利用するサード製アセットとの連携も魅力の一つに。

17 . 3Dでも2Dでも使える

2Dアニメーション用のソフトウェアではあるが、Unity上での扱いは「ペラペラのポリゴンにテクスチャを張り付けた3Dのオブジェクト」であるため、2D、3Dどちらで扱える。2Dと3Dが融合した2.5Dのゲームを作るのにも適している。


と、いいこと尽くめのSpineだが、気になった点もある。

 

気になった点

基本的に全て英語

日本語化されているのは公式サイトの一部だけ。前述の通り、ツールを扱うだけなら英語のスキルは殆ど必要ないが、Unityへの組み込みやランタイム修正を行う場合はそれなりに英語と接しなければならない。

ネット上で収集できる日本語の情報もまだまだ少ない。

Unity上では半透明オブジェクト扱い

Spineで作られたキャラクターは半透明テクスチャを重ねあわせたスプライトの集合体であるため、シェーダー側でZバッファを有効にできない。

つまり描画オーダーを自前で管理する必要があり、特に半透明パーティクル類と一緒に表示すると描画順序が簡単に破綻してしまう。

この点については根本的な解決が難しく、Spineデータ以外の半透明オブジェクトのメッシュを細かく分割するなど、力技での解決が必要。

Spineは すごい

些細な問題点はあれど、一度使えばそのパワフルさの虜になるはず。
Unityで2Dゲームを作ろうと考えている方は、ぜひSpineの導入を検討してみてはいかがだろうか。