Marumittu Engineer Blog

個人でゲーム開発を行っています。ゲーム開発に関する情報を紹介するブログ。

UnityでSpineを使ってみた ④アニメーションイベント

前回と前々回の記事にて、
アニメーションの切り替えについて一通り紹介してきました。


「②アニメーション切り替え」にてアニメーションのコールバックについて説明しましたが、今回はこのコールバックの一種、アニメーションイベントについて詳しく紹介していきます。

この記事を書いた時の開発環境は以下の通りです。

 Unity 5.6.0p4
 Spine 3.5.51 Professional

アニメーションイベント

アニメーションイベントとはアニメーションの任意のタイミングで、何らかのイベントトリガーを実行する事ができる仕組みです。
例えば、キャラクターがダメージを受けた際にエフェクトを表示したり、アニメーションの接地のタイミングで音を再生したりといった事が可能です。

設定方法

ツリー内で「イベント」ノードを選択し、「新規イベント」をクリックするとイベントが作成されます。
イベントに適切な名前が付けられると、ツリー内に表示されます。

f:id:marumittu_tech:20170618103338g:plain

イベントには整数、フロート、文字列という3つのプロパティがあります。
これらのプロパティはイベントに追加情報を設定でき、スクリプト内でこの値を取得できます。

f:id:marumittu_tech:20170618103734p:plain

イベントキーの設定

アニメーションに任意のタイミングでイベントを追加する方法は下記のとおりです。

  1. 編集モードを"ANIMATE"に変更します。
  2. タイムラインを希望のポジションに移動します。
  3. オプションとして、ツリーの中でイベントのプロパティを設定します。
  4. ツリーの中でイベントの横のキーボタンをクリックします。

アニメーションのキーフレームが指定したイベントのタイミングになると、イベントがトリガーされます。
エディターエリアでトリガーされたイベント名を確認できます。

f:id:marumittu_tech:20170618143126g:plain

Unityでの確認

Unityでは_SkeletonDataのインスペクター上で設定したイベントの確認ができます

f:id:marumittu_tech:20170618140935p:plain

※Preview Windowが正しくクリアーされないので、おかしな画像になります。
 Spine ランタイム側の不具合かな?

イベントのスクリプト処理

スクリプトでのイベントの受け取り方は下記のとおりです。
Event変数にデリゲート関数を登録する事で、キーフレームがイベントに到達したタイミングで登録した関数を呼び出してくれる仕組みになっています。

[SerializeField]
GameObject damageEffectPrefab = null;

SkeletonAnimation m_skeletonAnimation = null;

void Awake()
{
	m_skeletonAnimation = GetComponent<SkeletonAnimation>();
	m_skeletonAnimation.state.Event += AnimationEventHandler;
}

public void AnimationEventHandler(TrackEntry _entry, Spine.Event _event)
{
	if (_event.Data.Name == "ev_vfx_damage")
	{
		//DamageEffect生成
		Instantiate(damageEffectPrefab);
	}
}

今回はイベントを設定したタイミングでエフェクトを表示してみました。

f:id:marumittu_tech:20170618205941g:plain

これでアニメーションの好きなタイミングで様々な処理を実行できるようになるので、デザイナーも助かりますし、演出の幅が広がりますね!!