UGUI下UI的点击和3D的点击与拖拽

在Unity5.0之后,NGUI的导入多少回带入一些错误,很多都是组件的问题,在unity4.6的时候,NGUI还是可以用的,不过现在ngui就显得越来越多余了,更多的人会去选择UGUI去搭建自己的UI。

 在新的UI系统下,因为UI和3D物体都是在一个相机下渲染的,这样就出现UI上的点击和3D物体的点击冲突问题。当UI和3D问题重叠是,如何去判别呢。这边集合自己搜集的资料以及自己的想法。整理如下:

新版UI下,去掉了UI组件的碰撞,所以用射线检测 显然是行不通的。看UGUI的API可以发现,EventSystem有一个方法可以实现是否点击到UI,
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class point : MonoBehaviour {

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {

            if (EventSystem.current.IsPointerOverGameObject())
            {
                print("在UI上");
            }
            else
            {
                print("不在UI上");
            }
        }
    }

}

这个方法测试过 是可以实现的。不过只是检测是否点击了UI,在很多情况下,这样的功能是不够用的,而且网上有的人测试这个方法还有bug,所以果断放弃这个方法。

后来后人想到一个方案  就是用 PhysicsRaycaster+EventSystem 实现射线点击。方法如下:
1、先给相机添加 PhysicsRaycaster组件:
UGUI下UI的点击和3D的点击与拖拽_第1张图片

这边可以选择相应的层,非常的方便好用。
2、在一个UI和3D的共存的场景中,添加相应的想要对3D物体操作的脚本到3D物体上。EventSystem 所有能在UI上添加的事件都可以用在3D物体,具体有哪些方法可以查看官方api。下面我以拖拽3D物体为例,代码比较简单,就不注释了,

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class ObjCheck : MonoBehaviour ,IBeginDragHandler,IDragHandler
{
    public void OnBeginDrag(PointerEventData eventData)
    {
        print(eventData.pointerDrag.name);
    }

    public void OnDrag(PointerEventData eventData)
    {
        Vector3 worldPos;
        Vector3 screenpos = Camera.main.WorldToScreenPoint(transform.position);

        worldPos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenpos.z));

        transform.position = worldPos;



    }

}

第二个方法就比较的实用,而且可以对3D物体实现很多的操作。而且对3D的操作也不影响UI的点击。我觉得是个很不错的方法。







你可能感兴趣的:(UGUI下UI的点击和3D的点击与拖拽)