在Unity中的UI上注册Touch

时间:2015-10-07 16:01:01

标签: c# unity3d touch unity3d-gui

如果我碰巧触摸了我的UI,我需要忽略一些功能。但是,我正在努力检测我是否真的在接触它。

我的UI使用Unity内部的本机UI。我的想法是简单地检查图层,如果我触摸了该图层上的任何内容,我就会阻止任何功能发生。

所以我写了这个来测试它:

    void Update () {
    if (Input.touchCount > 0 && Input.GetTouch (0).phase == TouchPhase.Began) 
    {
        Ray ray = Camera.main.ScreenPointToRay( Input.GetTouch(0).position );
        RaycastHit hit;

        if ( Physics.Raycast(ray, out hit,  Mathf.Infinity, mask))
        {
            Debug.Log("hit ui");
        }
    }
}

然而,当我按下我的UI上的按钮(它由Canvas,Panel和单个按钮组成进行测试)时,没有任何反应。但是,如果我在场景中放置一个立方体并将其分配给UI图层,则会显示调试日志。

为什么?

2 个答案:

答案 0 :(得分:1)

我猜这里的关键是:EventSystems.EventSystem.current.IsPointerOverGameObject()

无论您是否悬停UI,都应该返回true。尝试像这样实现它:

using UnityEngine.EventSystems;
...
if (Input.touchCount > 0 && Input.GetTouch (0).phase == TouchPhase.Began) 
{
    if(EventSystems.EventSystem.current.IsPointerOverGameObject()) {
          Debug.Log("UI hit!");
    }
}

答案 1 :(得分:1)

对于2d元素,您需要使用Physics.Raycast2d而不是Physics.Raycast并确保您的UI元素具有Collider2D

RaycastHit2D hit = Physics2D.Raycast(worldPoint,Vector2.zero);

        //If something was hit, the RaycastHit2D.collider will not be null.
        if ( hit.collider != null )
        {
            Debug.Log( hit.collider.name );
        }