void Init(GameObject target) { TargetObject = target; TargetTrans = target.transform; var pos = TargetTrans.position; TargetObjOldPosX = pos.x; TargetObjOldPosY = pos.y; var scale = TargetTrans.localScale; TargetObjOldScaleX = scale.x; TargetObjOldScaleY = scale.y; Bounds = UGUIMath.CalculateAbsoluteBounds(TargetTrans.GetComponent <RectTransform>()); }
/// <summary> /// Target的位置发生变化时,更新引导的箭头 /// </summary> private void CheckTargetObjPosChange() { var new_pos = TargetTrans.position; var new_scale = TargetTrans.localScale; if (Mathf.Abs(new_pos.x - TargetObjOldPosX) < MIN_DIFF && Mathf.Abs(new_pos.y - TargetObjOldPosY) <= MIN_DIFF && Mathf.Abs(new_scale.x - TargetObjOldScaleX) < MIN_DIFF && Mathf.Abs(new_scale.y - TargetObjOldScaleY) <= MIN_DIFF) { return; } Bounds = UGUIMath.CalculateAbsoluteBounds(TargetTrans.GetComponent <RectTransform>()); TargetObjOldPosX = new_pos.x; TargetObjOldPosY = new_pos.y; TargetObjOldScaleX = new_scale.x; TargetObjOldScaleY = new_scale.y; if (CopyObj != null) { // 可能traget_trans的父亲节点有缩放 var rect_corner = new Vector3[4]; CopyTrans.GetComponent <RectTransform>().GetWorldCorners(rect_corner); float copy_rect_size_x = rect_corner[2].x - rect_corner[0].x; TargetTrans.GetComponent <RectTransform>().GetWorldCorners(rect_corner); float target_size_x = rect_corner[2].x - rect_corner[0].x; float scale = 1; if (copy_rect_size_x != 0) { scale = target_size_x / copy_rect_size_x; } Vector3 ori_scale = CopyTrans.localScale; CopyTrans.localScale = new Vector3(ori_scale.x * scale, ori_scale.y * scale, ori_scale.z * scale); } Wnd.ResetArrowTips(); }
public void ResetArrowTips() { if (m_GuideStep == null) { return; } ShowSkipButton(m_GuideStep.IsCanSkip); if (m_GuideStep.DisplayType == Guide.EDisplayType.Arrow || m_GuideStep.DisplayType == Guide.EDisplayType.Model)// 箭头引导类型/模型引导类型 { if (m_GuideArrow == null) { GameDebug.LogError("UIGuideWindow:ResetArrowTips m_GuideArrow is null"); return; } if (m_GuideObject != null) { // 计算目标物体的Bounds var guide_gameobject = m_GuideObject as GuideGameObject; m_GuideObject.Bounds = UGUIMath.CalculateAbsoluteBounds(guide_gameobject.TargetObject.GetComponent <RectTransform>()); var bounds = m_GuideObject.Bounds; // 设置debug min max点的位置 m_RectMin.SetActive(true); m_RectMax.SetActive(true); m_RectMin.transform.position = bounds.min; Vector3 local_pos = m_RectMin.transform.localPosition; m_RectMin.transform.localPosition = new Vector3(local_pos.x, local_pos.y, 0); m_RectMax.transform.position = bounds.max; local_pos = m_RectMax.transform.localPosition; m_RectMax.transform.localPosition = new Vector3(local_pos.x, local_pos.y, 0); // 显示箭头 m_GuideArrow.SetActive(true); m_GuideArrow.transform.localRotation = Quaternion.identity; // 获取箭头在世界坐标下的Bounds if (m_ArrowWorldWidth < 0) { Bounds arrow_bound = UGUIMath.CalculateAbsoluteBounds(m_GuideArrow.GetComponent <RectTransform>()); m_ArrowWorldWidth = arrow_bound.size.x; m_ArrowWorldHeight = arrow_bound.size.y; } float neighbour_width = 0; float neighbour_height = 0; float model_x_offset = m_GuideStep.Offset_X; // 模型预览组件在x方向的偏移 // 引导箭头的控件 if (m_GuideStep.DisplayType == Guide.EDisplayType.Arrow) { m_GuideDesc.gameObject.SetActive(true); m_GuideDescObject.gameObject.SetActive(true); // 设置引导文本的显示 m_GuideDesc.text = m_GuideStep.IconDesc; neighbour_width = m_GuideDesc.rectTransform.sizeDelta.x; neighbour_height = m_GuideDesc.preferredHeight; } else// 引导模型的控件 { m_PreviewCamera.SetActive(true); m_GuideModel.gameObject.SetActive(true); m_GuideModelDesc.text = m_GuideStep.IconDesc; neighbour_width = m_GuideModel.rectTransform.sizeDelta.x; neighbour_height = m_GuideModel.rectTransform.sizeDelta.y; } Vector3 center_local_pos = (m_RectMaxTrans.localPosition + m_RectMinTrans.localPosition) * 0.5f; Vector3 neighbour_pos = Vector3.zero; Vector3 arrow_rot = Vector3.zero; switch (m_GuideStep.IconDir) { case Guide.EGuideIconDir.Bottom: { m_GuideArrow.transform.position = new Vector3(bounds.min.x + bounds.size.x * 0.5f, bounds.max.y + m_ArrowWorldWidth * 0.5f, bounds.center.z); neighbour_pos = m_GuideArrow.transform.TransformPoint(0, ImageWidth(m_GuideArrow) * 0.5f + neighbour_height, 0f); model_x_offset += m_GuideModel.rectTransform.sizeDelta.x * 0.5f; if (center_local_pos.x > 0) // 如果指引中心点在右边,则模型显示在左边 { model_x_offset = -model_x_offset; } arrow_rot = new Vector3(0f, 0f, 90f); break; } case Guide.EGuideIconDir.Top: { m_GuideArrow.transform.position = new Vector3(bounds.min.x + bounds.size.x * 0.5f, bounds.min.y - m_ArrowWorldWidth * 0.5f, bounds.center.z); neighbour_pos = m_GuideArrow.transform.TransformPoint(0, -ImageWidth(m_GuideArrow) * 0.5f - neighbour_height, 0f); model_x_offset += m_GuideModel.rectTransform.sizeDelta.x * 0.5f; if (center_local_pos.x > 0) // 如果指引中心点在右边,则模型显示在左边 { model_x_offset = -model_x_offset; } arrow_rot = new Vector3(0f, 0f, -90f); break; } case Guide.EGuideIconDir.Left: { m_GuideArrow.transform.position = new Vector3(bounds.max.x + m_ArrowWorldWidth * 0.5f, bounds.min.y + bounds.size.y * 0.5f, bounds.center.z); neighbour_pos = m_GuideArrow.transform.TransformPoint(ImageWidth(m_GuideArrow) * 0.5f + neighbour_width * 0.5f, 0f, 0f); arrow_rot = Vector3.zero; break; } case Guide.EGuideIconDir.Right: { m_GuideArrow.transform.position = new Vector3(bounds.min.x - m_ArrowWorldWidth * 0.5f, bounds.min.y + bounds.size.y * 0.5f, bounds.center.z); neighbour_pos = m_GuideArrow.transform.TransformPoint(-ImageWidth(m_GuideArrow) * 0.5f - neighbour_width * 0.5f, 0f, 0f); arrow_rot = new Vector3(0f, 0f, 180f); break; } } if (m_GuideStep.DisplayType == Guide.EDisplayType.Arrow) { m_GuideDesc.transform.position = neighbour_pos; local_pos = m_GuideDesc.transform.localPosition; m_GuideDesc.transform.localPosition = new Vector3(local_pos.x, local_pos.y, 0); } else { m_GuideModel.transform.position = neighbour_pos; local_pos = m_GuideModel.transform.localPosition; m_GuideModel.transform.localPosition = new Vector3(local_pos.x + model_x_offset, m_GuideModel.rectTransform.sizeDelta.y * 0.5f, 0); } m_GuideArrow.transform.Rotate(arrow_rot, Space.Self); local_pos = m_GuideArrow.transform.localPosition; m_GuideArrow.transform.localPosition = new Vector3(local_pos.x, local_pos.y, 0f); } } else if (m_GuideStep.DisplayType == Guide.EDisplayType.Picture) { m_GuidePicture.SetActive(true); // 暂时屏蔽,引导图片改成RawImage了 //m_GuidePicture.GetComponent<Image>().sprite = LoadSprite(m_GuideStep.PicName); } else if (m_GuideStep.DisplayType == Guide.EDisplayType.Text)// 居中显示模型和文本 { m_PreviewCamera.SetActive(true); m_GuideModelDesc.text = m_GuideStep.IconDesc; m_GuideModel.transform.localPosition = new Vector3(m_GuideStep.Offset_X, m_GuideModel.rectTransform.sizeDelta.y * 0.5f, 0); m_GuideModel.gameObject.SetActive(true); } else if (m_GuideStep.DisplayType == Guide.EDisplayType.Region)// 高亮一块区域并居中显示模型和文本 { // 显示模型 m_PreviewCamera.SetActive(true); m_GuideModelDesc.text = m_GuideStep.IconDesc; m_GuideModel.transform.localPosition = new Vector3(m_GuideStep.Offset_X, m_GuideModel.rectTransform.sizeDelta.y * 0.5f, 0); m_GuideModel.gameObject.SetActive(true); if (m_GuideObject != null) { // 计算目标物体的Bounds var guide_gameobject = m_GuideObject as GuideGameObject; m_GuideObject.Bounds = UGUIMath.CalculateAbsoluteBounds(guide_gameobject.TargetObject.GetComponent <RectTransform>()); // 显示高亮区域 mHollowRegion.SetActive(true); var bounds = m_GuideObject.Bounds; // 设置 min max点的位置 mHollowRectMin.position = bounds.min; Vector3 local_pos = mHollowRectMin.localPosition; mHollowRectMin.localPosition = new Vector3(local_pos.x, local_pos.y, 0); mHollowRectMax.position = bounds.max; local_pos = mHollowRectMax.localPosition; mHollowRectMax.localPosition = new Vector3(local_pos.x, local_pos.y, 0); } } }