美文网首页
UGUI Button扩展:双击按钮、长按按钮和透明按钮(无Dr

UGUI Button扩展:双击按钮、长按按钮和透明按钮(无Dr

作者: 雄关漫道从头越 | 来源:发表于2019-06-25 16:21 被阅读0次

Unity自定义UI组件(四)双击按钮、长按按钮

首先非常感谢上述博主分享的思路和部分源码,不过因为源码并没有完全给全(需要反编译源码),导致本地跑不起来,所以笔者在此做了补全,因为项目原因,长按按钮还需要单击功能,所以对此又做了扩展,另外博主建议通过代码绑定事件,如下:

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界面直接操作并序列化保存。

功能截图:


支持菜单添加
Inspector界面显示、序列化保存信息
长按按钮可选支持单击 双击按钮

为了方便各位使用,我将代码抽出来单独新建一个项目,稍后会贴出github的地址。
代码结构


runtime script
editor script

最后一个透明按钮,我们有的时候有这样的需求,可能需要点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即可。


github地址:https://github.com/eangulee/CustomButton.git

相关文章

网友评论

      本文标题:UGUI Button扩展:双击按钮、长按按钮和透明按钮(无Dr

      本文链接:https://www.haomeiwen.com/subject/rhtxcctx.html