在使用Unity的UGUI时,发现自带的控件很少,而且功能比较简单,比如Button在属性面板中只有一个OnClick事件可以设置。但是我需要有更多功能的Button,比如能在属性面板中设置OnDown, OnUp, OnEnter, OnExit, OnLongClick这些事件等。我在网上看到有高手做了一些东西来增加相关UI组件的易用性,比如的EventTriggerListener类(网址:)。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(); Image img = btnRoot.AddComponent (); img.color = Color.white; img.fillCenter = true; img.raycastTarget = true; img.sprite = Common.findRes
("UISprite"); if (img.sprite != null) img.type = Image.Type.Sliced; btnRoot.AddComponent (); btnRoot.GetComponent ().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 实现了这两个类的大部分功能。
有兴趣的童鞋可以下载源码, 有问题欢迎指正, 我会慢慢的完善这个开源库。
项目开源地址:
本文为原创内容,转载请注明出处。