using System; using Spine.Unity; using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; public class UIHeroController : MonoBehaviour { public void Create(int _skinID, float scale = 1f, Action _onComplete = null) { skinID = _skinID; onComplete = _onComplete; GameObject battleGO = UILoader.LoadPrefab("UIHero"); GameObject instanceGO = null; if (!transform.gameObject.activeSelf) { transform.SetActive(true); } instanceGO = GameObject.Instantiate(battleGO, transform); skeletonGraphic = instanceGO.GetComponentInChildren(true); var skinConfig = HeroSkinConfig.Get(skinID); skeletonGraphic.skeletonDataAsset = ResManager.Instance.LoadAsset("Hero/SpineRes/", skinConfig.SpineRes + "_SkeletonData"); skeletonGraphic.Initialize(true); this.transform.localScale = Vector3.one * scale; spineAnimationState = skeletonGraphic.AnimationState; PlayAnimation(MotionName.idle, true); spineAnimationState.Complete += OnAnimationComplete; } private int skinID; protected SkeletonGraphic skeletonGraphic; protected Spine.AnimationState spineAnimationState; private Spine.TrackEntry currentTrackEntry; private Action onComplete; void Destroy() { spineAnimationState.Complete -= OnAnimationComplete; } public virtual Spine.TrackEntry PlayAnimation(MotionName motionName, bool loop = false) { if (spineAnimationState == null) return null; // 直接使用 ToString() 而不是调用 GetAnimationName currentTrackEntry = spineAnimationState.SetAnimation(0, motionName.ToString(), loop); return currentTrackEntry; } /// /// 动画完成事件处理 /// protected virtual void OnAnimationComplete(Spine.TrackEntry trackEntry) { onComplete?.Invoke(); } }