UnityでSpineデータの一部にモザイクなどのシェーダーをあてるtips

AvatarPosted by

こんにちは、Unityエンジニアの黒板です。

今回はSpineで作成したデータの各パーツに別々のシェーダーをアタッチするための一連の流れについて紹介したいと思います。

※この記事はGRIPHONE Advent Calendar 2018 16日目の記事です。
https://adventar.org/calendars/3147
https://qiita.com/advent-calendar/2018/griphone

まず、Spineでデータを作成します。

このとき、イメージファイルのディレクトリをあてたいシェーダーごとに分けて格納します。
下の図は4つに分けて格納した時の例になります。

mosaicは黒の小さい素材にしておいて、モザイクのかけたい場所に任意の形でアニメーションさせておくことができます。
opticalはPhotoshopなどにおけるOverlayなどの演出をするために使用できます。

次に、バイナリ形式でエクスポートします。

バイナリ形式でエクスポートする場合、拡張子をskel.bytesにしないといけないので注意してください。アトラス作成はする必要ありません。

終わったら、バイナリをエクスポートしたディレクトリと同じ場所にテクスチャパッカーを使用してアトラスを出力します。

こうすると、分けておいたイメージフォルダごとにテクスチャが管理できるようになります。

エクスポートが終わったら、/Hoge/exportフォルダをUnityにドラッグ&ドロップして取り込みます。
生成されたマテリアルのシェーダーを任意に設定してください。
モザイクシェーダーなどは自前で用意します。

SkeletonDataからSkeletonAnimation形式で生成してできることが確認できれば完了です!

SkeletonGraphic形式では複数のマテリアルの参照がもてないため、拡張しない限りはSkeletonAnimation形式でないとこの方法は使えないことに注意してください。

【おまけ】

スキンを変更するのではなく、同時に出すためにAddSkinメソッドを拡張してみると以下のようになります。

public static class HogeSkeletonExtensions
{
    #region Public Method
    // 指定されたスキンを追加する拡張メソッド
    public static void AddSkin(this Skeleton skeleton, string skinName)
    {
        if (skeleton.skin == null)
        {
            Debug.LogError("Current skin is null");
            return;
        }

        var foundSkin = skeleton.data.FindSkin(skinName);
        if (foundSkin == null)
        {
            throw new ArgumentException("Skin not found: " + skinName, nameof(skinName));
        }

        foreach (var attachment in foundSkin.Attachments)
        {
            skeleton.skin.Attachments[attachment.Key] = attachment.Value;
        }
    }
}