所以,我正在尝试在Unity中的文本元素上添加OnclickEvent。 (UnityEngine.UI.Text)但Text对象没有onclick事件处理程序。我很确定这是可能的,或者Unity应该……
您可以使用。创建自己的单击处理程序 IPointerClickHandler 界面和 UnityEvent :
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游戏对象的点击检测,请确保 PhysicsRaycaster 附在 Camera 。
EventSystem
PhysicsRaycaster
Camera
或者你可以使用 EventTrigger 零件。
EventTrigger
两者基本上会或多或少地做同样的事情:
第一个的巨大优势是你可以轻松地增强它,例如通过改变按钮颜色的视觉反馈:
[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 }