usingSystem.Collections; usingSystem.Collections.Generic; usingUnityEngine; usingUnityEngine.UI; publicclassMain : MonoBehaviour{publicstaticMainSelf; publicRectTransformCanvasRectTransform; publicCanvasScalerCanvasScaler; publicRectTransformTarget1; publicRectTransformTarget2; publicRectTransformTarget3; publicvoidAwake(){Self=this; varguideMask=FindObjectOfType<GuideMask>(); guideMask.Init()} publicvoidOnGUI(){if (GUILayout.Button("============= Close GuideMask =============")){GuideMask.Self.Close()} if (GUILayout.Button("============= Target 1 =============")){GuideMask.Self.Play(Target1)} if (GUILayout.Button("============= Target 2 =============")){GuideMask.Self.Play(Target2)} if (GUILayout.Button("============= Target 3 =============")){GuideMask.Self.Play(Target3)} } }usingSystem.Collections; usingSystem.Collections.Generic; usingUnityEngine; usingUnityEngine.UI; publicclassGuideMask : MaskableGraphic, ICanvasRaycastFilter{publicstaticGuideMaskSelf; privateRectTransform_target; privateVector2_targetMin; privateVector2_targetMax; privateRectTransform_targetArea; publicboolIsRaycastLocationValid(Vector2sp, CameraeventCamera){return !RectTransformUtility.RectangleContainsScreenPoint(_targetArea, sp, eventCamera)} publicvoidClose(){gameObject.SetActive(false)} publicvoidPlay(RectTransformtarget){gameObject.SetActive(true); varscreenPoint=RectTransformUtility.WorldToScreenPoint(Camera.main, target.position); Vector2localPoint; if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, screenPoint, Camera.main, outlocalPoint)){Close(); return} _targetArea.anchorMax=target.anchorMax; _targetArea.anchorMin=target.anchorMin; _targetArea.anchoredPosition=target.anchoredPosition; _targetArea.anchoredPosition3D=target.anchoredPosition3D; _targetArea.offsetMax=target.offsetMax; _targetArea.offsetMin=target.offsetMin; _targetArea.pivot=target.pivot; _targetArea.sizeDelta=target.sizeDelta; _targetArea.localPosition=localPoint; _targetArea.ForceUpdateRectTransforms(); _target=_targetArea; _target.ForceUpdateRectTransforms(); LateUpdate()} publicvoidInit(){_targetArea=gameObject.transform.Find("TargetArea") asRectTransform; Self=this; Close()} protectedoverridevoidOnPopulateMesh(VertexHelpertoFill){toFill.Clear(); varmaskRect=rectTransform.rect; varmaskRectLeftTop=newVector2(-maskRect.width / 2, maskRect.height / 2); varmaskRectLeftBottom=newVector2(-maskRect.width / 2, -maskRect.height / 2); varmaskRectRightTop=newVector2(maskRect.width / 2, maskRect.height / 2); varmaskRectRightBottom=newVector2(maskRect.width / 2, -maskRect.height / 2); vartargetRectLeftTop=newVector2(_targetMin.x, _targetMax.y); vartargetRectLeftBottom=_targetMin; vartargetRectRightTop=_targetMax; vartargetRectRightBottom=newVector2(_targetMax.x, _targetMin.y); toFill.AddVert(maskRectLeftBottom, color, Vector2.zero); toFill.AddVert(targetRectLeftBottom, color, Vector2.zero); toFill.AddVert(targetRectRightBottom, color, Vector2.zero); toFill.AddVert(maskRectRightBottom, color, Vector2.zero); toFill.AddVert(targetRectRightTop, color, Vector2.zero); toFill.AddVert(maskRectRightTop, color, Vector2.zero); toFill.AddVert(targetRectLeftTop, color, Vector2.zero); toFill.AddVert(maskRectLeftTop, color, Vector2.zero); toFill.AddTriangle(0, 1, 2); toFill.AddTriangle(2, 3, 0); toFill.AddTriangle(3, 2, 4); toFill.AddTriangle(4, 5, 3); toFill.AddTriangle(6, 7, 5); toFill.AddTriangle(5, 4, 6); toFill.AddTriangle(7, 6, 1); toFill.AddTriangle(1, 0, 7)} voidLateUpdate(){RefreshView()} privatevoidRefreshView(){Vector2newMin; Vector2newMax; if (_target!=null&&_target.gameObject.activeSelf){varbounds=RectTransformUtility.CalculateRelativeRectTransformBounds(transform, _target); newMin=bounds.min; newMax=bounds.max} else{newMin=Vector2.zero; newMax=Vector2.zero} if (_targetMin!=newMin||_targetMax!=newMax){_targetMin=newMin; _targetMax=newMax; SetAllDirty()} } }Github地址:https://github.com/asyncrun/GuideMask
UI背景图随机网上下载,侵权告知马上删除 下载地址
