From c5adf3e22a5cdfb185a4befc22ef0cd079a7eb33 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期二, 02 九月 2025 22:30:10 +0800
Subject: [PATCH] 117 【武将】武将系统 - 天赋显示,修复描边文字遇到mask问题

---
 Main/Component/UI/Core/OutlineEx.cs |  418 ++++++++++++++++++++++++++---------------------------------
 1 files changed, 182 insertions(+), 236 deletions(-)

diff --git a/Main/Component/UI/Core/OutlineEx.cs b/Main/Component/UI/Core/OutlineEx.cs
index a5c6940..62ef5c2 100644
--- a/Main/Component/UI/Core/OutlineEx.cs
+++ b/Main/Component/UI/Core/OutlineEx.cs
@@ -40,66 +40,86 @@
     public int OutlineWidth = 10;    
 
     private static List<UIVertex> m_VetexList = new List<UIVertex>();
-    // 鏉愯川姹狅細Key涓�"棰滆壊_瀹藉害"鏍煎紡鐨勫瓧绗︿覆锛孷alue涓哄搴旂殑鏉愯川; 鍑忓皯鍚堟壒闂锛屽張鑳戒繚鎸佷笉鍚岀殑鎻忚竟锛涘叡鐢ㄦ潗璐ㄤ細鍚屾椂鏀瑰彉鍙傛暟
-    private static Dictionary<string, Material> m_MaterialPool = new Dictionary<string, Material>();
 
-    static Shader m_tmpShader;
-    private static Shader m_Shader
+    protected override void Awake()
     {
-        get
+        base.Awake();
+
+        if (base.graphic)
         {
-            if (m_tmpShader == null)
+            if (base.graphic.material == null || base.graphic.material.shader.name != "TSF Shaders/UI/OutlineEx")
             {
-                m_tmpShader = Shader.Find("TSF Shaders/UI/OutlineEx");
+// #if UNITY_EDITOR
+
+                var texMaterial = ResManager.Instance.LoadAsset<Material>("Materials", "OutlineMat");
+                if (texMaterial != null)
+                {
+                    base.graphic.material = texMaterial;
+                }
+                else
+                {
+                    Debug.LogError("娌℃湁鎵惧埌鏉愯川OutlineMat.mat");
+                }
+// #else
+//                 var shader = Shader.Find("TSF Shaders/UI/OutlineEx");
+//                 base.graphic.material = new Material(shader);
+// #endif
             }
-            return m_tmpShader;
+
+            if (base.graphic.canvas)
+            {
+                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;
+                }
+                v2 = AdditionalCanvasShaderChannels.TexCoord3;
+                if ((v1 & v2) != v2)
+                {
+                    base.graphic.canvas.additionalShaderChannels |= v2;
+                }
+                v2 = AdditionalCanvasShaderChannels.Tangent;
+                if ((v1 & v2) != v2)
+                {
+                    base.graphic.canvas.additionalShaderChannels |= v2;
+                }
+                v2 = AdditionalCanvasShaderChannels.Normal;
+                if ((v1 & v2) != v2)
+                {
+                    base.graphic.canvas.additionalShaderChannels |= v2;
+                }
+            }
+            this._Refresh();
         }
     }
-
-    protected override void Start()
-    {
-        base.Start();
-
-        // 浣跨敤鏉愯川姹犺幏鍙栨垨鍒涘缓鏉愯川
-        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 OnEnable()
-    // {
-    //     base.OnEnable();
-    //     this._Refresh();
-    // }
-
     protected override void OnValidate()
     {
         base.OnValidate();
 
         if (base.graphic.material != null)
         {
+            if (base.graphic.material.shader.name != "TSF Shaders/UI/OutlineEx")
+            {
+                var texMaterial = ResManager.Instance.LoadAsset<Material>("Materials", "OutlineMat");
+                if (texMaterial != null)
+                {
+                    base.graphic.material = texMaterial;
+                }
+                else
+                {
+                    Debug.LogError("娌℃湁鎵惧埌鏉愯川OutlineMat.mat");
+                }
+                //var shader = Shader.Find("TSF Shaders/UI/OutlineEx");
+                //base.graphic.material = new Material(shader);
+            }
             this._Refresh();
         }
     }
@@ -108,218 +128,144 @@
 
     private void _Refresh()
     {
-        // 妫�鏌ュ綋鍓嶆潗璐ㄦ槸鍚︿笌鎵�闇�灞炴�у尮閰嶏紝濡傛灉涓嶅尮閰嶅垯浠庢睜涓幏鍙栨垨鍒涘缓鏂版潗璐�
-        string key = GetMaterialKey(OutlineColor, OutlineWidth);
-        Material material;
-        if (!m_MaterialPool.TryGetValue(key, out material))
+        /*if (base.graphic.material.GetInt("_OutlineWidth") != this.OutlineWidth || base.graphic.material.GetColor("_OutlineColor") != this.OutlineColor)
         {
-            // 濡傛灉姹犱腑娌℃湁瀵瑰簲鐨勬潗璐紝鍒涘缓鏂版潗璐�
-            var shader = Shader.Find("TSF Shaders/UI/OutlineEx");
-            material = new Material(shader);
-            m_MaterialPool[key] = material;
-        }
-
-        if (material == null)
-        {
-            // 闃茶寖鏉愯川琚垹鐨勬儏鍐碉紝鍒涘缓鏂版潗璐�
-            material = new Material(m_Shader);
-            m_MaterialPool[key] = material;
-        }
-
-        material.SetColor("_OutlineColor", this.OutlineColor);
-        material.SetInt("_OutlineWidth", this.OutlineWidth);
-        
-        // 鏇存柊鍥惧舰鏉愯川
-        base.graphic.material = material;
+            base.graphic.material.SetColor("_OutlineColor", this.OutlineColor);
+            base.graphic.material.SetInt("_OutlineWidth", this.OutlineWidth);
+        }*/
         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)
+public override void ModifyMesh(VertexHelper vh)
         {
-            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);
+            vh.GetUIVertexStream(m_VetexList);
 
-            // 涓烘瘡涓《鐐硅缃柊鐨凱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);
+            this._ProcessVertices();
 
-            // 鑾峰彇 RectMask2D 鐨勮竟鐣�
-            // 纭繚鎻忚竟椤剁偣鎵╁睍涓嶄細瓒呭嚭 RectMask2D 鐨勮竟鐣�
-
-            var mask = GetComponentInParent<RectMask2D>();
-            if (mask != null)
-            {
-                // 灏嗗眬閮ㄥ潗鏍囪浆鎹负灞忓箷鍧愭爣
-
-                Transform uiTransform = this.transform;
-                Vector3 worldPos1 = uiTransform.TransformPoint(v1.position);
-                Vector3 worldPos2 = uiTransform.TransformPoint(v2.position);
-                Vector3 worldPos3 = uiTransform.TransformPoint(v3.position);
-
-                Vector2 screenPos1 = CameraManager.uiCamera.WorldToScreenPoint(worldPos1);
-                Vector2 screenPos2 = CameraManager.uiCamera.WorldToScreenPoint(worldPos2);
-                Vector2 screenPos3 = CameraManager.uiCamera.WorldToScreenPoint(worldPos3);
-
-
-
-                // 纭繚鎻忚竟椤剁偣鎵╁睍涓嶄細瓒呭嚭 RectMask2D 鐨勮竟鐣�
-                var clipRect = mask.canvasRect;
-                //clipRect鏄腑蹇冪偣涓哄潗鏍�0锛�0锛岃浆鎴愬睆骞曠殑
-                var maskMinX = Screen.width / 2 + clipRect.xMin;
-                var maskMaxX = Screen.width / 2 + clipRect.xMax;
-                var maskMinY = Screen.height / 2 + clipRect.yMin;
-                var maskMaxY = Screen.height / 2 + clipRect.yMax;
-
-                // //screenPos1 瓒呭嚭clipRect鑼冨洿涓嶆樉绀�
-                bool isout = false;
-                if (screenPos3.x < maskMinX || screenPos3.x > maskMaxX || screenPos3.y < maskMinY || screenPos3.y > maskMaxY)
-                {
-                    isout = true;
-                }
-                else if (screenPos2.x < maskMinX || screenPos2.x > maskMaxX || screenPos2.y < maskMinY || screenPos2.y > maskMaxY)
-                {
-                    isout = true;
-                }
-                else if (screenPos1.x < maskMinX || screenPos1.x > maskMaxX || screenPos1.y < maskMinY || screenPos1.y > maskMaxY)
-                {
-                    isout = true;
-                }
-                if (isout)
-                {
-                    v1.position = new Vector3(10000, 10000, 10000);
-                    v2.position = new Vector3(10000, 10000, 10000);
-                    v3.position = new Vector3(10000, 10000, 10000);
-                }
-
-                // screenPos1.x = Mathf.Clamp(screenPos1.x, maskMinX, maskMaxX);
-                // screenPos1.y = Mathf.Clamp(screenPos1.y, maskMinY, maskMaxY);
-                // screenPos2.x = Mathf.Clamp(screenPos2.x, maskMinX, maskMaxX);
-                // screenPos2.y = Mathf.Clamp(screenPos2.y, maskMinY, maskMaxY);
-                // screenPos3.x = Mathf.Clamp(screenPos3.x, maskMinX, maskMaxX);
-                // screenPos3.y = Mathf.Clamp(screenPos3.y, maskMinY, maskMaxY);
-
-                // // 灏嗗睆骞曞潗鏍囪浆鎹负灞�閮ㄥ潗鏍�
-                // RectTransformUtility.ScreenPointToLocalPointInRectangle(uiTransform.GetComponent<RectTransform>(), screenPos1, CameraManager.uiCamera, out Vector2 localPos1);
-                // RectTransformUtility.ScreenPointToLocalPointInRectangle(uiTransform.GetComponent<RectTransform>(), screenPos2, CameraManager.uiCamera, out Vector2 localPos2);
-                // RectTransformUtility.ScreenPointToLocalPointInRectangle(uiTransform.GetComponent<RectTransform>(), screenPos3, CameraManager.uiCamera, out Vector2 localPos3);
-                // v1.position = localPos1;
-                // v2.position = localPos2;
-                // v3.position = localPos3;
-            }
-
-
-            // 搴旂敤璁剧疆鍚庣殑UIVertex
-            m_VetexList[i] = v1;
-            m_VetexList[i + 1] = v2;
-            m_VetexList[i + 2] = v3;
+            vh.Clear();
+            vh.AddUIVertexTriangleStream(m_VetexList);
         }
-    }
 
 
-    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;
+        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);
+                //OutlineColor 鍜� OutlineWidth 涔熶紶鍏ワ紝閬垮厤鍑虹幇涓嶅悓鐨勬潗璐ㄧ悆
+                var col_rg = new Vector2(OutlineColor.r, OutlineColor.g);       //鎻忚竟棰滆壊 鐢╱v3 鍜� tangent鐨� zw浼犻��
+                var col_ba = new Vector4(0,0,OutlineColor.b, OutlineColor.a);   
+                var normal = new Vector3(0, 0, OutlineWidth);                   //鎻忚竟鐨勫搴� 鐢╪ormal鐨剒浼犻��
+
+                // 涓烘瘡涓《鐐硅缃柊鐨凱osition鍜孶V锛屽苟浼犲叆鍘熷UV妗�
+                v1 = _SetNewPosAndUV(v1, this.OutlineWidth, posCenter, triX, triY, uvX, uvY, uvMin, uvMax);
+                v1.uv3 = col_rg;
+                v1.tangent = col_ba;
+                v1.normal = normal;
+                v2 = _SetNewPosAndUV(v2, this.OutlineWidth, posCenter, triX, triY, uvX, uvY, uvMin, uvMax);
+                v2.uv3 = col_rg;
+                v2.tangent = col_ba;
+                v2.normal = normal;
+                v3 = _SetNewPosAndUV(v3, this.OutlineWidth, posCenter, triX, triY, uvX, uvY, uvMin, uvMax);
+                v3.uv3 = col_rg;
+                v3.tangent = col_ba;
+                v3.normal = normal;
+
+
+                // 搴旂敤璁剧疆鍚庣殑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,
+            Vector2 pUVOriginMin, Vector2 pUVOriginMax)
+        {
+            // 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);
+        
+            pVertex.uv0 = uv;
 
-        return pVertex;
-    }
+            pVertex.uv1 = pUVOriginMin;     //uv1 uv2 鍙敤  tangent  normal 鍦ㄧ缉鏀炬儏鍐� 浼氭湁闂
+            pVertex.uv2 = pUVOriginMax;
+
+            return pVertex;
+        }
 
 
-    private static float _Min(float pA, float pB, float pC)
-    {
-        return Mathf.Min(Mathf.Min(pA, pB), pC);
-    }
+        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 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 _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 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

--
Gitblit v1.8.0