我的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图层,则会显示调试日志。
为什么?
答案 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 );
}