[Unity] UGUI功能扩展插件包

在使用Unity的UGUI时,发现自带的控件很少,而且功能比较简单,比如Button在属性面板中只有一个OnClick事件可以设置。但是我需要有更多功能的Button,比如能在属性面板中设置OnDown, OnUp, OnEnter, OnExit, OnLongClick这些事件等。我在网上看到有高手做了一些东西来增加相关UI组件的易用性,比如雨松Mono大神EventTriggerListener类(网址:http://www.xuanyusong.com/archives/3325)。EventTriggerListener类算是比较好用的封装了,但这需要写代码,有时候还是感觉很麻烦。

 

有麻烦就需要解决,经过这两天的学习,到处查了资料,后来又找到了ugui的开源代码(UGUI之前以为没有开源,造成很多困扰),然后就做了ButtonEx。

我们先来看看效果图:

可以直接在Hierarchy窗口中右键菜单 UI\ButtonEx 添加一个ButtonEx组件。

 

可以看到多了很多事件设置项。这样子用起来就方便了。

可以在C#中通过设置 FormerlySerializedAs 来让事件属性显示在 Inspector 面板上。

 

        [Serializable]
        public class ButtonClickedEvent : UnityEvent {}

        [FormerlySerializedAs("onClick")]
        [SerializeField]
        private ButtonClickedEvent m_OnClick = new ButtonClickedEvent();
        [FormerlySerializedAs("onLongClick")]
        [SerializeField]
        private ButtonClickedEvent m_OnLongClick = new ButtonClickedEvent();
        [FormerlySerializedAs("onDown")]
        [SerializeField]
        private ButtonClickedEvent m_OnDown = new ButtonClickedEvent();
        [FormerlySerializedAs("onUp")]
        [SerializeField]
        private ButtonClickedEvent m_OnUp = new ButtonClickedEvent();
        [FormerlySerializedAs("onEnter")]
        [SerializeField]
        private ButtonClickedEvent m_OnEnter = new ButtonClickedEvent();
        [FormerlySerializedAs("onExit")]
        [SerializeField]
        private ButtonClickedEvent m_OnExit = new ButtonClickedEvent();

 

通过设置 MenuItem 来修改Hierarchy面板的菜单。

        [MenuItem("GameObject/UI/ButtonEx")]
        static void CreateButtonEx(MenuCommand menuCmd) {
            // 创建游戏对象
            float w = 160f;
            float h = 30f;
            GameObject btnRoot = UICommon.CreateUIElementRoot("ButtonEx", w, h);

            // 创建Text对象
            UICommon.CreateUIText("Text", "Button", btnRoot);

            // 添加脚本
            btnRoot.AddComponent<CanvasRenderer> ();
            Image img = btnRoot.AddComponent<Image> ();
            img.color = Color.white;
            img.fillCenter = true;
            img.raycastTarget = true;
            img.sprite = Common.findRes<Sprite>("UISprite");
            if (img.sprite != null)
                img.type = Image.Type.Sliced;

            btnRoot.AddComponent<ButtonEx> ();
            btnRoot.GetComponent<Selectable>().image = img;

            // 放入到UI Canvas中
            UICommon.PlaceUIElementRoot(btnRoot, menuCmd);
        }

 

通过设置 AddComponentMenu 实现在主菜单中的 Component 菜单中增加菜单项。

    [AddComponentMenu("UI/ButtonEx", 50), RequireComponent(typeof(RectTransform))]
    public class ButtonEx : Selectable, IPointerClickHandler, ISubmitHandler, IPointerDownHandler, IPointerUpHandler, IPointerEnterHandler, IPointerExitHandler {

 

从UGUI的开源代码中可以看到很多东西的实现, 其中 MenuItem 的添加UI对象的功能, 用到了 MenuOptions, DefaultControls 这两个类里面的东西, 但是很郁闷的时, 这两个类里面很多都是私有方法, 我们自定义控件时不能很方便的直接使用, 于是我封装了 YxdUGUI 这个开源库, 其中的 UICommon.cs 实现了这两个类的大部分功能。

有兴趣的童鞋可以下载源码, 有问题欢迎指正, 我会慢慢的完善这个开源库。

 

项目开源地址:    https://github.com/yangyxd/YxdUGUI

 

本文为原创内容,转载请注明出处。

 

posted @ 2016-03-22 20:15  我爱我家喵喵  阅读(5177)  评论(0编辑  收藏  举报