こんにちは。ご質問ありがとうございます。
スタックオーバーフローが発生している原因は、イベントハンドラー内で AnimationState.Apply() を呼び出しているためです。
問題の原因
AnimationState.Event は、AnimationState.Apply() の内部処理中に発火します。そのため、イベントハンドラー内で再び Apply() を呼び出すと、以下のような無限再帰が発生します:
Apply() → イベント発火 → イベントハンドラー実行 → Apply() → イベント発火 → ...
これがスタックオーバーフローの原因です。
解決方法
イベントハンドラー内では AnimationState.Apply() を呼び出さないでください。SetAnimation() などのアニメーション設定だけを行い、Apply() は通常のゲームループ(通常は SkeletonAnimation コンポーネントが自動的に行います)に任せてください。
修正後のコード例
private void Spine_Event(TrackEntry trackEntry, Spine.Event spineEvent)
{
switch (spineEvent.Data.Name)
{
case "_TEST":
Debug.Log("SpineEvent_:_TEST");
track2 = skeletonAnimation.AnimationState.SetAnimation(2, "Add/Breathing_High", true);
track2.MixBlend = MixBlend.Add;
// Apply()は呼び出さない!
break;
}
}
SkeletonAnimation コンポーネントは自動的に毎フレーム以下の処理を行います:
AnimationState.Update(deltaTime)
AnimationState.Apply(skeleton)
Skeleton.UpdateWorldTransform()
そのため、イベントハンドラー内でアニメーション設定を変更すれば、次のフレームで自動的に反映されます。
注意事項
もし、どうしても即座に変更を反映させたい場合は、AnimationState.Update(0) を呼んでから Apply() を呼ぶ必要がありますが、イベントハンドラー内では推奨されません:
// イベントハンドラー内では使用しないでください
state.SetAnimation(0, "jump", false);
state.Update(0); // 内部状態を更新
state.Apply(skeleton);
この方法でも無限再帰のリスクがあるため、基本的にはイベントハンドラー内では SetAnimation() などの設定のみを行い、Apply() は呼び出さないことをお勧めします。
ご不明な点がございましたら、お気軽にお尋ねください。