Unity3D NGUI事件监听的综合管理
首先,将Event Listener挂在按钮上
Event Listener的源码很简单
就是利用C#的时间委托机制
注册了UI场景的事件而已
public class UIEventListener : MonoBehaviour { public delegate void VoidDelegate(GameObject go); public delegate void BoolDelegate(GameObject go, bool state); public delegate void FloatDelegate(GameObject go, float delta); public delegate void VectorDelegate(GameObject go, Vector2 delta); public delegate void StringDelegate(GameObject go, string text); public delegate void ObjectDelegate(GameObject go, GameObject draggedObject); public delegate void KeyCodeDelegate(GameObject go, KeyCode key); public object parameter; public VoidDelegate onSubmit; public VoidDelegate onClick; public VoidDelegate onDoubleClick; public BoolDelegate onHover; public BoolDelegate onPress; public BoolDelegate onSelect; public FloatDelegate onScroll; public VectorDelegate onDrag; public ObjectDelegate onDrop; public StringDelegate onInput; public KeyCodeDelegate onKey; void OnSubmit() { if (onSubmit != null) onSubmit(gameObject); } void OnClick() { if (onClick != null) onClick(gameObject); } void OnDoubleClick() { if (onDoubleClick != null) onDoubleClick(gameObject); } void OnHover(bool isOver) { if (onHover != null) onHover(gameObject, isOver); } void OnPress(bool isPressed) { if (onPress != null) onPress(gameObject, isPressed); } void OnSelect(bool selected) { if (onSelect != null) onSelect(gameObject, selected); } void OnScroll(float delta) { if (onScroll != null) onScroll(gameObject, delta); } void OnDrag(Vector2 delta) { if (onDrag != null) onDrag(gameObject, delta); } void OnDrop(GameObject go) { if (onDrop != null) onDrop(gameObject, go); } void OnInput(string text) { if (onInput != null) onInput(gameObject, text); } void OnKey(KeyCode key) { if (onKey != null) onKey(gameObject, key); } /// <summary> /// Get or add an event listener to the specified game object. /// </summary> static public UIEventListener Get(GameObject go) { UIEventListener listener = go.GetComponent<UIEventListener>(); if (listener == null) listener = go.AddComponent<UIEventListener>(); return listener; } }
那么,如何调用呢
使用这个脚本进行统一管理后
就不需要将脚本一个一个地拖入按钮
而是在任何脚本或类中都可以直接调用
void Start() { GameObject button = GameObject.Find("UI Root (2D)/Camera/Anchor/Panel/LoadUI/MainCommon/Button"); UIEventListener.Get(button).onClick = OnClick; } void OnClick(GameObject button) { Debug.Log(button.name); }
就是这样
这样一来,NGUI的事件处理就变得简单而且条理了