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