fujii ご確認いただきありがとうございます!なるほど、ClearTrack()
とSetEmptyAnimation()
を使用されていたのですね。
すでに問題は解決されているようなので詳しい説明は不要かもしれませんが、同様の問題に遭遇した方にも向けて以下に補足します。
まずSetEmptyAnimation()
メソッドについて、これは主に、トラックに先にキューされているアニメーションを破棄してセットアップポーズに戻す※ために使用されます。※下位トラックにアニメーションが適用されている場合は下位トラックが優先されます。
例えば、トラック0にwalk
(歩行)アニメーション、トラック1にaim
(銃を構える)アニメーションがセットされている状態から、walk
は再生したままでaim
だけを破棄したい場合、トラック1に対してSetEmptyAnimation()
メソッドで空のアニメーションをセットすれば、walk
と aim
の両方でキーが設定されているタイムラインはwalk
アニメーションにミックスされ、aim
にはあってもwalk
にはキーが無いタイムラインはセットアップポーズに対してミックスされることにより、walk
アニメーションだけが適用されている時の状態に戻ります。
ただ、SetEmptyAnimaton()
で空のアニメーションをセットする場合、指定したトラックに対してすぐに空のアニメーションをセットするので、先にキューされていたアニメーションが最後まで再生されていなくても中断することになります。もし先にキューされていたアニメーションを最後まで再生しつつ空のアニメーションにミックスアウトするようにしたい場合はAddEmptyAnimation()
を使用できます。
spineAnimationState.SetAnimation(0, "walk", true);
spineAnimationState.SetAnimation(1, "aim", false);
spineAnimationState.AddEmptyAnimation(1, 0.2f, 1.0f); //トラック1のaimアニメーションを、1秒のディレイの後に0.2秒かけてセットアップポーズ(または下位トラックのwalk)へミックスアウトさせる
結果はこのようになります:
そしてここが今回誤解があった点かと思いますが、SetAnimation()
は指定したトラックにアニメーションをセットするだけでなく、ミックス完了後に先にキューされていたアニメーションを破棄します。
よって、例えばトラック0で再生されているwalk
アニメーションをrun
アニメーションに置き換えるなど、すでにアニメーションが再生されているトラックに対して新しいアニメーションをセットすることはSetAnimation()
だけで実現できます。そして空のアニメーションのセットと同じく、もし先にキューされていたアニメーションを最後まで再生しつつ次のアニメーションにミックスアウトしたい場合はAddAnimation()
が使用できます。
これらについては以下の動画が参考になるかもしれません:
また、SetEmptyAnimation()
のもう一つの使い方として、先にSetEmptyAnimation()
でトラックに空のアニメーションをセットしておいて、その後AddAnimation()
でアニメーションをセットすることで、セットアップポーズからスムーズにアニメーションをミックスインできるようにするという使い方があります。例えば以下のようなコードで、セットアップポーズから2秒かけてwalk
アニメーションをミックスインできます:
spineAnimationState.SetEmptyAnimation(0, 0);
var trackEntry = spineAnimationState.AddAnimation(0, "walk", true, 0);
trackEntry.MixDuration = 2.0f;
結果はこのようになります:
もし上の例の2行目をAddAnimation()
ではなくSetAnimation()
にすると、先にセットした空のアニメーションをただちに置き換えてアニメーションを再生してしまうので、空のアニメーションに対するミックスが起こりません。よってSetEmptyAnimation()
の次にSetAnimation()
を続けると、空のアニメーションをセットした意味がなくなります。
一方、ClearTrack()
はミックスを行わずに指定したトラックの全てのアニメーションを削除し、かつスケルトンの現在のポーズをそのまま残します。なので、ClearTrack()
を使ってアニメーションを削除してしまうと、今回のfujiiさんのケースのようにそれまで再生されていたアニメーションのアタッチメントの表示状態が残るなど中途半端な状態になってしまうことがあります。実際、一般的なアニメーションの実装ではClearTrack()
を使うことはほとんどありません。
今回の問題とは直接関係ないことまで含めて説明させていただきましたが、同じ問題に遭遇された方向けの補足ですのでご返信は不要です。ご参考になれば幸いです!