hch
2026-02-27 cd759dfd81f421dc64858ceef367564609634ae6
Main/System/Hero/UIHeroController.cs
@@ -1,5 +1,6 @@
using System;
using Spine;
using Spine.Unity;
using UnityEngine;
using UnityEngine.UI;
@@ -10,15 +11,32 @@
   private int skinID;
   protected SkeletonGraphic skeletonGraphic;
   protected Spine.AnimationState spineAnimationState;
   public Spine.AnimationState spineAnimationState;
   private GameObject instanceGO;
   private Action onComplete;
   public Action onComplete;
   public void Create(int _skinID, float scale = 0.8f, Action _onComplete = null, string motionName = "idle", bool isLh = false)
   {
      if (skinID == _skinID)
      {
         //避免重复创建
         if (skeletonGraphic != null)
         {
            SetMaterialNone();
            if (isLh)
            {
               var skinConfigTmp = HeroSkinConfig.Get(skinID);
               if (skinConfigTmp != null && skinConfigTmp.Tachie.IsSpine())
               {
                  skeletonGraphic.enabled = true;
               }
            }
            else
            {
               skeletonGraphic.enabled = true;
            }
         }
         return;
      }
@@ -43,7 +61,7 @@
         //立绘特殊处理,没有spine动画的改用图片
         var lhImg = this.AddMissingComponent<RawImage>();
         if (!skinConfig.Tachie.Contains("SkeletonData"))
         if (!skinConfig.Tachie.IsSpine())
         {
            //图片替换
            lhImg.SetTexture2DPNG(skinConfig.Tachie);
@@ -71,7 +89,7 @@
      }
      onComplete = _onComplete;
      pool = GameObjectPoolManager.Instance.RequestPool(UILoader.LoadPrefab("UIHero"));
      pool = GameObjectPoolManager.Instance.GetPool(UILoader.LoadPrefab("UIHero"));
      if (!transform.gameObject.activeSelf)
      {
@@ -109,18 +127,34 @@
         Debug.LogError("未配置spine");
         return;
      }
      skeletonGraphic.initialSkinName = skinConfig.InitialSkinName;
      skeletonGraphic.Initialize(true);
      // 初始化完成后设置皮肤
      if (!string.IsNullOrEmpty(skinConfig.InitialSkinName))
      {
         var skeleton = skeletonGraphic.Skeleton;
         skeleton.SetSkin(skinConfig.InitialSkinName);
         skeleton.SetSlotsToSetupPose();
         skeletonGraphic.Update(0);
      }
      skeletonGraphic.enabled = true;
      SetMaterialNone();
      spineAnimationState = skeletonGraphic.AnimationState;
      spineAnimationState.Data.DefaultMix = 0f;
      if (motionName == "")
         motionName = GetFistSpineAnim();
      PlayAnimation(motionName, true);
      spineAnimationState.Complete -= OnAnimationComplete;
      spineAnimationState.Complete += OnAnimationComplete;
   }
   public bool HasAnimation(string motionName)
   {
      return skeletonGraphic != null && skeletonGraphic.Skeleton != null && skeletonGraphic.Skeleton.ContainsMotion(motionName);
   }
   protected void OnDestroy()
@@ -141,15 +175,15 @@
   /// <param name="motionName">动作名</param>
   /// <param name="loop">循环</param>
   /// <param name="replay">如果相同动作是否再次重播,比如跑步重播就会跳帧不顺滑</param>
   public virtual void PlayAnimation(string motionName, bool loop = false, bool replay=true)
   public virtual TrackEntry PlayAnimation(string motionName, bool loop = false, bool replay = true)
   {
      if (spineAnimationState == null) return;
      if (spineAnimationState == null) return null;
      if (GetCurrentAnimationName() == motionName && !replay)
         return;
         return null;
      // 直接使用 ToString() 而不是调用 GetAnimationName
      spineAnimationState.SetAnimation(0, motionName.ToString(), loop);
      return spineAnimationState.SetAnimation(0, motionName.ToString(), loop);
   }
   // 播放第一个动画(作为默认动画)
@@ -197,11 +231,20 @@
   }
   public void SetEnabled(bool isEnable)
   {
   {
      if (skeletonGraphic == null)
      {
         return;
      }
      skeletonGraphic.enabled = isEnable;
   }
   public void SetGray()
   {
      skeletonGraphic.material = MaterialUtility.GetDefaultSpriteGrayMaterial();
   }
   public void SetMaterialNone()
   {
      skeletonGraphic.material = null;
   }
}