From 97de31e9a015cf139f5293a22e1575a43dfb6733 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期五, 24 四月 2026 14:16:02 +0800
Subject: [PATCH] WEBGL ANDROID适配

---
 Main/Component/UI/Effect/EllipseMask.cs |  102 +++++++++++++++++++++++++++++---------------------
 1 files changed, 59 insertions(+), 43 deletions(-)

diff --git a/Main/Component/UI/Effect/EllipseMask.cs b/Main/Component/UI/Effect/EllipseMask.cs
index de4b87d..4001b7c 100644
--- a/Main/Component/UI/Effect/EllipseMask.cs
+++ b/Main/Component/UI/Effect/EllipseMask.cs
@@ -1,30 +1,33 @@
-using UnityEngine;
+锘縰sing UnityEngine;
 using UnityEngine.UI;
 using System.Collections.Generic;
 using Cysharp.Threading.Tasks;
 
 /// <summary>
-/// 妞渾褰㈤伄缃╃粍浠�
-/// 鍩轰簬妯℃澘娴嬭瘯瀹炵幇妞渾褰㈤伄缃╂晥鏋�
+/// 濡烆厼娓捐ぐ銏や紕缂冣晝绮嶆禒?
+/// 閸╄桨绨Ο鈩冩緲濞村鐦�圭偟骞囧顓炴妇瑜般垽浼勭純鈺傛櫏閺�?
 /// </summary>
 [RequireComponent(typeof(RectTransform))]
 [AddComponentMenu("UI/Effects/Ellipse Mask")]
 [ExecuteInEditMode]
 public class EllipseMask : MonoBehaviour
 {
-    [Header("妞渾鍙傛暟")]
+
+
+    [Header("濡烆厼娓鹃崣鍌涙殶")]
     [SerializeField] private Vector2 m_EllipseCenter = new Vector2(0.5f, 0.5f);
     [SerializeField] private Vector2 m_EllipseRadius = new Vector2(0.5f, 0.5f);
-    [SerializeField] [Range(0, 0.5f)] private float m_Softness = 0f;    //鏆傛棤鏁堟灉
-    [SerializeField] private int m_StencilID = 1;   //澶氫釜閬僵鏃�
+    [SerializeField] [Range(0, 0.5f)] private float m_Softness = 0f;    //閺嗗倹妫ら弫鍫熺亯
+    [SerializeField] private int m_StencilID = 1;   //婢舵矮閲滈柆顔惧兊閺�?
     [SerializeField] private bool m_ShowMaskGraphic = false;
 
     private Material m_MaskMaterial;
     private Image m_MaskImage;
     private RectTransform m_RectTransform;
     private List<Graphic> m_MaskedChildren = new List<Graphic>();
-    // 缂撳瓨GetComponentsInChildren缁撴灉锛岄伩鍏嶆瘡娆nEnable鍒嗛厤鏁扮粍
+    // 缂傛挸鐡℅etComponentsInChildren缂佹挻鐏夐敍宀勪缉閸忓秵鐦″▎顡昻Enable閸掑棝鍘ら弫鎵矋
     private static List<Graphic> _graphicCacheList = new List<Graphic>();
+    private bool m_MaskShaderLoading = false;
 
     public Vector2 EllipseCenter
     {
@@ -98,10 +101,10 @@
         StencilID = order;
         m_RectTransform = GetComponent<RectTransform>();
         
-        // 鍒涘缓閬僵鍥惧儚
+        // 閸掓稑缂撻柆顔惧兊閸ユ儳鍎�
         CreateMaskImage();
         
-        // 鍒涘缓閬僵鏉愯川
+        // 閸掓稑缂撻柆顔惧兊閺夋劘宸�
         CreateMaskMaterial();
         
         UpdateMask();
@@ -112,7 +115,7 @@
         CreateMaskMaterial();
         UpdateMask();
         
-        // 涓烘墍鏈夊瓙瀵硅薄娣诲姞妯℃澘娴嬭瘯
+        // 娑撶儤澧嶉張澶婄摍鐎电钖勫ǎ璇插濡剝婢樺ù瀣槸
         UpdateChildrenStencil();
     }
 
@@ -123,8 +126,9 @@
             DestroyImmediate(m_MaskMaterial);
             m_MaskMaterial = null;
         }
+        m_MaskShaderLoading = false;
         
-        // 绉婚櫎瀛愬璞$殑妯℃澘娴嬭瘯
+        // 缁夊娅庣�涙劕顕挒锛勬畱濡剝婢樺ù瀣槸
         RemoveChildrenStencil();
     }
 
@@ -137,7 +141,7 @@
     }
 
     /// <summary>
-    /// 鍒涘缓閬僵鍥惧儚
+    /// 閸掓稑缂撻柆顔惧兊閸ユ儳鍎�
     /// </summary>
     private void CreateMaskImage()
     {
@@ -150,25 +154,36 @@
                 m_MaskImage.color = Color.white;
             }
         }
+        #if !UNITY_EDITOR
+        // 閸︹暞hader瀵倹顒為崝鐘烘祰鐎瑰本鍨氶崜宥堫啎娑撳搫鍙忛柅蹇旀閿涘矂妲诲銏ょ帛鐠侇槞hader濞撳弶鐓嬮崙铏规閼硅尙鐓╄ぐ?
+        if (m_MaskMaterial == null)
+        {
+            m_MaskImage.color = Color.clear;
+        }
+        #endif
     }
 
     /// <summary>
-    /// 鍒涘缓閬僵鏉愯川
+    /// 閸掓稑缂撻柆顔惧兊閺夋劘宸�
     /// </summary>
     private void CreateMaskMaterial()
     {
         #if !UNITY_EDITOR
-        if (m_MaskMaterial == null)
+        if (m_MaskMaterial == null && !m_MaskShaderLoading)
         {
+            m_MaskShaderLoading = true;
             ResManager.Instance.LoadAssetAsync<Shader>("Shader", "GUI_EllipseMask").ContinueWith(ellipseShader =>
             {
+                m_MaskShaderLoading = false;
+                if (this == null) { return; }
                 if (ellipseShader != null)
                 {
                     m_MaskMaterial = new Material(ellipseShader);
-                }
-                else
-                {
-                    Debug.LogError("EllipseMask shader not found!");
+                    // shader浣跨敤ColorMask 0锛屾仮澶峜olor涓嶄細鏄剧ず棰滆壊锛屼絾淇濊瘉Canvas鎻愪氦DrawCall鍐欏叆stencil
+                    if (m_MaskImage != null)
+                        m_MaskImage.color = Color.white;
+                    UpdateMask();
+                    UpdateChildrenStencil();
                 }
             }).Forget();
         }
@@ -181,7 +196,7 @@
     }
 
     /// <summary>
-    /// 鏇存柊閬僵
+    /// 閺囧瓨鏌婇柆顔惧兊
     /// </summary>
     private void UpdateMask()
     {
@@ -189,16 +204,16 @@
         {
             UpdateMaterialProperties();
             
-            // 璁剧疆鏉愯川鍒癐mage
+            // 鐠佸墽鐤嗛弶鎰窛閸掔檺mage
             m_MaskImage.material = m_MaskMaterial;
             
-            // 寮哄埗閲嶇粯
+            // 瀵搫鍩楅柌宥囩帛
             m_MaskImage.SetMaterialDirty();
         }
     }
 
     /// <summary>
-    /// 鏇存柊鏉愯川灞炴��
+    /// 閺囧瓨鏌婇弶鎰窛鐏炵偞鈧�?
     /// </summary>
     private void UpdateMaterialProperties()
     {
@@ -212,7 +227,7 @@
     }
 
     /// <summary>
-    /// 鏇存柊閬僵鍙鎬�
+    /// 閺囧瓨鏌婇柆顔惧兊閸欘垵顫嗛幀?
     /// </summary>
     private void UpdateMaskVisibility()
     {
@@ -223,24 +238,24 @@
     }
 
     /// <summary>
-    /// 涓哄瓙瀵硅薄娣诲姞妯℃澘娴嬭瘯
+    /// 娑撳搫鐡欑�电钖勫ǎ璇插濡剝婢樺ù瀣槸
     /// </summary>
     public void UpdateChildrenStencil()
     {
-        // 娓呴櫎涔嬪墠鐨勫垪琛�
+        // 濞撳懘娅庢稊瀣閻ㄥ嫬鍨悰?
         m_MaskedChildren.Clear();
         
-        // 浣跨敤闈欐�佺紦瀛樺垪琛ㄩ伩鍏嶆瘡娆″垎閰嶆暟缁�
+        // 娴h法鏁ら棃娆愨偓浣虹处鐎涙ê鍨悰銊╀缉閸忓秵鐦″▎鈥冲瀻闁板秵鏆熺紒?
         _graphicCacheList.Clear();
         GetComponentsInChildren(false, _graphicCacheList);
         for (int i = 0; i < _graphicCacheList.Count; i++)
         {
             var graphic = _graphicCacheList[i];
-            // 璺宠繃閬僵鏈韩
+            // 鐠哄疇绻冮柆鍍甸張闊�
             if (graphic.gameObject == this.gameObject)
                 continue;
-                
-            // 涓哄瓙瀵硅薄鍒涘缓閬僵鏉愯川
+            
+            // 娑撳搫鐡欑�电钖勯崚娑樼紦闁喚鍍甸弶鎰窛
             CreateChildMaskMaterial(graphic);
             m_MaskedChildren.Add(graphic);
         }
@@ -248,7 +263,7 @@
     }
 
     /// <summary>
-    /// 涓哄瓙瀵硅薄鍒涘缓閬僵鏉愯川
+    /// 娑撳搫鐡欑�电钖勯崚娑樼紦闁喚鍍甸弶鎰窛
     /// </summary>
     private void CreateChildMaskMaterial(Graphic graphic)
     {
@@ -256,15 +271,16 @@
         {
 
 #if !UNITY_EDITOR            
-            // Shader maskedShader = Shader.Find("GUI/EllipseMaskedContent");
             ResManager.Instance.LoadAssetAsync<Shader>("Shader", "GUI_EllipseMaskedContent").ContinueWith(maskedShader =>
             {
+                if (this == null || graphic == null) { return; }
                 if (maskedShader != null)
                 {
                     Material maskedMaterial = new Material(maskedShader);
                     maskedMaterial.SetInt("_Stencil", m_StencilID);
                     maskedMaterial.SetInt("_StencilComp", 3); // Equal
                     graphic.material = maskedMaterial;
+                    graphic.SetMaterialDirty();
                 }
             }).Forget();
 #else
@@ -280,13 +296,13 @@
         }
         else
         {
-            // 鏇存柊鐜版湁鏉愯川鐨勬ā鏉縄D
+            // 閺囧瓨鏌婇悳鐗堟箒閺夋劘宸濋惃鍕侀弶绺凞
             graphic.material.SetInt("_Stencil", m_StencilID);
         }
     }
 
     /// <summary>
-    /// 绉婚櫎瀛愬璞$殑妯℃澘娴嬭瘯
+    /// 缁夊娅庣�涙劕顕挒锛勬畱濡剝婢樺ù瀣槸
     /// </summary>
     private void RemoveChildrenStencil()
     {
@@ -294,7 +310,7 @@
         {
             if (graphic != null && graphic.material != null)
             {
-                // 閲嶇疆鏉愯川
+                // 闁插秶鐤嗛弶鎰窛
                 graphic.material = null;
             }
         }
@@ -302,11 +318,11 @@
     }
 
     /// <summary>
-    /// 璁剧疆妞渾鍙傛暟
+    /// 鐠佸墽鐤嗗顓炴妇閸欏倹鏆�
     /// </summary>
-    /// <param name="center">妞渾涓績锛堝綊涓�鍖栧潗鏍囷級</param>
-    /// <param name="radius">妞渾鍗婂緞锛堝綊涓�鍖栧潗鏍囷級</param>
-    /// <param name="softness">杈圭紭鏌斿寲绋嬪害</param>
+    /// <param name="center">濡烆厼娓炬稉顓炵妇閿涘牆缍婃稉鈧崠鏍ф綏閺嶅浄绱�</param>
+    /// <param name="radius">濡烆厼娓鹃崡濠傜窞閿涘牆缍婃稉鈧崠鏍ф綏閺嶅浄绱�</param>
+    /// <param name="softness">鏉堝湱绱弻鏂垮缁嬪瀹�</param>
     public void SetEllipseParameters(Vector2 center, Vector2 radius, float softness = 0.1f)
     {
         m_EllipseCenter = center;
@@ -316,11 +332,11 @@
     }
 
     /// <summary>
-    /// 璁剧疆鍦嗗舰鍙傛暟锛堢壒娈婃儏鍐电殑妞渾锛�
+    /// 鐠佸墽鐤嗛崷鍡楄埌閸欏倹鏆熼敍鍫㈠濞堝﹥鍎忛崘鐢垫畱濡烆厼娓鹃敍?
     /// </summary>
-    /// <param name="center">鍦嗗績锛堝綊涓�鍖栧潗鏍囷級</param>
-    /// <param name="radius">鍗婂緞锛堝綊涓�鍖栧潗鏍囷級</param>
-    /// <param name="softness">杈圭紭鏌斿寲绋嬪害</param>
+    /// <param name="center">閸﹀棗绺鹃敍鍫濈秺娑撯偓閸栨牕娼楅弽鍥风礆</param>
+    /// <param name="radius">閸楀﹤绶為敍鍫濈秺娑撯偓閸栨牕娼楅弽鍥风礆</param>
+    /// <param name="softness">鏉堝湱绱弻鏂垮缁嬪瀹�</param>
     public void SetCircleParameters(Vector2 center, float radius, float softness = 0.1f)
     {
         SetEllipseParameters(center, new Vector2(radius, radius), softness);
@@ -336,4 +352,4 @@
         }
     }
 #endif
-}
\ No newline at end of file
+}

--
Gitblit v1.8.0