我就废话不多说了,大家还是直接看代码吧~

using unityengine;
using unityengine.eventsystems; 
namespace mx.ui
{
    public class eventtriggerlistener :unityengine.eventsystems.eventtrigger 
    {
        public delegate void voiddelegate(gameobject go);
        public voiddelegate onclick;
        public voiddelegate ondown;
        public voiddelegate onenter;
        public voiddelegate onexit;
        public voiddelegate onup;
        public voiddelegate onselect;
        public voiddelegate onupdateselect; 
        /// <summary>
        /// 得到“监听器”组件
        /// </summary>
        /// <param name="go">监听的游戏对象</param>
        /// <returns>
        /// 监听器
        /// </returns>
        public static eventtriggerlistener get(gameobject go)
        {
            eventtriggerlistener lister = go.getcomponent<eventtriggerlistener>();
            if (lister==null)
            {
                lister = go.addcomponent<eventtriggerlistener>();                
            }
            return lister;
        }
 
        public override void onpointerclick(pointereventdata eventdata)
        {
            if (onclick != null)
            {
                onclick(gameobject);
            }
        }
 
        public override void onpointerdown(pointereventdata eventdata)
        {
            if (ondown != null)
            {
                ondown(gameobject);
            }
        }
 
        public override void onpointerenter(pointereventdata eventdata)
        {
            if (onenter != null)
            {
                onenter(gameobject);
            }
        }
 
        public override void onpointerexit(pointereventdata eventdata)
        {
            if (onexit != null)
            {
                onexit(gameobject);
            }
        }
 
        public override void onpointerup(pointereventdata eventdata)
        {
            if (onup != null)
            {
                onup(gameobject);
            }
        }
    
        public override void onselect(baseeventdata eventbasedata)
        {
            if (onselect != null)
            {
                onselect(gameobject);
            }
        }
 
        public override void onupdateselected(baseeventdata eventbasedata)
        {
            if (onupdateselect != null)
            {
                onupdateselect(gameobject);
            }
        }	
    }//class_end
}

补充:unity学习笔记——自定义eventtriggerlistener事件

通常我们在unity给按钮或者图片添加eventetrigger事件都需要手动添加组件,或者通过代码继承系统提供接口实现功能。这样使用起来比较麻烦,所以我参考网上资料总结写了一个自定义的eventtriggerlistener类,专门用于添加事件。

eventtriggerlistener类,不需要挂载到物体上,继承eventtrigger,作为common类直接使用

using unityengine;
using unityengine.eventsystems; 
public class eventtriggerlistener : eventtrigger
{
    public delegate void voiddelegate(gameobject obj);
    public voiddelegate onbtndown;
    public voiddelegate onbtnup;
    public voiddelegate onenter;
    public voiddelegate onexit;
    public voiddelegate onstay;
    public voiddelegate onclick;
    public voiddelegate ondoubleclick;
    private float t1, t2;
    private bool isenter = false;
    public void update()
    {
        if (isenter)
        {
            if (onstay != null)
            {
                onstay(gameobject);
            }
        }
    }
    public static eventtriggerlistener get(gameobject obj)
    {
        eventtriggerlistener eventtriggerlistener = obj.getcomponent<eventtriggerlistener>();
        if (eventtriggerlistener == null)
        {
            eventtriggerlistener = obj.addcomponent<eventtriggerlistener>();
        }
        return eventtriggerlistener;
    }
    /// <summary>
    /// 判断是否是第二次点击
    /// </summary>
    private bool istwo = true;
    private bool isover = true;
    public override void onpointerdown(pointereventdata eventdata)
    {
        if (onbtndown != null)
        {
            onbtndown(gameobject);
        }
        istwo = !istwo;
        if (!isover)
        {
            return;
        }
        isover = false;
        invoke("selectclick", 0.3f);
       
    }
    public void selectclick()
    {
        if (istwo)
        {
            if (ondoubleclick!=null)
            {
                ondoubleclick(gameobject);
            }
        }
        else
        {
            if (onclick!=null)
            {
                onclick(gameobject);
            }
        }
        istwo = true;
        isover = true;
    }
    public override void onpointerup(pointereventdata eventdata)
    {
        if (onbtnup != null)
        {
            onbtnup(gameobject);
        }
    }
    public override void onpointerenter(pointereventdata eventdata)
    {
        if (onenter != null)
        {
            onenter(gameobject);
        }
        isenter = true;
    }
    public override void onpointerexit(pointereventdata eventdata)
    {
        if (onexit != null)
        {
            onexit(gameobject);
        }
        isenter = false;
    }
}

以上是最常见的几种事件,全部事件可以查看eventtrigger类。

使用方法:新建脚本btnevent,继承monobehaviour挂载到场景物体中,在start()周期函数中给需要添加事件的物体添加事件(我这里直接挂载到需要注册事件的按钮上)其中gameobject是需要添加的物体gameobject

 
using unityengine; 
public class btnevent : monobehaviour { 
	void start () {
        eventtriggerlistener.get(transform.gameobject).onclick += (gameobj) => { debug.log("onclick"); };
        eventtriggerlistener.get(transform.gameobject).onbtndown += (gameobj) => { debug.log("onbtndown"); };
        eventtriggerlistener.get(transform.gameobject).onbtnup += (gameobj) => { debug.log("onbtnup"); };
        eventtriggerlistener.get(transform.gameobject).onenter += (gameobj) => { debug.log("onenter"); };
        eventtriggerlistener.get(transform.gameobject).onexit += (gameobj) => { debug.log("onexit"); };
        eventtriggerlistener.get(transform.gameobject).ondoubleclick += (gameobj) => { debug.log("ondoubleclick"); };
        eventtriggerlistener.get(transform.gameobject).onstay += (gameobj) => { debug.log("onstay"); };
    }	
}

运行结果:

ps:单击和双击事件的同时监听会有冲突,所以通过invoke()检测300ms内点击次数,每次按钮按下的时候检测。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持www.887551.com。如有错误或未考虑完全的地方,望不吝赐教。