unity中将3D场景中的3DUI界面转换为2DUI界面(方法二)

此方法是将世界坐标转换为屏幕坐标,并实现UI的缩放移动效果,具体情况具体分析。

应用于3D场景中有很多3DUI界面,功能如下所示。【效果>>>>从哪里来到哪里去<<<<】

  1. 点击3DUI界面转换为2DUI界面,并放大移动到屏幕中心显示
  2. 点击已点击过3DUI界面或其它3DUI界面,显示的2DUI界面缩小回原处并放大新点击的3DUI界面
  3. 给2DUI界面添加Button按钮,点击2DUI界面缩小返回到3DUI界面位置点

 

详细代码如下

    //加载数据UI界面
    private GameObject dataPanel;
    private Text dataName, value;
    GameObject dataUIParent;
    public void WorldToScrennPoint(GameObject _parent)
    {
        mask =  1 << 15;//实例化mask自定义的层级之上;

        dataUIParent = _parent;

        var _dataUI = Resources.Load("factory/DataUI");
        dataPanel = GameObject.Instantiate(_dataUI) as GameObject;
        dataPanel.transform.SetParent(dataUIParent.transform, false);

        dataName = dataPanel.transform.Find("lineBg/name").GetComponent();
        value = dataPanel.transform.Find("lineBg/Value").GetComponent();

        dataPanel.transform.FindChild("lineBg").GetComponent().onClick.AddListener(() =>
        {
            DataUIShrink();//缩小UI界面
        });
    }


    //用于检测数据UI界面信息
    public LayerMask mask = 1 << 15;//实例化mask自定义的层级之上;
    GameObject gameObj;
    Vector2 screenPos;
    Tweener scaleTweener;
    void Update()
    {
         if (Input.GetMouseButtonDown(0))
        {
            //创建射线;从摄像机发射一条经过鼠标当前位置的射线
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitInfo;

            if (Physics.Raycast(ray, out hitInfo, 500, mask.value))
            {
                if (dataPanel.transform.localScale == Vector3.zero)
                {
                    gameObj = hitInfo.collider.gameObject;
                    //赋值
                    dataName.text = hitInfo.transform.parent.parent.parent.name;
                    value.text = gameObj.GetComponent().text;

                    DataUIMagnify();//放大UI              
                }
                else
                {
                    DataUIShrink(); //缩小UI界面

                    gameObj = hitInfo.collider.gameObject;
                    //赋值
                    dataName.text = hitInfo.transform.parent.parent.parent.name;
                    value.text = gameObj.GetComponent().text;

                    scaleTweener.OnComplete(DataUIMagnify);//缩小后放大点击的另一个UI界面

                }
            }
        
            Debug.DrawLine(ray.origin, hitInfo.point, Color.red);
        }
    }

    //将点击的物体坐标转换为屏幕坐标-----------UI界面放大移动
    private void DataUIMagnify()
    {
        screenPos = Camera.main.WorldToScreenPoint(gameObj.transform.position);//世界坐标转屏幕坐标
        dataPanel.transform.position = screenPos;

        dataPanel.transform.DOScale(Vector3.one, 0.3f);
        dataPanel.transform.DOLocalMove(Vector3.zero, 0.3f);

    }
    //将点击的物体坐标转换为屏幕坐标-----------UI界面缩小移动
    private void DataUIShrink()
    {
        if (gameObj == null)
            return;
        screenPos = Camera.main.WorldToScreenPoint(gameObj.transform.position);//世界坐标转换为屏幕坐标

        dataPanel.transform.DOScale(Vector3.zero, 0.3f);
        scaleTweener = dataPanel.transform.DOMove(screenPos, 0.3f);
        Debug.LogError("缩小");
    }

 

你可能感兴趣的:(Unity开发,Unity,UGUI)