Main/System/Hero/UIHeroController.cs
@@ -6,49 +6,76 @@
using UnityEngine.EventSystems;
public class UIHeroController : MonoBehaviour
{
   public void Create(int _skinID, Action _onComplete = null)
   {
      skinID = _skinID;
      onComplete = _onComplete;
      GameObject battleGO = ResManager.Instance.LoadAsset<GameObject>("Hero/SpineRes", "Hero_001");
      GameObject instanceGO = null;
      if (!transform.gameObject.activeSelf)
      {
         transform.SetActive(true);
      }
      instanceGO = GameObject.Instantiate(battleGO, transform);
      skeletonGraphic = instanceGO.GetComponentInChildren<SkeletonGraphic>(true);
      var skinConfig = HeroSkinConfig.Get(skinID);
      skeletonGraphic.skeletonDataAsset = ResManager.Instance.LoadAsset<SkeletonDataAsset>("Hero/SpineRes/", skinConfig.SpineRes + "_SkeletonData");
      skeletonGraphic.Initialize(true);
      spineAnimationState = skeletonGraphic.AnimationState;
      PlayAnimation(MotionName.idle, true);
      spineAnimationState.Complete += OnAnimationComplete;
   }
   private GameObjectPoolManager.GameObjectPool pool;
   private int skinID;
   protected SkeletonGraphic skeletonGraphic;
   protected Spine.AnimationState spineAnimationState;
   private GameObject instanceGO;
   private Spine.TrackEntry currentTrackEntry;
   private Action onComplete;
   void Destroy()
   public void Create(int _skinID, float scale = 1f, Action _onComplete = null)
   {
      if (skinID == _skinID)
      {
         //避免重复创建
         return;
      }
      skinID = _skinID;
      onComplete = _onComplete;
      pool = GameObjectPoolManager.Instance.RequestPool(UILoader.LoadPrefab("UIHero"));
      if (!transform.gameObject.activeSelf)
      {
         transform.SetActive(true);
      }
      if (instanceGO == null)
      {
         instanceGO = pool.Request();
         instanceGO.transform.SetParent(transform);
         //transform 的Pivot Y是0,让instanceGO 居中
         instanceGO.transform.localPosition = new Vector3(0, instanceGO.GetComponent<RectTransform>().sizeDelta.y * 0.5f);
         //instanceGO.transform.localPosition = Vector3.zero;
         instanceGO.transform.localScale = Vector3.one;
         instanceGO.transform.localRotation = Quaternion.identity;
      }
      skeletonGraphic = instanceGO.GetComponentInChildren<SkeletonGraphic>(true);
      var skinConfig = HeroSkinConfig.Get(skinID);
      skeletonGraphic.skeletonDataAsset = ResManager.Instance.LoadAsset<SkeletonDataAsset>("Hero/SpineRes/", skinConfig.SpineRes);
      skeletonGraphic.Initialize(true);
      this.transform.localScale = Vector3.one * scale;
      spineAnimationState = skeletonGraphic.AnimationState;
      spineAnimationState.Data.DefaultMix = 0f;
      PlayAnimation(MotionName.idle, true);
      spineAnimationState.Complete -= OnAnimationComplete;
      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 void OnDestroy()
   {
        if (spineAnimationState != null)
        {
            spineAnimationState.Complete -= OnAnimationComplete;
        }
      if (pool != null)
         pool.Release(instanceGO);
      skeletonGraphic = null;
      pool = null;
   }
    public virtual void PlayAnimation(MotionName motionName, bool loop = false)
    {
        if (spineAnimationState == null) return;
      // 直接使用 ToString() 而不是调用 GetAnimationName
        spineAnimationState.SetAnimation(0, motionName.ToString(), loop);
    }
   /// <summary>