kikki's tech note

技術ブログです。UnityやSpine、MS製品など技術色々について解説しています。

Unity×Spineの当たり判定の付け方 (3/3)

本章では、前々章、前章に引き続き、Spineで作られた素材の当たり判定の付け方について解説していきます。kikki.hatenablog.com
http://kikki.hatenablog.com/entry/2015/06/12/090000kikki.hatenablog.com

Spine

作用キャラにスクリプトを追加

作用キャラに、キーボード入力時のアニメーションを追加します。
f:id:kikkisnrdec:20150611153817p:plain

using UnityEngine;
using System.Collections;

public class FootSoldier : MonoBehaviour
{
    [SpineAnimation]
    public string idleAnim;

    [SpineAnimation]
    public string[] attackAnims;

    SkeletonAnimation skelAnim;

    void Start()
    {
        skelAnim = GetComponent<SkeletonAnimation>();
        skelAnim.state.SetAnimation(0, idleAnim, true);
    }

    void Update()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            var attackAnim = attackAnims[Random.Range(0, attackAnims.Length)];
            skelAnim.state.SetAnimation(0, attackAnim, false);
            skelAnim.state.AddAnimation(0, idleAnim, true, .5f);
        }
    }
}

スクリプトに、アイドル(待機)時のアニメーションを指定します。
f:id:kikkisnrdec:20150611154227p:plain

また攻撃時のアニメーションを指定します。
f:id:kikkisnrdec:20150611154246p:plain

作用キャラの当たり判定オブジェクトにスクリプトを追加

当たり判定となるオブジェクトに対して、コライダー衝突時の処理を追加します。
f:id:kikkisnrdec:20150611154522p:plain

using UnityEngine;
using System.Collections;

public class Sword : MonoBehaviour
{
    BoundingBoxFollower follower;

    void Start()
    {
        follower = GetComponent<BoundingBoxFollower>();
    }

    void OnTriggerEnter2D(Collider2D collider)
    {
        collider.SendMessage("Hit", follower.CurrentAttachmentName, SendMessageOptions.DontRequireReceiver);
    }
}

反作用キャラにスクリプトを追加

反作用キャラに、当たり時のアニメーションを追加します。
f:id:kikkisnrdec:20150611160453p:plain

using UnityEngine;
using System.Collections;

public class Woodman : MonoBehaviour
{
    [SpineAnimation]
    public string hitAnim;

    SkeletonAnimation skelAnim;

    void Start()
    {
        skelAnim = GetComponent<SkeletonAnimation>();
    }

    void Hit(string attachmentName)
    {
        if (attachmentName == "Stab")
        {
            Debug.Log("Stabbed");
        }
        else if (attachmentName == "Slice")
        {
            Debug.Log("Sliced");
        }
        skelAnim.state.SetAnimation(0, hitAnim, false);
    }
}

スクリプトに、当たり時のアニメーションを指定します。
f:id:kikkisnrdec:20150611160636p:plain

結果

実行すると、以下の通り、作用キャラの攻撃が反作用キャラに当たった際に、デバッグログが出力されます。
f:id:kikkisnrdec:20150611160735p:plain

SpineではMayaと違い、リグの構成がUnity上で確認することが困難です。
そのため当たり判定については、従来の方法では実装が大変でした。
しかし、BoundingBoxを用いることで簡単に実装できます。
皆さんも是非ご利用下さい!

これにて説明終了です。

総括

Spineを用いることで、リッチなアニメーションをゲーム内に導入できます。
ただ当たり判定の調節やアニメーションの連携といった、少し複雑なことを実現しようとすると、一回りも二回りも工夫が必要です。
例えば、特定のアニメーションで一部のパーツのスキンを差し替えるといった場合、公式のライブラリを拡張して実装する他ありません。

しかし、公式でも機能充実を図るため、日々アップデートしています。
今回共有した内容は、公式側で4月に対応されて間もない技術です。
公式でも随時、機能が追加されているので、逐次チェックしてもいいかもしれませんね。

以上、閲覧ありがとうございました。

※無断転載禁止 Copyright (C) 2015 kikkisnrdec All Rights Reserved.