KirisimaCreate備忘録

アプリ制作の備忘録とか思うことをつらつら...

UnityとSpineでゲームを作ってる時に悩んだりスゲー!ってなったこと


ランゲームに登場させるキャラをアニメーションさせたくて
Spineを購入したので使ってみました

チュートリアル動画がチュートリアルじゃない

UnityでアニメーションをScriptから制御するとき

using Spine;
using Spine.Unity;

このNameSpaceを記述しないと制御に必要なクラスが使えなかったです。
何年か前のチュートリアル動画には書いてなかったのに・・・
悩んだ末Mecanim版を使ってUnityのAnimatorで制御してました。

超絶簡単にアニメーションを制御できる

Spineで"Run"というアニメーションを作ったとして

using UnityEngine;
using System.Collections;
using Spine;
using Spine.Untiy;
public class SpineAnim : MonoBehaviour {
    SkeletonAnimation skeletonAnim;
    void Start()
    {
        skeleAnim = GetComponent<SkeletonAnimation>();
        skeleAnim.state.SetAnimation(0, "Run", true);
    }
}

たったこれだけでSpineで作ったアニメーションが再生される!
SetAnimationの中身もTrackIndex, Spineで作ったAnimationの名前, ループするかどうか
を書けばいいだけなので分かりやすい!

走りアニメーションを再生中に攻撃アニメーションも再生したい場合
攻撃アニメーションは腕と手だけを動かした"Attack"というアニメーションを作ったとして

void Start()
{
    skeletonAnim = GetComponent<SkeletonAnimation>();
    skeletonAnim.state.SetAnimation(0, "Run", true);
}
void Update()
{
    if(Input.GetMouseButtonDown(0))
    {
        //TrackIndexを1にする
        skeletonAnim.state.SetAnimation(1, "Attack", false);
        //アニメーション終了時に実行したいイベントハンドラを登録
        skeletonAnim.AnimationState.Complete += AttackComplete;
    }
}
//"Attack"アニメーション終了後の処理
void AttackComplete(TrackIndex trackIndex)
{
    //Runアニメーションに戻してイベントハンドラを削除
    skeletonAnim.state.SetAnimation(0, "Run", true);
    skeletonAnim.AnimationState.Complete -= AttackComplete;
}

これで"Run"アニメーションと"Attack"アニメーションがいい感じにブレンドされて再生される
正直

skeletonAnim.AnimationState.Complete += AttackComplete;

これがなんなのか理解してないけど動いてるからいいやの精神で。

Unity + Spine を使って面白い表現が色々できそうですね!