检查鼠标是否单击了具有特定名称或标记的UI元素?

时间:2016-07-09 21:48:20

标签: c# unity3d

EventSystem.current.IsPointerOverGameObject()检查是否在任何UI元素上单击了鼠标。如何检查鼠标是否单击了具有特定名称或标签的UI元素?

下面的脚本使游戏对象在Input.GetMouseButtonUp(0)上移动。当我单击诸如“Text”之类的UI元素时,不会触发移动功能,导致GameObject不移动。非常好。这里的问题是我不能考虑哪些UI元素。例如,我想要的是:如果用户点击带有“不阻止移动脚本”标签的UI元素,则移动开始。但是,如果用户点击带有“块移动脚本”标签的UI元素,则不会调用该移动。

看,我的屏幕上充满了“隐形”的UI元素(颜色A = 0)。它们是隐形的,因此我可以在需要时激活和停用它们。问题:当我触摸或点击屏幕时,我的移动代码没有被调用,因为我点击了一个不可见的UI元素。 这就是为什么我想检查鼠标是否被特定UI元素(可见的元素)点击的原因。在这里,可见的UI元素称为button1button2

单击时按钮的作用:

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;
        }
    }
}

2 个答案:

答案 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 阻止移动。