如何在Unity中使用OnPointerEnter区分两个画布文本元素

时间:2018-07-22 13:46:15

标签: c# unity3d

我想区分两个文本元素。如果鼠标悬停在此元素之一上,则应更改文本和位置。我阅读了有关IPointerEnterHandler的文档,但是不明白如何在一个脚本中使用canvas元素来检测IPointerEnterHandler的事件。

非常感谢您的帮助。

我的脚本:

public class TextController : MonoBehaviour, IPointerEnterHandler
{   
    public Text text1;
    public Text text2;
    public void OnPointerEnter(PointerEventData eventData)
    {
        if (EnteringText1) // don t know exact if statement
        {
            text1.text = "i m entering text1";
            text1.transform.position = new Vector3(100f, 100f, 0f);
        }

        else if (EnteringText2) // don t know exact if statement
        {
            text2.text = "i m entering text2";
            text2.transform.position = new Vector3(100f, 100f, 0f);

        }
    }
} 

我在Unity中的场景

enter image description here

3 个答案:

答案 0 :(得分:1)

您可以使用EventData.pointerCurrentRaycast.gameObject来获取发生事件的GameObject的名称。由于您的Text游戏对象分别命名为text1text2,因此只需将它们与eventData.pointerCurrentRaycast.gameObject.name进行比较。

public Text text1;
public Text text2;

public void OnPointerEnter(PointerEventData eventData)
{
    GameObject obj = eventData.pointerCurrentRaycast.gameObject;

    if (obj.name == "text1")
    {
        text1.text = "i m entering text1";
        text1.transform.position = new Vector3(100f, 100f, 0f);
    }

    else if (obj.name == "text2")
    {
        text2.text = "i m entering text2";
        text2.transform.position = new Vector3(100f, 100f, 0f);

    }
}

如果您只想比较Text组件中的值,然后像上面一样获得GameObject之后,请使用GetComponent<Text>()从中检索Text,检查是否为null,然后使用Text.text

检索其文本值
public void OnPointerEnter(PointerEventData eventData)
{
    GameObject obj = eventData.pointerCurrentRaycast.gameObject;
    Text text = obj.GetComponent<Text>();

    if (text != null)
    {
        if (text.text == "EnteringText1")
        {
            text.text = "i m entering text1";
            text.transform.position = new Vector3(100f, 100f, 0f);
        }

        else if (text.text == "EnteringText2")
        {
            text.text = "i m entering text2";
            text.transform.position = new Vector3(100f, 100f, 0f);
        }
    }
}

注意:

上面的脚本必须附加到两个Text组件的父对象上,才能检测其子对象上的事件。在您的情况下,此父对象被命名为“画布”。

答案 1 :(得分:0)

与Unity的原则保持一致,最简单的方法是将脚本分为两部分,即使事件向上传播,您也可以在较低的级别对其进行拦截

答案 2 :(得分:0)

只需编写脚本并命名为EnterableText之类的脚本即可。将此脚本放在包含GameObject组件的Text上。脚本本身应类似于:

[RequiresComponent(typeof(Text))]
public sealed class EnterableText : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
    private static readonly Vector3 hoveredPosition = new Vector3(100f, 100f, 0f);

    public string defaultText;
    public string hoveredText;

    private Vector3 initialPosition;
    private Text textComponent;

    private void Awake()
    {
        initialPosition    = transform.position;
        textComponent      = GetComponent<Text>();
        textComponent.text = defaultText;
    }
    public void OnPointerEnter(PointerEventData eventData)
    {
        transform.position = new Vector3(100f, 100f, 0f);
        textComponent.text = hoveredText;
    }
    public void OnPointerExit(PointerEventData eventData)
    {
        transform.position = initialPosition;
        textComponent.text = defaultText;
    }
}

此外,您可以将悬停文本的位置放在变量中,以便能够在运行时轻松调整它。