From 8ef01bce47c58b7eb24383771b6f8fe6893d3666 Mon Sep 17 00:00:00 2001 From: StarBeats <977663818@qq.com> Date: Sat, 11 Oct 2025 14:51:32 +0800 Subject: [PATCH] sync --- Assets/Scripts/UIImageAlphaMask.cs | 105 +++++++++++------------------ Assets/Shaders/UI-AlphaMask.shader | 4 +- 2 files changed, 43 insertions(+), 66 deletions(-) diff --git a/Assets/Scripts/UIImageAlphaMask.cs b/Assets/Scripts/UIImageAlphaMask.cs index 6789ea0..7dae03f 100644 --- a/Assets/Scripts/UIImageAlphaMask.cs +++ b/Assets/Scripts/UIImageAlphaMask.cs @@ -1,104 +1,71 @@ using System.Linq; +using UnityEditor; using UnityEngine; using UnityEngine.UI; [ExecuteInEditMode] -[RequireComponent(typeof(Image))] public class UIImageAlphaMask : MonoBehaviour { - private Image m_MaskImage; - private Canvas m_Canvas; - private RectTransform m_RectTransform; - private Image[] m_TargetImageList; - private Material m_Material; + private Canvas canvas; + private RectTransform rectTransform; + private Image maskImage; - private Material Material - { - get - { - if (m_Material == null) - { - m_Material = new Material(Shader.Find("Hidden/UI/AlphaMask")); - } - return m_Material; - } - } + [SerializeField, HideInInspector] + private Image[] targetImageList; - private Image MaskImage - { - get - { - if (m_MaskImage == null) - { - m_MaskImage = GetComponent(); - } - return m_MaskImage; - } - } - - private RectTransform SelfRect - { - get - { - if (m_RectTransform == null) - { - m_RectTransform = GetComponent(); - } - return m_RectTransform; - } - } + [SerializeField] + public Texture2D MaskTex; private Canvas RootCanvas { get { - if (m_Canvas == null) + if (canvas == null) { var canvas = GetComponentInParent(); if (canvas != null) { if (canvas.rootCanvas != null) { - m_Canvas = canvas.rootCanvas; + this.canvas = canvas.rootCanvas; } else { - m_Canvas = canvas; + this.canvas = canvas; } } } - return m_Canvas; + return canvas; } } - - private void SetMaterial(Image[] imageList, Material material) + private void Awake() { - if (imageList == null) - { - return; - } + maskImage = GetComponent(); + rectTransform = GetComponent(); - for (int i = 0; i < imageList.Length; i++) + if (targetImageList == null || targetImageList.Length <= 0) { - var image = imageList[i]; - image.material = material; + targetImageList = GetComponentsInChildren(true); + targetImageList = targetImageList.Where(o => o.transform != this.transform).ToArray(); } } private void Update() { +#if UNITY_EDITOR if (!IsValid()) { return; } - if (m_TargetImageList == null || m_TargetImageList.Length <= 0) + if (targetImageList == null || targetImageList.Length <= 0) { - m_TargetImageList = GetComponentsInChildren(true); - m_TargetImageList = m_TargetImageList.Where(o => o.transform != this.transform).ToArray(); - SetMaterial(m_TargetImageList, Material); + targetImageList = GetComponentsInChildren(true); + targetImageList = targetImageList.Where(o => o.transform != this.transform).ToArray(); + return; } +#endif SetProperties(); } @@ -115,8 +82,15 @@ public class UIImageAlphaMask : MonoBehaviour return false; } - if (MaskImage.sprite == null) + if(MaskTex == null) { +#if UNITY_EDITOR + var path = AssetDatabase.GetAssetPath(maskImage.sprite); + if(!string.IsNullOrEmpty(path)) + { + MaskTex = AssetDatabase.LoadAssetAtPath(path); + } +#endif return false; } @@ -132,9 +106,12 @@ public class UIImageAlphaMask : MonoBehaviour } var matrix = CalculateMatrix(camera); - - Material.SetTexture("_MaskTex", MaskImage.sprite.texture); - Material.SetMatrix("_MaskMatrix", matrix); + for (int i = 0; i < targetImageList.Length; i++) + { + var imgMat = targetImageList[i].material; + imgMat.SetTexture("_Alpha_MaskTex", MaskTex); + imgMat.SetMatrix("_MaskMatrix", matrix); + } } private Camera GetCamera() @@ -144,7 +121,7 @@ public class UIImageAlphaMask : MonoBehaviour private Matrix4x4 CalculateMatrix(Camera camera) { - var rect = CalcurateViewportRect(camera); + var rect = CalculateViewportRect(camera); Matrix4x4 result = Matrix4x4.identity; @@ -161,11 +138,11 @@ public class UIImageAlphaMask : MonoBehaviour return result; } - private Rect CalcurateViewportRect(Camera camera) + private Rect CalculateViewportRect(Camera camera) { var corners = new Vector3[4]; - SelfRect.GetWorldCorners(corners); + rectTransform.GetWorldCorners(corners); var p1 = RectTransformUtility.WorldToScreenPoint(camera, corners[1]); var p3 = RectTransformUtility.WorldToScreenPoint(camera, corners[3]); diff --git a/Assets/Shaders/UI-AlphaMask.shader b/Assets/Shaders/UI-AlphaMask.shader index da3ff7e..4bb360d 100644 --- a/Assets/Shaders/UI-AlphaMask.shader +++ b/Assets/Shaders/UI-AlphaMask.shader @@ -97,12 +97,12 @@ } sampler2D _MainTex; - sampler2D _MaskTex; + sampler2D _Alpha_MaskTex; fixed4 frag(v2f IN) : SV_Target { half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color; - half4 mask = tex2D(_MaskTex, IN.maskUv); + half4 mask = tex2D(_Alpha_MaskTex, IN.maskUv); color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect); color.a *= mask.a;