textObject Unity上的Onclick事件

时间:2019-03-13 12:08:47

标签: c# unity3d

因此,我正在尝试在Unity中的文本元素上添加OnclickEvent。 (UnityEngine.UI.Text) 但是Text对象没有onclick事件处理程序。 我很确定这是可能的,否则Unity应该是无法单击文本对象的第一语言。 我已经找到

  

您不能,至少不能直接。用OnGUI绘制的GUIText无法检测到输入,您必须使用GUI按钮。   但是您根本不应该使用OnGUI。新的Unity UI系统是在几个月前发布的,它非常优越。您应该更新到Unity 4.6.3,然后开始使用它。   Not Possible to add onclick event

但是我只是无法成像,因此无法单击文本。 出于布局原因,我真的不想使用按钮。

谢谢

1 个答案:

答案 0 :(得分:5)

您可以简单地使用IPointerClickHandler界面和UnityEvent创建自己的点击处理程序:

public class TextButton : MonoBehaviour, IPointerClickHandler
{
    // add callbacks in the inspector like for buttons
    public UnityEvent onClick;

    public void OnPointerClick(PointerEventData pointerEventData)
    {
        //Output to console the clicked GameObject's name and the following message. You can replace this with your own actions for when clicking the GameObject.
        Debug.Log(name + " Game Object Clicked!", this);

        // invoke your event
        onClick.Invoke();
    }
}
  

确保场景中存在EventSystem,以允许单击检测。对于非UI GameObjects的点击检测,请确保将PhysicsRaycaster附加到Camera

enter image description here


或者,您可以使用EventTrigger组件。

enter image description here


基本上两者都会做相同的事情:

enter image description here


第一个的巨大优势是您可以轻松地对其进行增强,例如通过视觉反馈(如更改按钮的颜色):

[RequireComponent(typeof(Text))]
public class TextButton : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler, IPointerEnterHandler, IPointerExitHandler
{
    #region Inspector

    public Color NormalColor = Color.black;
    public Color HoverColor = Color.black;
    public Color PressColor = Color.black;
    public Color DisabledColor = Color.gray;

    // add callbacks in the inspector like for buttons
    public UnityEvent onClick;

    #endregion Inspector

    private bool _isInteractive = true;
    public bool interactive
    {
        get
        { 
            return _isInteractive; 
        }
        set
        {
            _isInteractive = value;
            UpdateColor();
        }
    }

    private bool _isPressed;
    private bool _isHover;

    private Text _textComponent;
    private Text TextComponent
    {
        get
        {
            if(!_textComponent) _textComponent = GetComponent<Text>() ?? gameObject.AddComponent<Text>();

        }
    }

    private void Updatecolor()
    {
        if (!interactive)
        {
            TextComponent.color = DisabledColor;
            return;
        }

        if (isPressed)
        {
            TextComponent.color = PressColor;
            return;
        }

        if (isHover)
        {
            TextComponent.color = HoverColor;
            return;
        }

        TextComponent.color = NormalColor;
    }

    #region IPointer Callbacks

    public void OnPointerClick(PointerEventData pointerEventData)
    {
        //Output to console the clicked GameObject's name and the following message. You can replace this with your own actions for when clicking the GameObject.
        Debug.Log(name + " Game Object Clicked!", this);

        // invoke your event
        onClick.Invoke();
    }

    public void OnPointerDown(PointerEventData eventData)
    {
       if(!_isHover)return;
        _isPressed = true;
        Updatecolor();
    }

    public void OnPointerUp(PointerEventData eventData)
    {
      if(!_isHover)return;
        _isPressed = false;
        Updatecolor();
    }

    public void OnPointerEnter(PointerEventData eventData)
    {
        _isHover = true;
        Updatecolor();
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        _isHover = false;
        _isPressed = false;
        Updatecolor();
    }

    #endregion IPointer Callbacks
}

enter image description here