/// <summary> /// 创建圆形点击区域 /// </summary> /// <param name="target">目标位置</param> /// <param name="offeset">大小偏移量</param> /// <param name="CallBack">点击的回调</param> public void CreateCircleMask(GameObject target, float offset) { if (target != null && ev != null) { RectTransform rec = target.GetComponent <RectTransform>(); CreateCircleMask(GetTargetCenter(rec), GetTargetRad(rec) + offset); ev.SetTargetImage(target); } }
/// <summary> /// 聚焦到引导目标 /// TODO 这个地方需要增加对场景3D物体的特定点击回调操作 /// </summary> /// <param name="operateImage">目标点击区域Button Image</param> /// <param name="callBack"></param> public void ChangeTarget(Image operateImage, Action callBack = null) { _ev.SetTargetImage(null); if (operateImage == null) { _parentBG.enabled = false; _hand.enabled = false; _isFocusing = false; _currentRadius = 0; _radius = 0f; ResetGuide(); return; } else { _parentBG.enabled = true; } _isFocusing = true; _target = operateImage; UIMaskManager.Instance.SetMaskEnable(UITransparentEnum.NoPenetratingMiddle); InputControlManager.Instance.IsEnable = false; //获取高亮区域的四个顶点的世界坐标 _target.rectTransform.GetWorldCorners(_corners); _guideDataModel.GuideDoneEvent = callBack; //如果目标位置是一个UI Button //任何按钮点击应该都是进行完成并关闭当前引导或加载下一步引导 _targetBtn = operateImage.GetComponent <Button>(); if (_targetBtn != null) { _targetBtn.onClick.AddListener(OnClickTargetButtonGuideDone); } //计算高亮显示区域的圆心 float x = _corners[0].x + ((_corners[3].x - _corners[0].x) / 2f); float y = _corners[0].y + ((_corners[1].y - _corners[0].y) / 2f); Vector3 centerWorld = new Vector3(x, y, 0); Vector2 center = LitTool.ScreenToCanvasPos(_rootCanv, centerWorld, _uiCam); //设置遮罩材料中的变量 Vector4 centerMat = new Vector4(center.x, center.y, 0, 0); Vector4 widthHeight = new Vector4(_target.rectTransform.rect.width, _target.rectTransform.rect.height, 0, 0); _material.SetVector("_Center", centerMat); _material.SetVector("_WH", widthHeight); //计算当前高亮显示区域的半径 RectTransform canRectTransform = _rootCanv.transform as RectTransform; if (SType == LitShaderType.Circle) { //计算最终高亮显示区域的半径 _radius = Vector2.Distance(LitTool.ScreenToCanvasPos(_rootCanv, _corners[0], _uiCam), LitTool.ScreenToCanvasPos(_rootCanv, _corners[2], _uiCam)) / 2f; if (canRectTransform != null) { //获取画布区域的四个顶点 canRectTransform.GetWorldCorners(_corners); //将画布顶点距离高亮区域中心最远的距离作为当前高亮区域半径的初始值 foreach (Vector3 corner in _corners) { _currentRadius = Mathf.Max(Vector3.Distance(LitTool.ScreenToCanvasPos(_rootCanv, corner, _uiCam), center), _currentRadius); } } } else if (SType == LitShaderType.Rect) { //计算最终高亮显示区域的半径 _radius = 1f; _currentRadius = 10f; } _material.SetFloat("_Slider", _currentRadius); if (FrameworkConfig.Instance.UseHotFixMode) { LitFramework.HotFix.UIManager.Instance.MaskImage.transform.SetAsLastSibling(); } else { LitFramework.Mono.UIManager.Instance.MaskImage.transform.SetAsLastSibling(); } }