スパイン アニメーション ツール

1.ファイル構造

Spine によってエクスポートされたリソース ファイル:

  • .atlas: アトラス データ ファイル。各テクスチャのデータ情報を内部的に保存します。
  • .png: アトラス リソース
  • .skel / .json バイナリ ファイル: スケルトン情報

アトラスは、テクスチャ アンパッカーで展開できます。対応する .png 画像が .atlas と同じレベルのディレクトリに存在する必要があることに注意してください。.atlas ファイルを開いて確認できます。

末尾が .skel または .json のボーン情報については、上の画像のインポートデータをクリックするだけです.ここで注意すべきは、バージョンが生産時のバージョンに一致している必要があることです.そうしないと、インポートに失敗する可能性があります. Spine バイナリ ボーンのバージョン ファイル構造は現在のバージョンとは異なります

最後のステップ: 画像のパスを選択します。ここにある画像は、上記のアトラス ファイルを解凍した後のスプライトです。

2. Spine ツールのチュートリアル

もちろん、多くの情報があるため、ここには Spine のチュートリアルはありません。また、公式 Web サイトにアクセスして確認することもできます。生産プロセス. いくつかの基本的な概念を理解するだけで済みます:

  1. 画像: http://zh.esotericsoftware.com/spine-images
  2. ツールエリア: http://zh.esotericsoftware.com/spine-tools
  3. アニメーション: http://zh.esotericsoftware.com/spine-keys
  4. スキン: http://zh.esotericsoftware.com/spine-skins
  5. 添付ファイル: http://zh.esotericsoftware.com/spine-attachments

3. Unity ランタイム ライブラリ

3.8以降のバージョンでは、Spineはカスタムアセンブリを使用するため、パッケージをインポートした後、.asmdefファイルに注意を払い、対応するspine.unity参照を自分で追加する必要があることに注意してください。

3.1 Spine リソースを Unity にインポートする

または、次の 3 つのファイルの名前を変更します。

  • アトラスのサフィックスが .atlas.txt に変更されました
  • skel のサフィックスは skel.json です。json のサフィックスであれば、変更する必要はありません。

次に、それを Unity に直接コピーすれば問題ありません。成功すると、複数の新しいファイルが生成されます。

3.2 Spine GO を追加する:

メニュー → ゲームオブジェクト → Spine →

  • SkeletonAnimation: MeshRenderer に依存
  • SkeletonGraphic: メッシュは Unity UI 用に毎フレーム更新されます
  • SkeletonRenderer: 基本クラス

通常、SkeletonGraphic が使用されます。そうしないと、UI に階層的な問題が発生する可能性があります

3.3 プログラムインターフェース

以下は、SkeletonAnimation に似た、SkeletonGraphic コンポーネントの一般的なインターフェイス/パネル設定の一部です。

  • AnimationName: アニメーション名
  • InitialSkinName: スキン
  • InitialFlipY / InitialFlipY: ミラー フリップ
  • Loop: ループを有効にするかどうか
  • TimeScale: 速度乗数
  • Freeze: 最初のフレームをフリーズするかどうか
  • Initialize(bool): スケルトン データを初期化し、現在のコンポーネントのデータに従ってアニメーションを再生します。true を渡して強制的に更新します。

コード参照:

self.spineTest = self.panel.Spine.gameObject:GetComponent("SkeletonGraphic")
self.spineTest.AnimationName = "upgrade_6"
self.spineTest.initialSkinName = "skin_6"
self.spineTest:Initialize(true)

より深く理解したい場合、またはインターフェイスが見つからない場合は、ソース コードを直接参照できます。パスは Asset/Spine の下にあります。または、公式 Web サイトを参照できます: http://en . esotericsoftware.com/spine-unity

4. 一般的な需要問題の処理

4.1 UI レベルの問題

Spine コンポーネントを SkeletonGraphic に置き換えて完了

4.2 アニメ連続放送の実現

たとえば、最初にアニメーション A を再生し、再生が完了してからアニメーション B を再生するとします。

Spine は、タイマーを開始せずにアニメーション ステート マシンをサポートします。簡単な例は次のとおりです。

  1. skeleton.AnimationState:SetAnimation(0, A, false): Track0 でアニメーション A を再生する
  2. skeleton.AnimationState:AddAnimation(0, B, true, 0): Track0 の後ろにアニメーション B を追加し、Track0 の前に追加されたアニメーションが順番に再生された後、アニメーション B をループ再生します。メソッドの 4 番目のパラメータは再生遅延です. 0 が渡された場合, デフォルトは連続再生です. それ以外の場合, キューの最後のアニメーションが同時に再生され, s 秒の遅延の後に再生されます. .

ただし、連続ブロードキャスト アニメーションには K 番目の最初のフレームが必要であることに注意してください。 POSEをバインドする

トラックについて:

SetAnimation または AddAnimation を呼び出すと、再生中またはキューイング中のアニメーション インスタンスを表す TrackEntry オブジェクトが返されます。このオブジェクトには、アニメーションに関する情報 (再生経過時間、再生速度、およびその他の属性) が含まれます。再生中またはキューイングされたアニメーションを制御する AddAnimation 外の Play パラメータ

参照コード:

self.spineTest = self.panel.Spine.gameObject:GetComponent("SkeletonGraphic")
self.spineTest.initialSkinName = "dw6"
self.spineTest:Initialize(true)
self.spineTest.AnimationState:SetAnimation(0, "upgrade_1", false)
self.spineTest.AnimationState:AddAnimation(0, "upgrade_2", false, 0)
self.spineTest.AnimationState:AddAnimation(0, "upgrade_3", true, 0)

4.3 ドレスアップ

4.3.1 グローバルドレスアップ

Spine はグローバル フェイスリフティングをサポートしています。ツールにスキンを追加するだけで済みます。

たとえば、表示するセグメント アニメーションが 12 種類あり、6 種類のアニメーションのそれぞれのボーンは同じですが、アタッチメント (テクスチャ) が異なります。そうすることの利点 はい: アニメーションが多すぎる場合、作業を繰り返す必要はなく、対応するスキンのプレースホルダーを変更するだけです

次のスロットには 6 つの異なるイメージ アタッチメントがあり、各スロットが複数のアニメーションではなくスキンに対応するように最適化できます。

次のように進めます。

1. 左上隅で設定モードに切り替え、6 つのスキンを追加し、対応するスロットの下に 1 つのスキン プレースホルダーを追加します。

2. 変更する現在のスキンを選択し、対応するスキンの添付画像をスキン プレースホルダーにドラッグします。

完了したら、ゲームに入り、InitialSkinName 属性を変更してスキンを直接テストします

4.3.2 部分的なフェイスリフト

より複雑な状況もあります: 装飾/スキンの組み合わせ

そのような背骨の悪役がいる場合、プレイヤーがドレスをカスタマイズできるようにする 5 つのパーツがあります: 5x ヘッドギア、5x 顔装飾、6x 翼、5x 衣服、2x 尾装飾、合計 5x5x6x5x2 = 1500 の異なる組み合わせがあります。もちろん、アーティストが望む限り、1500 のスキンを直接デザインすることもできますが、実際には、対応するパーツに対して 5+5+6+5+2 = = 23 セットのスキンをデザインするだけで済みます。実行時にそれらをペアで結合します。簡単な方法

Spine ランタイム バージョン 3.7 以前が複数のスキン セットの同時アクティブ化をサポートしていないのは残念ですが、一時的な解決策全体はまだ可能です: SpineMultiplySkin を対応するスパイン UI に追加するだけで問題ありません

手順:

self.spineCustom = self.panel.Spine.gameObject:GetComponent("SpineMultiplySkin")
self.spineCustom.Skin = {"皮肤1", "皮肤2", "皮肤3"} --这些皮肤会被整合成一个全套
self.spineCustom:ApplyNewSkin() --更新插槽下的所有附件,换装
self.spineTest.AnimationState:SetAnimation(0, "upgrade", false)

設計原則:

非常に簡単です。ソース コードの SetSkin メソッドを参照してください。すべてのスロットのスキン プレースホルダーを取得する必要があるだけです。次に、すべてのアタッチメントをスキン プレースホルダーの下に保存し、それらを新しいスキンの組み合わせとして統合し、再適用して更新します。スロットは次のとおりです。 OK、コードの一部は次のとおりです。

public void UpdateSkin()
{
    if (targetSkeleton == null)
        targetSkeleton = gameObject.GetComponent<SkeletonGraphic>();

    //将所有皮肤取并集,要求对于每个皮肤占位,都最多只有一个皮肤下存在附件
    slotAttachmentDic.Clear();
    for (int i = 0; i < Skin.Length; i++)
    {
        string skinName = Skin[i];
        SkeletonData skeletonData = targetSkeleton.SkeletonDataAsset.GetSkeletonData(false);
        Skin skin = skeletonData.FindSkin(skinName);
        if (skin == null)
        {
            continue;
        }

        for (int j = 0, n = skeletonData.Slots.Count; j < n; j++)
        {
            SlotData slot = skeletonData.Slots.Items[j];
            if (slot.AttachmentName != null)
            {
                //根据皮肤占位符获取当前皮肤的附件,这里的附件可以为空
                Attachment attachment = skin.GetAttachment(j, slot.AttachmentName);
                if (slotAttachmentDic.ContainsKey(slot.Name))
                {
                    //如果当前没有附件则跳过
                    if (attachment == null)
                        continue;

                    //否者这个附件必须是皮肤组合种独一无二的
                    if (slotAttachmentDic[slot.Name] == null)
                        slotAttachmentDic[slot.Name] = attachment;
                    else
                    {
                        Debug.LogError(String.Format("错误的皮肤设置!同一皮肤占位符下最多只允许一个皮肤持有附件,占位符名:{0}", slot.AttachmentName));
                    }
                }
                else
                {
                    //是独一无二的
                    slotAttachmentDic.Add(slot.Name, attachment);
                }
            }
        }
    }
}
public void ApplyNewSkin()
{
    UpdateSkin();
    foreach (var item in targetSkeleton.Skeleton.Slots)
    {
        string slotName = item.ToString();
        if (slotAttachmentDic.ContainsKey(slotName))
        {
            item.Attachment = slotAttachmentDic[slotName];
        }
        //所有不包含皮肤占位符的插槽,保持原样
    }
}

これの利点の 1 つは、多くの不要な構成とトラブルを回避できることです。

おすすめ

転載: blog.csdn.net/Jaihk662/article/details/118421939