Exemple #1
0
        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>());
        }
Exemple #2
0
        /// <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();
        }
Exemple #3
0
        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);
                }
            }
        }