using Skillx.Utils;using UnityEngine;using UnityEngine.UI;namespace NoviceTutorial{///

/// 实现镂空效果的Mask组件/// public class TutorialHollowOutMask : MaskableGraphic, ICanvasRaycastFilter{[SerializeField] private RectTransform highLightTarget;private Vector3 mTargetMin = Vector3.zero;private Vector3 mTargetMax = Vector3.zero;private bool mCanRefresh = true;private Transform mCacheTrans = null;/// /// 设置高亮区域的位置大小/// /// public void SetTarget(RectTransform target){if (highLightTarget == null){return;}highLightTarget.position = target.position;highLightTarget.sizeDelta = target.sizeDelta;mCanRefresh = true;RefreshView();}private void SetTarget(Vector3 tarMin, Vector3 tarMax){if (tarMin == mTargetMin && tarMax == mTargetMax)return;mTargetMin = tarMin;mTargetMax = tarMax;SetAllDirty();}private void RefreshView(){if (!mCanRefresh)return;mCanRefresh = false;if (null == highLightTarget){SetTarget(Vector3.zero, Vector3.zero);}else{Bounds bounds = RectTransformUtility.CalculateRelativeRectTransformBounds(mCacheTrans, highLightTarget);SetTarget(bounds.min, bounds.max);}}protected override void OnPopulateMesh(VertexHelper vh){if (mTargetMin == Vector3.zero && mTargetMax == Vector3.zero){base.OnPopulateMesh(vh);return;}vh.Clear();// 填充顶点UIVertex vert = UIVertex.simpleVert;vert.color = color;Vector2 selfPiovt = rectTransform.pivot;Rect selfRect = rectTransform.rect;float outerLx = -selfPiovt.x * selfRect.width;float outerBy = -selfPiovt.y * selfRect.height;float outerRx = (1 - selfPiovt.x) * selfRect.width;float outerTy = (1 - selfPiovt.y) * selfRect.height;// 0 - Outer:LTvert.position = new Vector3(outerLx, outerTy);vh.AddVert(vert);// 1 - Outer:RTvert.position = new Vector3(outerRx, outerTy);vh.AddVert(vert);// 2 - Outer:RBvert.position = new Vector3(outerRx, outerBy);vh.AddVert(vert);// 3 - Outer:LBvert.position = new Vector3(outerLx, outerBy);vh.AddVert(vert);// 4 - Inner:LTvert.position = new Vector3(mTargetMin.x, mTargetMax.y);vh.AddVert(vert);// 5 - Inner:RTvert.position = new Vector3(mTargetMax.x, mTargetMax.y);vh.AddVert(vert);// 6 - Inner:RBvert.position = new Vector3(mTargetMax.x, mTargetMin.y);vh.AddVert(vert);// 7 - Inner:LBvert.position = new Vector3(mTargetMin.x, mTargetMin.y);vh.AddVert(vert);// 设定三角形vh.AddTriangle(4, 0, 1);vh.AddTriangle(4, 1, 5);vh.AddTriangle(5, 1, 2);vh.AddTriangle(5, 2, 6);vh.AddTriangle(6, 2, 3);vh.AddTriangle(6, 3, 7);vh.AddTriangle(7, 3, 0);vh.AddTriangle(7, 0, 4);}bool ICanvasRaycastFilter.IsRaycastLocationValid(Vector2 screenPos, Camera eventCamera){if (highLightTarget == null)return true;// 将目标对象范围内的事件镂空(使事件可以穿透)var isClickHighLightArea = RectTransformUtility.RectangleContainsScreenPoint(highLightTarget, screenPos, eventCamera);//点击到高亮区域时,射线可以穿透if (!isClickHighLightArea){var uiTutorialRoot = GoHelper.FindGameObject(transform.parent.gameObject, "TutorialUIRoot");var uiTutorial = uiTutorialRoot.GetComponentInChildren();if (uiTutorial != null){uiTutorial.Next();}}return !isClickHighLightArea;}protected override void Awake(){base.Awake();mCacheTrans = GetComponent();}void Update(){mCanRefresh = true;RefreshView();}}

Unity 镂空遮罩组件 TutorialHollowOutMask 实现与优化

原文地址: https://www.cveoy.top/t/topic/qeTh 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录