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

来源:互联网 发布:创维酷开下载软件 编辑:程序博客网 时间:2024/06/04 08:47

在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组件:


这边可以选择相应的层,非常的方便好用。
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的点击。我觉得是个很不错的方法。







0 0