首先非常感谢上述博主分享的思路和部分源码,不过因为源码并没有完全给全(需要反编译源码),导致本地跑不起来,所以笔者在此做了补全,因为项目原因,长按按钮还需要单击功能,所以对此又做了扩展,另外博主建议通过代码绑定事件,如下:
private void Start ()
{
GameObject.Find("Canvas/DoubleClickButton").GetComponent<DoubleClickButton>().onDoubleClick.AddListener( () =>
{
Debug.Log("双击");
});
GameObject.Find("Canvas/LongClickButton").GetComponent<LongClickButton> ().onLongClick.AddListener(( ) =>
{
Debug.Log("长击");
});
}
不过为了方便其他同事按照原UGUI的方式工作,笔者又反编译了UnityEidtor.UI.DLL和UnityEngine.UI.DLL的源码,unity已经开放了UI和CSharp的源码,github上有项目(嫌麻烦直接反编译了),支持新增功能在Inspector界面直接操作并序列化保存。
功能截图:
为了方便各位使用,我将代码抽出来单独新建一个项目,稍后会贴出github的地址。
代码结构
最后一个透明按钮,我们有的时候有这样的需求,可能需要点UI某块区域也能触发事件,通常能想到的是用一个Button组件,将Color的透明度设置为0,实际上unity还是进行渲染的,这个跟防止UI穿透使用一个全屏的透明背景是一样的,解决的办法就是使用重写的MaskableGraphic,网上很多分享出来的脚本:
using UnityEngine;
using System.Collections;
namespace UnityEngine.UI
{
public class Empty4Raycast : MaskableGraphic
{
protected Empty4Raycast()
{
useLegacyMeshGeneration = false;
}
protected override void OnPopulateMesh(VertexHelper toFill)
{
toFill.Clear();
}
}
}
说明一下,OnPopulateMesh是UGUI中需要渲染ui的网格的绘制函数,这里调用toFill.Clear()方法,意思就是没有任何需要渲染的网格,那么Unity底层就不会去渲染改组件,同时UGUI的事件系统还可以使用,达到了目的。
用法很简单,还是创建一个Button,将Image删除,挂上Empty4Raycast ,将Empty4Raycast 赋给Button即可。