From da12a82814ec034922881e16090fa1d7304191c3 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期四, 17 七月 2025 22:59:37 +0800
Subject: [PATCH] 0312 新shader文字描边 和 图片流光shader; 武将部分代码

---
 Main/System/Tip/ScrollTip.cs             |    2 
 Main/System/Hero/UIHeroController.cs     |    5 
 Main/System/Battle/BattleHUDWin.cs       |    2 
 Main/System/HeroUI/HeroCardCell.cs       |   52 ++++++
 Main/Component/UI/Core/OutlineColor.cs   |    2 
 Main/System/Redpoint/MainRedDot.cs       |   22 +-
 Main/Component/UI/Core/OutlineEx.cs      |  230 ++++++++++++++++++++++++++++++++
 Main/ResModule/UILoader.cs               |   14 +-
 Main/System/Hero/HeroInfo.cs             |    9 +
 Main/Utility/UIUtility.cs                |    2 
 Main/Component/UI/Core/OutlineEx.cs.meta |   11 +
 Main/System/Hero/HeroManager.cs          |    3 
 Main/System/HeroUI/HeroCardLineCell.cs   |    2 
 Main/Config/Configs/HeroConfig.cs        |   38 +++--
 Main/System/HeroUI/HeroListWin.cs        |    7 
 15 files changed, 351 insertions(+), 50 deletions(-)

diff --git a/Main/Component/UI/Core/OutlineColor.cs b/Main/Component/UI/Core/OutlineColor.cs
index c224c8f..0df0315 100644
--- a/Main/Component/UI/Core/OutlineColor.cs
+++ b/Main/Component/UI/Core/OutlineColor.cs
@@ -4,7 +4,7 @@
 
 public class OutlineColor : Outline
 {
-
+    [Header("鎵╁睍Outline澧炲姞棰滆壊閫夋嫨")]
     [SerializeField][HideInInspector]
     QualityTextColType m_ColorType = QualityTextColType.None;
     public QualityTextColType colorType
diff --git a/Main/Component/UI/Core/OutlineEx.cs b/Main/Component/UI/Core/OutlineEx.cs
new file mode 100644
index 0000000..774d7bd
--- /dev/null
+++ b/Main/Component/UI/Core/OutlineEx.cs
@@ -0,0 +1,230 @@
+using UnityEngine;
+using UnityEngine.UI;
+using System.Collections.Generic;
+
+
+/// <summary>
+/// UGUI鎻忚竟
+/// </summary>
+public class OutlineEx : BaseMeshEffect
+{
+    [Header("鏂皊hader鎻忚竟")]
+    public Color OutlineColor = Color.white;
+
+    QualityTextColType m_ColorType = QualityTextColType.None;
+    public QualityTextColType colorType
+    {
+        get { return m_ColorType; }
+        set
+        {
+            if (m_ColorType != value)
+            {
+                m_ColorType = value;
+                OutlineColor = UIHelper.GetUIOutlineColor(value);
+                this._Refresh();
+            }
+        }
+    }
+
+
+    [Range(0, 15)]
+    public int OutlineWidth = 0;
+
+    private static List<UIVertex> m_VetexList = new List<UIVertex>();
+    // 鏉愯川姹狅細Key涓�"棰滆壊_瀹藉害"鏍煎紡鐨勫瓧绗︿覆锛孷alue涓哄搴旂殑鏉愯川; 鍑忓皯鍚堟壒闂锛屽張鑳戒繚鎸佷笉鍚岀殑鎻忚竟锛涘叡鐢ㄦ潗璐ㄤ細鍚屾椂鏀瑰彉鍙傛暟
+    private static Dictionary<string, Material> m_MaterialPool = new Dictionary<string, Material>();
+    private static Shader m_Shader;
+
+    protected override void Start()
+    {
+        base.Start();
+        if (m_Shader == null)
+        {
+            m_Shader = Shader.Find("TSF Shaders/UI/OutlineEx");
+        }
+        
+        // 浣跨敤鏉愯川姹犺幏鍙栨垨鍒涘缓鏉愯川
+        string key = GetMaterialKey(OutlineColor, OutlineWidth);
+        if (!m_MaterialPool.TryGetValue(key, out Material material))
+        {
+            material = new Material(m_Shader);
+            material.SetColor("_OutlineColor", this.OutlineColor);
+            material.SetInt("_OutlineWidth", this.OutlineWidth);
+            m_MaterialPool[key] = material;
+        }
+        base.graphic.material = material;
+
+        var v1 = base.graphic.canvas.additionalShaderChannels;
+        var v2 = AdditionalCanvasShaderChannels.TexCoord1;
+        if ((v1 & v2) != v2)
+        {
+            base.graphic.canvas.additionalShaderChannels |= v2;
+        }
+        v2 = AdditionalCanvasShaderChannels.TexCoord2;
+        if ((v1 & v2) != v2)
+        {
+            base.graphic.canvas.additionalShaderChannels |= v2;
+        }
+
+        this._Refresh();
+    }
+
+
+#if UNITY_EDITOR
+    protected override void OnValidate()
+    {
+        base.OnValidate();
+
+        if (base.graphic.material != null)
+        {
+            this._Refresh();
+        }
+    }
+#endif
+
+
+    private void _Refresh()
+    {
+        // 妫�鏌ュ綋鍓嶆潗璐ㄦ槸鍚︿笌鎵�闇�灞炴�у尮閰嶏紝濡傛灉涓嶅尮閰嶅垯浠庢睜涓幏鍙栨垨鍒涘缓鏂版潗璐�
+        string key = GetMaterialKey(OutlineColor, OutlineWidth);
+        Material material;
+        if (!m_MaterialPool.TryGetValue(key, out material))
+        {
+            // 濡傛灉姹犱腑娌℃湁瀵瑰簲鐨勬潗璐紝鍒涘缓鏂版潗璐�
+            var shader = Shader.Find("TSF Shaders/UI/OutlineEx");
+            material = new Material(shader);
+            m_MaterialPool[key] = material;
+        }
+
+        material.SetColor("_OutlineColor", this.OutlineColor);
+        material.SetInt("_OutlineWidth", this.OutlineWidth);
+        
+        // 鏇存柊鍥惧舰鏉愯川
+        base.graphic.material = material;
+        base.graphic.SetVerticesDirty();
+    }
+
+
+    public override void ModifyMesh(VertexHelper vh)
+    {
+        vh.GetUIVertexStream(m_VetexList);
+
+        this._ProcessVertices();
+
+        vh.Clear();
+        vh.AddUIVertexTriangleStream(m_VetexList);
+    }
+
+
+    private void _ProcessVertices()
+    {
+        for (int i = 0, count = m_VetexList.Count - 3; i <= count; i += 3)
+        {
+            var v1 = m_VetexList[i];
+            var v2 = m_VetexList[i + 1];
+            var v3 = m_VetexList[i + 2];
+            // 璁$畻鍘熼《鐐瑰潗鏍囦腑蹇冪偣
+            //
+            var minX = _Min(v1.position.x, v2.position.x, v3.position.x);
+            var minY = _Min(v1.position.y, v2.position.y, v3.position.y);
+            var maxX = _Max(v1.position.x, v2.position.x, v3.position.x);
+            var maxY = _Max(v1.position.y, v2.position.y, v3.position.y);
+            var posCenter = new Vector2(minX + maxX, minY + maxY) * 0.5f;
+            // 璁$畻鍘熷椤剁偣鍧愭爣鍜孶V鐨勬柟鍚�
+            //
+            Vector2 triX, triY, uvX, uvY;
+            Vector2 pos1 = v1.position;
+            Vector2 pos2 = v2.position;
+            Vector2 pos3 = v3.position;
+            if (Mathf.Abs(Vector2.Dot((pos2 - pos1).normalized, Vector2.right))
+                > Mathf.Abs(Vector2.Dot((pos3 - pos2).normalized, Vector2.right)))
+            {
+                triX = pos2 - pos1;
+                triY = pos3 - pos2;
+                uvX = v2.uv0 - v1.uv0;
+                uvY = v3.uv0 - v2.uv0;
+            }
+            else
+            {
+                triX = pos3 - pos2;
+                triY = pos2 - pos1;
+                uvX = v3.uv0 - v2.uv0;
+                uvY = v2.uv0 - v1.uv0;
+            }
+            // 璁$畻鍘熷UV妗�
+            //
+            var uvMin = _Min(v1.uv0, v2.uv0, v3.uv0);
+            var uvMax = _Max(v1.uv0, v2.uv0, v3.uv0);
+            var uvOrigin = new Vector4(uvMin.x, uvMin.y, uvMax.x, uvMax.y);
+            // 涓烘瘡涓《鐐硅缃柊鐨凱osition鍜孶V锛屽苟浼犲叆鍘熷UV妗�
+            //
+            v1 = _SetNewPosAndUV(v1, this.OutlineWidth, posCenter, triX, triY, uvX, uvY, uvOrigin);
+            v2 = _SetNewPosAndUV(v2, this.OutlineWidth, posCenter, triX, triY, uvX, uvY, uvOrigin);
+            v3 = _SetNewPosAndUV(v3, this.OutlineWidth, posCenter, triX, triY, uvX, uvY, uvOrigin);
+            // 搴旂敤璁剧疆鍚庣殑UIVertex
+            //
+            m_VetexList[i] = v1;
+            m_VetexList[i + 1] = v2;
+            m_VetexList[i + 2] = v3;
+        }
+    }
+
+
+    private static UIVertex _SetNewPosAndUV(UIVertex pVertex, int pOutLineWidth,
+        Vector2 pPosCenter,
+        Vector2 pTriangleX, Vector2 pTriangleY,
+        Vector2 pUVX, Vector2 pUVY,
+        Vector4 pUVOrigin)
+    {
+        // Position
+        var pos = pVertex.position;
+        var posXOffset = pos.x > pPosCenter.x ? pOutLineWidth : -pOutLineWidth;
+        var posYOffset = pos.y > pPosCenter.y ? pOutLineWidth : -pOutLineWidth;
+        pos.x += posXOffset;
+        pos.y += posYOffset;
+        pVertex.position = pos;
+        // UV
+        var uv = pVertex.uv0;
+        uv += new Vector4((pUVX / pTriangleX.magnitude * posXOffset * (Vector2.Dot(pTriangleX, Vector2.right) > 0 ? 1 : -1)).x, (pUVX / pTriangleX.magnitude * posXOffset * (Vector2.Dot(pTriangleX, Vector2.right) > 0 ? 1 : -1)).y, 0, 0);
+        uv += new Vector4((pUVY / pTriangleY.magnitude * posYOffset * (Vector2.Dot(pTriangleY, Vector2.up) > 0 ? 1 : -1)).x, (pUVY / pTriangleY.magnitude * posYOffset * (Vector2.Dot(pTriangleY, Vector2.up) > 0 ? 1 : -1)).y, 0, 0);
+        pVertex.uv0 = uv;
+        // 鍘熷UV妗�
+        pVertex.uv1 = new Vector2(pUVOrigin.x, pUVOrigin.y);
+        pVertex.uv2 = new Vector2(pUVOrigin.z, pUVOrigin.w);
+
+        return pVertex;
+    }
+
+
+    private static float _Min(float pA, float pB, float pC)
+    {
+        return Mathf.Min(Mathf.Min(pA, pB), pC);
+    }
+
+
+    private static float _Max(float pA, float pB, float pC)
+    {
+        return Mathf.Max(Mathf.Max(pA, pB), pC);
+    }
+
+
+    private static Vector2 _Min(Vector2 pA, Vector2 pB, Vector2 pC)
+    {
+        return new Vector2(_Min(pA.x, pB.x, pC.x), _Min(pA.y, pB.y, pC.y));
+    }
+
+
+    private static Vector2 _Max(Vector2 pA, Vector2 pB, Vector2 pC)
+    {
+        return new Vector2(_Max(pA.x, pB.x, pC.x), _Max(pA.y, pB.y, pC.y));
+    }
+
+
+    // 鐢熸垚鏉愯川姹犵殑閿�
+    private string GetMaterialKey(Color color, int width)
+    {
+        // 浣跨敤棰滆壊鐨凴GBA鍊煎拰瀹藉害鐢熸垚鍞竴閿�
+        return string.Format("{0}_{1}_{2}_{3}_{4}", 
+            color.r, color.g, color.b, color.a, width);
+    }
+}
\ No newline at end of file
diff --git a/Main/Component/UI/Core/OutlineEx.cs.meta b/Main/Component/UI/Core/OutlineEx.cs.meta
new file mode 100644
index 0000000..14a3297
--- /dev/null
+++ b/Main/Component/UI/Core/OutlineEx.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0952a679e87c6c743874501bacc08eb9
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/Configs/HeroConfig.cs b/Main/Config/Configs/HeroConfig.cs
index 88e542d..39e4fb0 100644
--- a/Main/Config/Configs/HeroConfig.cs
+++ b/Main/Config/Configs/HeroConfig.cs
@@ -1,6 +1,6 @@
 锘�//--------------------------------------------------------
 //    [Author]:           YYL
-//    [  Date ]:           Tuesday, July 15, 2025
+//    [  Date ]:           Wednesday, July 16, 2025
 //--------------------------------------------------------
 
 using System.Collections.Generic;
@@ -14,6 +14,7 @@
 {
 
     public int HeroID;
+	public string Name;
 	public int Country;
 	public int Quality;
 	public int Class;
@@ -25,6 +26,7 @@
 	public int HPInheritPer;
 	public string BatAttrDict;
 	public int[] FetterIDList;
+	public float UIScale;
 
     public override int LoadKey(string _key)
     {
@@ -38,19 +40,21 @@
         string[] tables = input.Split('\t');
         int.TryParse(tables[0],out HeroID); 
 
-			int.TryParse(tables[1],out Country); 
+			Name = tables[1];
 
-			int.TryParse(tables[2],out Quality); 
+			int.TryParse(tables[2],out Country); 
 
-			int.TryParse(tables[3],out Class); 
+			int.TryParse(tables[3],out Quality); 
 
-			if (tables[4].Contains("["))
+			int.TryParse(tables[4],out Class); 
+
+			if (tables[5].Contains("["))
 			{
-				SkinIDList = JsonMapper.ToObject<int[]>(tables[4]);
+				SkinIDList = JsonMapper.ToObject<int[]>(tables[5]);
 			}
 			else
 			{
-				string[] SkinIDListStringArray = tables[4].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				string[] SkinIDListStringArray = tables[5].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
 				SkinIDList = new int[SkinIDListStringArray.Length];
 				for (int i=0;i<SkinIDListStringArray.Length;i++)
 				{
@@ -58,31 +62,33 @@
 				}
 			}
 
-			int.TryParse(tables[5],out AtkSkillID); 
+			int.TryParse(tables[6],out AtkSkillID); 
 
-			int.TryParse(tables[6],out AngerSkillID); 
+			int.TryParse(tables[7],out AngerSkillID); 
 
-			int.TryParse(tables[7],out AtkInheritPer); 
+			int.TryParse(tables[8],out AtkInheritPer); 
 
-			int.TryParse(tables[8],out DefInheritPer); 
+			int.TryParse(tables[9],out DefInheritPer); 
 
-			int.TryParse(tables[9],out HPInheritPer); 
+			int.TryParse(tables[10],out HPInheritPer); 
 
-			BatAttrDict = tables[10];
+			BatAttrDict = tables[11];
 
-			if (tables[11].Contains("["))
+			if (tables[12].Contains("["))
 			{
-				FetterIDList = JsonMapper.ToObject<int[]>(tables[11]);
+				FetterIDList = JsonMapper.ToObject<int[]>(tables[12]);
 			}
 			else
 			{
-				string[] FetterIDListStringArray = tables[11].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				string[] FetterIDListStringArray = tables[12].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
 				FetterIDList = new int[FetterIDListStringArray.Length];
 				for (int i=0;i<FetterIDListStringArray.Length;i++)
 				{
 					 int.TryParse(FetterIDListStringArray[i],out FetterIDList[i]);
 				}
 			}
+
+			float.TryParse(tables[13],out UIScale); 
         }
         catch (Exception exception)
         {
diff --git a/Main/ResModule/UILoader.cs b/Main/ResModule/UILoader.cs
index 5a8d187..07a01d4 100644
--- a/Main/ResModule/UILoader.cs
+++ b/Main/ResModule/UILoader.cs
@@ -11,17 +11,17 @@
 {
     public static GameObject LoadWindow(string name)
     {
-        return ResManager.Instance.LoadAsset<GameObject>("UI", name);
+        return ResManager.Instance.LoadAsset<GameObject>(ResourcesPath.UI_WINDOW_SUFFIX, name);
     }
 
     public static GameObject LoadPrefab(string _name)
     {
-        return ResManager.Instance.LoadAsset<GameObject>("UIComp", _name);
+        return ResManager.Instance.LoadAsset<GameObject>(ResourcesPath.UI_PREFAB_SUFFIX, _name);
     }
 
     public static void UnLoadPrefab(string _assetName)
     {
-        ResManager.Instance.UnloadAsset("UIComp", _assetName);
+        ResManager.Instance.UnloadAsset(ResourcesPath.UI_PREFAB_SUFFIX, _assetName);
     }
 
     public static Sprite LoadSprite(string _iconKey)
@@ -37,7 +37,7 @@
 
     public static Sprite LoadSprite(string _folder, string _file)
     {
-        return ResManager.Instance.LoadAsset<Sprite>("Sprite/" + _folder, _file);
+        return ResManager.Instance.LoadAsset<Sprite>(StringUtility.Contact(ResourcesPath.UI_SPRITE_SUFFIX, "/", _folder) , _file);
     }
 
     public static void UnLoadSprite(string _iconKey)
@@ -45,18 +45,18 @@
         var iconConfig = IconConfig.Get(_iconKey);
         if (iconConfig != null)
         {
-            var bundleName = StringUtility.Contact("Sprite/", iconConfig.folder);
+            var bundleName = StringUtility.Contact(ResourcesPath.UI_SPRITE_SUFFIX, "/", iconConfig.folder);
             ResManager.Instance.UnloadAsset(bundleName, iconConfig.sprite);
         }
     }
 
     public static Font LoadFont(string _fontName)
     {
-    	return ResManager.Instance.LoadAsset<Font>("Font", _fontName);
+    	return ResManager.Instance.LoadAsset<Font>(ResourcesPath.UI_FONT_SUFFIX, _fontName);
     }
 
     public static void UnLoadFont(string _fontName)
     {
-        ResManager.Instance.UnloadAsset("Font", _fontName);
+        ResManager.Instance.UnloadAsset(ResourcesPath.UI_FONT_SUFFIX, _fontName);
     }
 }
diff --git a/Main/System/Battle/BattleHUDWin.cs b/Main/System/Battle/BattleHUDWin.cs
index 61bc946..3a32be2 100644
--- a/Main/System/Battle/BattleHUDWin.cs
+++ b/Main/System/Battle/BattleHUDWin.cs
@@ -43,7 +43,7 @@
         EventBroadcast.Instance.AddListener<BattleObject, List<int>>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
         EventBroadcast.Instance.AddListener<BattleObject, SkillConfig>(EventName.BATTLE_BUFF_MOUNTED, OnBuffMounted);
         EventBroadcast.Instance.AddListener<BattleObject, SkillConfig>(EventName.BATTLE_BUFF_DISAPEAR, OnBuffDisapear);
-        damagePrefabPool = GameObjectPoolManager.Instance.RequestPool(ResManager.Instance.LoadAsset<GameObject>("UIComp", "DamageContent"));
+        damagePrefabPool = GameObjectPoolManager.Instance.RequestPool(UILoader.LoadPrefab("DamageContent"));
         // buffIconPrefabPool = GameObjectPoolManager.Instance.RequestPool();
         // buffLabelPrefabPool = GameObjectPoolManager.Instance.RequestPool(ResManager.Instance.LoadAsset<GameObject>("UIComp", "BuffContent"));
     }
diff --git a/Main/System/Hero/HeroInfo.cs b/Main/System/Hero/HeroInfo.cs
index 156e4e8..f3bcba5 100644
--- a/Main/System/Hero/HeroInfo.cs
+++ b/Main/System/Hero/HeroInfo.cs
@@ -40,6 +40,15 @@
         }
     }
 
+    // 浼樺厛鍔熻兘鎻愰啋绫诲瀷锛�1瑙夐啋 2鍗囩骇 3绐佺牬 4鍗囨槦
+    // 浼樺厛椤哄簭锛�
+    public int funcState
+    {
+        get
+        {
+            return 0;
+        }
+    }
 
 
 
diff --git a/Main/System/Hero/HeroManager.cs b/Main/System/Hero/HeroManager.cs
index 3fce894..27d2368 100644
--- a/Main/System/Hero/HeroManager.cs
+++ b/Main/System/Hero/HeroManager.cs
@@ -13,6 +13,9 @@
     //姝﹀皢鍒楄〃鐣岄潰
     public List<string> heroSortList = new List<string>();
 
+    //姝﹀皢绾㈢偣
+    //MainRedDot.HeroCardRedpoint * 1000 + hero.itemHero.gridIndex;
+
     public Action<HeroInfo> onNewHeroEvent;
 
     public Action<HeroInfo> onHeroChangeEvent;
diff --git a/Main/System/Hero/UIHeroController.cs b/Main/System/Hero/UIHeroController.cs
index dde8706..241063a 100644
--- a/Main/System/Hero/UIHeroController.cs
+++ b/Main/System/Hero/UIHeroController.cs
@@ -6,11 +6,11 @@
 using UnityEngine.EventSystems;
 public class UIHeroController : MonoBehaviour
 {
-	public void Create(int _skinID, Action _onComplete = null)
+	public void Create(int _skinID, float scale = 1f, Action _onComplete = null)
 	{
 		skinID = _skinID;
 		onComplete = _onComplete;
-		GameObject battleGO = ResManager.Instance.LoadAsset<GameObject>("Hero/SpineRes", "Hero_001");
+		GameObject battleGO = UILoader.LoadPrefab("UIHero");
 		GameObject instanceGO = null;
 		if (!transform.gameObject.activeSelf)
 		{
@@ -21,6 +21,7 @@
 		var skinConfig = HeroSkinConfig.Get(skinID);
 		skeletonGraphic.skeletonDataAsset = ResManager.Instance.LoadAsset<SkeletonDataAsset>("Hero/SpineRes/", skinConfig.SpineRes + "_SkeletonData");
 		skeletonGraphic.Initialize(true);
+		this.transform.localScale = Vector3.one * scale;
 		spineAnimationState = skeletonGraphic.AnimationState;
 		PlayAnimation(MotionName.idle, true);
 
diff --git a/Main/System/HeroUI/HeroCardCell.cs b/Main/System/HeroUI/HeroCardCell.cs
index a43bcd6..489a768 100644
--- a/Main/System/HeroUI/HeroCardCell.cs
+++ b/Main/System/HeroUI/HeroCardCell.cs
@@ -1,11 +1,12 @@
-锘縰sing UnityEngine;
+using UnityEngine;
 using UnityEngine.UI;
-using UnityEngine.Events;
 using System.Collections.Generic;
 
 public class HeroCardCell : MonoBehaviour
 {
     [SerializeField] Button heroCardBtn;
+    [SerializeField] Image heroCardBG;
+    [SerializeField] Material glowMaterial; // 娴佸厜鏁堟灉鏉愯川
     [SerializeField] Text lvText;
     [SerializeField] Image countryImg;
     [SerializeField] Image jobImg;
@@ -26,12 +27,53 @@
             this.gameObject.SetActive(false);
             return;
         }
+        
         this.gameObject.SetActive(true);
-        lvText.text = hero.heroLevel.ToString();
+        heroCardBG.SetSprite("herocardbg" + hero.Quality);
+        if (glowMaterial != null)
+        {
+            heroCardBG.material = glowMaterial;
+        }
+        lvText.text = Language.Get("L1094") + hero.heroLevel.ToString();
         var heroConfig = hero.heroConfig;
-        countryImg.SetSprite("herocountry" + hero.heroCountry);
+        countryImg.SetSprite("herocountry" + heroConfig.Country);
         jobImg.SetSprite("herojob" + heroConfig.Class);
-        heroModel.Create(heroConfig.SkinIDList[hero.SkinIndex]);
+        heroModel.Create(heroConfig.SkinIDList[hero.SkinIndex], heroConfig.UIScale);
+        onStateImg.SetActive(hero.isInMainBattle);
+
+        redpoint.redpointId = MainRedDot.HeroCardRedpoint * 1000 + hero.itemHero.gridIndex;
+        var funcState = hero.funcState;
+        if (funcState > 0)
+        { 
+            trainStateImg.SetActive(true);
+            trainStateImg.SetSprite("herofuncstate" + hero.funcState);
+        }
+        else
+        {
+            trainStateImg.SetActive(false);
+        }
+        nameText.text = hero.breakLevel == 0 ? heroConfig.Name : Language.Get("herocardbreaklv" + heroConfig.Name + hero.breakLevel);
+        awakeImg.SetActive(hero.awakeLevel > 0);
+        awakeLVText.text = hero.awakeLevel.ToString();
+
+        for (int i = 0; i < starImgList.Count; i++)
+        {
+            if (hero.heroStar == 0 && i == 0)
+            {
+                // 鏃犳槦绾� 鐗规畩澶勭悊
+                starImgList[i].SetActive(true);
+                starImgList[i].SetSprite("herostar" + hero.heroStar);
+            }
+            else if ((hero.heroStar - 1) % starImgList.Count >= i)
+            {
+                starImgList[i].SetActive(true);
+                starImgList[i].SetSprite("herostar" +  (((hero.heroStar - 1)/starImgList.Count)+1)*starImgList.Count);
+            }
+            else
+            {
+                starImgList[i].SetActive(false);
+            }
+        }
     }
 }
 
diff --git a/Main/System/HeroUI/HeroCardLineCell.cs b/Main/System/HeroUI/HeroCardLineCell.cs
index 3b68921..7b19201 100644
--- a/Main/System/HeroUI/HeroCardLineCell.cs
+++ b/Main/System/HeroUI/HeroCardLineCell.cs
@@ -12,7 +12,7 @@
             if (i + index < HeroManager.Instance.heroSortList.Count)
             {
                 cardList[i].SetActive(true);
-                cardList[i].Display(index);
+                cardList[i].Display(index + i);
             }
             else
             {
diff --git a/Main/System/HeroUI/HeroListWin.cs b/Main/System/HeroUI/HeroListWin.cs
index bf6a6e9..8e797ce 100644
--- a/Main/System/HeroUI/HeroListWin.cs
+++ b/Main/System/HeroUI/HeroListWin.cs
@@ -63,8 +63,11 @@
     {
         heroListScroller.Refresh();
         for (int i = 0; i < HeroManager.Instance.heroSortList.Count; i++)
-        { 
-            heroListScroller.AddCell(ScrollerDataType.Header, i);
+        {
+            if (i % 4 == 0)
+            { 
+                heroListScroller.AddCell(ScrollerDataType.Header, i);
+            }
         }
         heroListScroller.Restart();
     }
diff --git a/Main/System/Redpoint/MainRedDot.cs b/Main/System/Redpoint/MainRedDot.cs
index 468ede6..1cfbc13 100644
--- a/Main/System/Redpoint/MainRedDot.cs
+++ b/Main/System/Redpoint/MainRedDot.cs
@@ -18,26 +18,25 @@
     public Redpoint redpointGuild = new Redpoint(MainGuildRedpoint);
 
 
-    public const int RedPoint_key = 11;
-    public const int FAIRY_REDPOINT_KEY1 = 107;
-    public const int RedPoint_UpFuncBase = 12;
+    //浠ヤ笅绾㈢偣瑙勫垯锛氬姛鑳藉熀纭�绾㈢偣3浣嶆暟锛屽瓙绾㈢偣鑷冲皯澶т簬1000锛�
+    //姣斿鍔熻兘A绾㈢偣100锛屽瓙绾㈢偣1001锛屼互姝ょ被鎺紝鎴栬��100*10000 +1绫绘帹锛岄伩鍏嶉噸澶嶇殑鍙兘鎬э紝濡�1010 灏卞彲鑳藉拰鍔熻兘B涓殑绾㈢偣閲嶅
+    //    鍔熻兘B绾㈢偣101锛屽瓙绾㈢偣1011锛屼互姝ょ被鎺紝鎴栬��101*10000 +1绫绘帹锛岄伩鍏嶉噸澶嶇殑鍙兘鎬�
 
-    private Redpoint rightTopRedpint = new Redpoint(RedPoint_UpFuncBase);
-    private Redpoint redPointStrePrentOne = new Redpoint(RedPoint_key);
+    //姝﹀皢鍗�
+    public const int HeroCardRedpoint = 200;
+    public Redpoint HeroCardRedpoint1 = new Redpoint(MainHerosRedpoint, HeroCardRedpoint);
 
-
-    //public Redpoint jadeDynastyRedpoint = new Redpoint(1, 117);
 
     #region 閭欢绾㈢偣
-    public const int RedPoint_MainMailKey = 24;
+    public const int RedPoint_MainMailKey = 240;
     public const int RedPoint_MailFuncKey = 2401;
     public Redpoint redpointMainMail = new Redpoint(RedPoint_MainMailKey);
     public Redpoint redpointMailFunc = new Redpoint(RedPoint_MainMailKey, RedPoint_MailFuncKey);
     #endregion
 
     #region 濂藉弸绾㈢偣
-    public const int RedPoint_FriendQuestKey = 26;
-    public const int RedPoint_FriendChatKey = 25; //濂藉弸
+    public const int RedPoint_FriendQuestKey = 260;
+    public const int RedPoint_FriendChatKey = 250; //濂藉弸
     public Redpoint redpointFriendQuest = new Redpoint(RedPoint_FriendQuestKey);
     public Redpoint redPointFriendChat = new Redpoint(RedPoint_FriendChatKey);
     #endregion
@@ -56,15 +55,12 @@
 
     #region 浠欑洘鍏敤绾㈢偣
     public const int FAIRY_REDPOINT_KEY2 = 10701;
-    public Redpoint fairyLaunch = new Redpoint(RedPoint_key, FAIRY_REDPOINT_KEY1);
-    public Redpoint fairyBaseFuncRedPoint = new Redpoint(FAIRY_REDPOINT_KEY1, FAIRY_REDPOINT_KEY2);
     #endregion
 
 
 
     #region 浠欑洘鍟嗗簵绾㈢偣
     public const int FAIRYStore_REDPOINT_KEY3 = 1070106;
-    public Redpoint fairyStoreRedPoint = new Redpoint(FAIRY_REDPOINT_KEY2, FAIRYStore_REDPOINT_KEY3);
     #endregion
 
 
diff --git a/Main/System/Tip/ScrollTip.cs b/Main/System/Tip/ScrollTip.cs
index dbccf6d..f4937a2 100644
--- a/Main/System/Tip/ScrollTip.cs
+++ b/Main/System/Tip/ScrollTip.cs
@@ -59,7 +59,7 @@
             ScrollTipDetail tip = null;
             if (pool == null)
             {
-                var _prefab = ResManager.Instance.LoadAsset<GameObject>("UIComp", "Tip");// UILoader.LoadPrefab("Tip");
+                var _prefab = UILoader.LoadPrefab("Tip");
                 pool = GameObjectPoolManager.Instance.RequestPool(_prefab);
             }
             if (pool != null)
diff --git a/Main/Utility/UIUtility.cs b/Main/Utility/UIUtility.cs
index 27be3a0..f4fbbb2 100644
--- a/Main/Utility/UIUtility.cs
+++ b/Main/Utility/UIUtility.cs
@@ -11,7 +11,7 @@
 
     public static GameObject CreateWidget(string _sourceName, string _name)
     {
-        var prefab = ResManager.Instance.LoadAsset<GameObject>("UIComp", _sourceName);
+        var prefab = UILoader.LoadPrefab(_sourceName);
         if (prefab == null)
         {
             return null;

--
Gitblit v1.8.0