在项目过程中,经常遇到unity内响应鼠标按下,抬起等情况的交互监听,但是unity的button组件编写代码时,能直接添加侦听的事件是onClick事件,没有按下、抬起、移出、移入,需要自己进行重写,所以将自己的编写使用过程记录下来以供学习,不足之处请见谅,希望能给各位同行带来便利。
实现思路:
1、重新写类,继承Button,在类中实现相关的事件响应。
2、将类挂载到Cavas下创建的Button按钮上,挂载之前需先移除Button默认的组件button。
3、编写代码给按钮添加事件,这一步与Unity的Button按钮的 onClick.AddListener 用法一样。
注意事项:
1、因为这个类已经继承了Button,所有在Cavas下创建完button按钮时,切记将默认的Button组件删除,将上面这个类挂载到刚创建的button上,不然会提示重复,挂载不成功。
2、在脚本中声明按钮时,将变量类型由原来的Button类型改为MyButton,这是因为我们下一步在执行GetComponent时,< >中的类型将使用MyButton。然后就可以按照普通button的onClick添加侦听函数的写法,添加不同的操作监听了。
MyButton类的代码如下:
using UnityEngine.EventSystems;
using UnityEngine.UI;
using TMPro;
using UnityEngine.Events;
public class MyButton : Button,IPointerExitHandler,IPointerEnterHandler
{
public UnityEvent onButtonDown;
public UnityEvent onButtonUp;
public UnityEvent onButtonExit;
public UnityEvent onButtonEnter;
// 当按钮被按下时调用
public override void OnPointerDown(PointerEventData eventData)
{
base.OnPointerDown(eventData);
if (onButtonDown != null)
onButtonDown.Invoke();
//gameObject.GetComponentInChildren<TMP_Text>().text = "Pressed";
}
// 当按钮被抬起时调用
public override void OnPointerUp(PointerEventData eventData)
{
base.OnPointerUp(eventData);
if (onButtonUp != null)
onButtonUp.Invoke();
//gameObject.GetComponentInChildren<TMP_Text>().text = "Released";
}
// 当鼠标从按钮上离开时调用
public override void OnPointerExit(PointerEventData eventData)
{
base.OnPointerExit(eventData);
if (onButtonExit != null)
onButtonExit.Invoke();
//gameObject.GetComponentInChildren<TMP_Text>().text = "Exit";
}
// 当鼠标从外面进入到按钮上方时调用
public override void OnPointerEnter(PointerEventData eventData)
{
base.OnPointerEnter(eventData);
if (onButtonEnter != null)
onButtonEnter.Invoke();
//gameObject.GetComponentInChildren<TMP_Text>().text = "Enter";
}
}
Unity脚本中的使用方法的示例,如下截图中所示: