using System.Collections; using Spine.Unity; using UnityEngine; /// /// Spine SkeletonGraphic 版 NPC,动画名在 Inspector 配置。 /// public class EventMatchNpcSpinePresenter : EventMatchNpcPresenter { [SerializeField] SkeletonGraphic skeletonGraphic; [SerializeField] string idleAnimation = "match_easter_npc_idle"; [SerializeField] string successAnimation = "match_easter_npc_success"; [SerializeField] string successMoreAnimation = "match_easter_npc_success_more"; void Awake() { if (skeletonGraphic == null) skeletonGraphic = GetComponent(); } void Start() { if (skeletonGraphic != null && !string.IsNullOrEmpty(idleAnimation)) skeletonGraphic.AnimationState.SetAnimation(0, idleAnimation, true); } Coroutine _playReactionCo; void OnDestroy() { if (_playReactionCo != null) StopCoroutine(_playReactionCo); } public override void PlayMatchReaction(bool isSuccessMore) { if (skeletonGraphic == null) return; if (_playReactionCo != null) StopCoroutine(_playReactionCo); _playReactionCo = StartCoroutine(PlayMatchReactionRoutine(isSuccessMore)); } IEnumerator PlayMatchReactionRoutine(bool isSuccessMore) { string clip = isSuccessMore ? successMoreAnimation : successAnimation; skeletonGraphic.AnimationState.SetAnimation(0, clip, false); float duration = skeletonGraphic.AnimationState.GetCurrent(0).Animation.Duration; yield return Awaiters.Seconds(duration); _playReactionCo = null; if (skeletonGraphic != null && !string.IsNullOrEmpty(idleAnimation)) skeletonGraphic.AnimationState.SetAnimation(0, idleAnimation, true); } }