EventSystem.current.IsPointerOverGameObject()
检查是否在任何UI元素上单击了鼠标。如何检查鼠标是否单击了具有特定名称或标签的UI元素?
下面的脚本使游戏对象在Input.GetMouseButtonUp(0)
上移动。当我单击诸如“Text”之类的UI元素时,不会触发移动功能,导致GameObject不移动。非常好。这里的问题是我不能考虑哪些UI元素。例如,我想要的是:如果用户点击带有“不阻止移动脚本”标签的UI元素,则移动开始。但是,如果用户点击带有“块移动脚本”标签的UI元素,则不会调用该移动。
看,我的屏幕上充满了“隐形”的UI元素(颜色A = 0)。它们是隐形的,因此我可以在需要时激活和停用它们。问题:当我触摸或点击屏幕时,我的移动代码没有被调用,因为我点击了一个不可见的UI元素。
这就是为什么我想检查鼠标是否被特定UI元素(可见的元素)点击的原因。在这里,可见的UI元素称为button1
和button2
。
单击时按钮的作用:
using UnityEngine;
using UnityEngine.UI;
public class ButtonChecker: MonoBehaviour
{
public Button button1;
public Button button2;
void OnEnable()
{
//Register Button Events
button1.onClick.AddListener(() => buttonCallBack(button1));
button2.onClick.AddListener(() => buttonCallBack(button2));
}
private void buttonCallBack(Button buttonPressed)
{
if (buttonPressed == button1)
{
Application.LoadLevel ("Example Scene 1");w
}
if (buttonPressed == button2)
{
Application.LoadLevel ("Example Scene 2");
}
}
void OnDisable()
{
//Un-Register Button Events
button1.onClick.RemoveAllListeners();
button2.onClick.RemoveAllListeners();
}
}
移动代码(在检查是否单击UI元素时):
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class MovementCode : MonoBehaviour {
bool validInput = true;
void Update ()
{
validateInput();
if (Input.GetMouseButtonUp (0) && validInput)
{
transform.position += new Vector3 (0.08f, 0, 0);
}
if (Input.touchCount > 0 && Input.GetTouch (0).phase == TouchPhase.Ended && validInput)
{
transform.position += new Vector3 (0.08f, 0, 0);
}
}
void validateInput()
{
if (Input.GetMouseButtonDown(0))
{
if (EventSystem.current.IsPointerOverGameObject())
validInput = false;
else
validInput = true;
}
if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
{
if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
validInput = false;
else
validInput = true;
}
}
}
答案 0 :(得分:2)
EventSystem.current.currentSelectedGameObject.GetComponent<Type>().name.
它将返回UI点击的对象名称。
EventSystem.current.currentSelectedGameObject.GetComponent<Text>().name.
例如上面的代码将在点击时返回UI按钮的文本组件的名称。
答案 1 :(得分:1)
您有两个问题的解决方案。
1 。不要通过制作字母UI
来隐藏0
元素,而是在Button GameObject上使用gameObject.SetActive(false);
。这应该可以解决您的问题,因为事件不会对禁用的GameObject起作用。
2 。另一种解决方案是使用EventSystem.current.currentSelectedGameObject.CompareTag
检查UI
所属的标记,然后根据该标记执行操作。将其添加到您的validateInput()
功能中。
创建一个可见且不可见的tags
。将Buttons
更改为tags
。然后使用以下代码替换validateInput()
脚本中的MovementCode
函数:
void validateInput()
{
if (Input.GetMouseButtonDown(0))
{
if (EventSystem.current.IsPointerOverGameObject() && EventSystem.current.currentSelectedGameObject.CompareTag("invisible"))
validInput = true;
else if (EventSystem.current.IsPointerOverGameObject())
validInput = false;
else
validInput = true;
}
if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
{
if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId) && EventSystem.current.currentSelectedGameObject.CompareTag("invisible"))
validInput = true;
else if (EventSystem.current.IsPointerOverGameObject())
validInput = false;
else
validInput = true;
}
}
上面的代码会使不可见的Buttons
不阻止移动。