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的事件处理就变得简单而且条理了

原文地址:https://www.cnblogs.com/fws94/p/6673331.html