• 日本語
  • 【Unity】AddAnimationと同じタイミングでアニメーション再生する方法

Related Discussions
...

お世話になっています。
spine-UnityにてAddanimationと同じタイミングでアニメーションを再生しようと思っているのですが
ランタイムドキュメンをを見ても良さそうな方法が見当たらなかったので相談させていただきます。

実装しようとしているものの例ですが、
インデックス1番で「走る構えのアニメーション」を再生後、
同じくインデックス1番で「走るアニメーション」を再生しようと思っています。

skeletonAnimation.AnimationState.SetAnimation(1, "Ready", false);
skeletonAnimation.AnimationState.AddAnimation(1, "run", false, 0);

このとき、runのアニメーションが始まったらrun用の土埃などのエフェクトを付けたいと思っています。
インデックス2番で「runeffect」アニメーションを再生したいのですが、どう記載すればよいかわかりません。

なにか良い方法などございますでしょうか。

こんにちは!
AnimationStateが発行するイベントを利用すれば、アニメーションの開始や終了に合わせて様々な処置を行うことが出来ます。
spine-unityランタイムドキュメント: AnimationStateイベントの処理

今回の場合、「特定のアニメーションが始まった時」に処理を行いたいとのことなので、TrackEntryを利用して以下のように記述していただければ良いかと思います。※仮にエフェクト再生のメソッド名をOnRunAnimationStartとしています

TrackEntry trackEntry = skeletonAnimation.AnimationState.AddAnimation(1, "run", false, 0);
trackEntry.Start += OnRunAnimationStart;

として、OnRunAnimationStartを

public void OnRunAnimationStart(TrackEntry trackEntry) {
   skeletonAnimation.AnimationState.SetAnimation(2, "runeffect", false);
}

といった具合に記述していただければ同時に再生を始められます。

上の例ではStartイベントを利用しましたが、逆に先のアニメーションの再生が完了した時に合わせたい場合はtrackEntry.CompleteまたはtrackEntry.Endを利用してください。

この回答が参考になれば幸いです。

ありがとうござます!
教えていただきましたTrackEntryについかする方法で無事実装できました!
助かりました!

ご報告ありがとうございます!無事実装できたとのことで良かったです!😃

3 months later

すみませんこちらなのですが、頂いた方法で実装は出来たのですが、当事象を複数実装すると結構コードが複雑になってしまいます。
なので要望として同時再生もできるように要望させていただきたく思います……


「構える」アニメーション後に「攻撃」と「斬撃」のアニメーションをさせたいなどがあるため、
skeletonAnimation.AnimationState.SetAnimation(1, "Kamae", false);
skeletonAnimation.AnimationState.AddAnimation(1, "Kougeki", false, 0);
skeletonAnimation.AnimationState.SyncAnimation(2, "Zangeki", false, 0);

みたいな1行でまとめられるようになると助かります……

短くしたい場合は、ラムダを使用できます。

TrackEntry trackEntry = skeletonAnimation.AnimationState.AddAnimation(1, "run", false, 0);
trackEntry.Start += (entry) => { skeletonAnimation.AnimationState.SetAnimation(2, "runeffect", false); };

または拡張メソッドとして:

public static class AnimationStateExtensions {
   public static TrackEntry AddSyncedAnimations (this Spine.AnimationState animationState,
   int trackIndex0, string animationName0, bool loop0, float delay0,
   int trackIndex1, string animationName1, bool loop1) {

  TrackEntry trackEntry = animationState.AddAnimation(trackIndex0, animationName0, loop0, delay0);
  trackEntry.Start += (e) => { animationState.SetAnimation(trackIndex1, animationName1, loop1); };
  return trackEntry;
   }
}

skeletonAnimation.AnimationState.AddSyncedAnimations(1, "run", false, 0,
    2, "runeffect", false);

You could just use a lambda if you want to keep it short:

TrackEntry trackEntry = skeletonAnimation.AnimationState.AddAnimation(1, "run", false, 0);
trackEntry.Start += (entry) => { skeletonAnimation.AnimationState.SetAnimation(2, "runeffect", false); };

Or as an extension method:

public static class AnimationStateExtensions {
   public static TrackEntry AddSyncedAnimations (this Spine.AnimationState animationState,
   int trackIndex0, string animationName0, bool loop0, float delay0,
   int trackIndex1, string animationName1, bool loop1) {

  TrackEntry trackEntry = animationState.AddAnimation(trackIndex0, animationName0, loop0, delay0);
  trackEntry.Start += (e) => { animationState.SetAnimation(trackIndex1, animationName1, loop1); };
  return trackEntry;
   }
}

skeletonAnimation.AnimationState.AddSyncedAnimations(1, "run", false, 0,
    2, "runeffect", false);