EventTrigger
我们知道Button可以添加点击监听,Slider可以滑动,假如我们想给Image添加点击监听,或者更多的监听事件呢,比如选中、鼠标移入、拖动。我们可以用到EventTrigger。EventTrigger里继承了很多接口,正好可以用来封装
public class EventTriggerTest : EventTrigger {
public override void OnPointerClick (PointerEventData eventData) {
Debug.Log ("OnPointerClick");
}
public override void OnPointerEnter (PointerEventData eventData) {
Debug.Log ("OnPointerEnter");
}
public override void OnPointerExit (PointerEventData eventData) {
Debug.Log ("OnPointerExit");
}
}
这里重写了EventTrigger里的3个方法,分别是点击、鼠标移入、鼠标移出,我们把它挂载在一个Image上,运行,可以看到,根据操作,确实可以执行对应的方法。
image.png
EventListener
要是有很多控件都需要绑定,那就需要在里面都挂上这个脚本,每个脚本都在对应的方法下重写内容,这样显得过于麻烦,我们可以就写一个脚本,继承自EventTrigger,通过委托的形式,触发EventTrigger下的事件是就执行委托的方法,具体的方法内容在各自的脚本里去实现就可以了。
public class UIEventListener : EventTrigger {
public delegate void VoidDelegate (GameObject go);
public delegate void BoolDelegate (GameObject go, bool isValue);
public delegate void FloatDelegate (GameObject go, float fValue);
public delegate void IntDelegate (GameObject go, int iIndex);
public delegate void StringDelegate (GameObject go, string strValue);
public VoidDelegate onSubmit;
public VoidDelegate onClick;
public BoolDelegate onHover;
public BoolDelegate onToggleChanged;
public FloatDelegate onSliderChanged;
public FloatDelegate onScrollbarChanged;
public IntDelegate onDrapDownChanged;
public StringDelegate onInputFieldChanged;
public override void OnSubmit (BaseEventData eventData) { //提交
if (onSubmit != null)
onSubmit (gameObject);
}
public override void OnPointerEnter (PointerEventData eventData) { //鼠标移入
if (onHover != null)
onHover (gameObject, true);
}
public override void OnPointerClick (PointerEventData eventData) { //点击
if (onClick != null)
onClick (gameObject);
if (onToggleChanged != null)
onToggleChanged (gameObject, gameObject.GetComponent<Toggle> ().isOn);
}
public override void OnPointerExit (PointerEventData eventData) { //鼠标移出
if (onHover != null)
onHover (gameObject, false);
}
public override void OnDrag (PointerEventData eventData) { //拖动
if (onSliderChanged != null)
onSliderChanged (gameObject, gameObject.GetComponent<Slider> ().value);
if (onScrollbarChanged != null)
onScrollbarChanged (gameObject, gameObject.GetComponent<Scrollbar> ().value);
}
public override void OnSelect (BaseEventData eventData) { //选中
if (onDrapDownChanged != null)
onDrapDownChanged (gameObject, gameObject.GetComponent<Dropdown> ().value);
}
public override void OnUpdateSelected (BaseEventData eventData) { //选中、每帧更新
if (onInputFieldChanged != null)
onInputFieldChanged (gameObject, gameObject.GetComponent<InputField> ().text);
}
public override void OnDeselect (BaseEventData eventData) { //不选中
if (onInputFieldChanged != null)
onInputFieldChanged (gameObject, gameObject.GetComponent<InputField> ().text);
}
public static UIEventListener Get (GameObject go) {
UIEventListener listener = go.GetComponent<UIEventListener> ();
if (listener == null) listener = go.AddComponent<UIEventListener> ();
return listener;
}
}
试一下把,我们还是实现上面的功能,现在不用手动去挂载专门的脚本,只要在Image的执行脚本里添加就可以了,运行后程序会自动添加上UIEventListener.cs。
public class Test1 : MonoBehaviour {
// Use this for initialization
void Start () {
UIEventListener.Get (gameObject).onClick = OnClick;
UIEventListener.Get (gameObject).onHover = OnHover;
}
// Update is called once per frame
void Update () { }
void OnClick (GameObject go) {
Debug.Log ("OnPointerClick");
}
void OnHover (GameObject go, bool _flag) {
if (_flag) {
Debug.Log ("OnPointerEnter");
} else {
Debug.Log ("OnPointerExit");
}
}
}
image.png
不足之处,多谢指正。
网友评论