【Unity3d】介绍两个实用的UI按钮小工具
2017-03-17 14:55
281 查看
平面和游戏开发中会需要很多的按钮,UGUI的按钮使用UnityEvent的话只能响应点击事件,而且如果需要空白按钮设置Image的alpha值的话有时候会影响fade动画。这里介绍两个工具,一个用来做空白按钮或者按钮遮罩,不会占用额外的drawcall。另一个是继承EventTrigger的工具类,可是实现按钮响应按下,抬起,拖动等等事件。
然后只需要把这个脚本挂载到物体上,并添加Button控件就可以实现空白按钮的功能了。如果我们只是需要一个遮罩的话,直接挂在这个脚本,不添加Button控件就可以了。
定义一个静态的Get方法来获取我们的监听器:
实现onClick事件:
在另一个行为脚本中对我们需要的UI进行监听,这里注意UI需要可以检测射线碰撞,比如Image控件或者上面提到的EmptyButton,并把Raycast Target勾上。
这里给出一个常用事件监听的EventTriggerListener:
By:蒋志杰
1、空白按钮
或者可以说是一个遮罩,首先创建一个继承MaskableGraphic的类,然后重写OnPopulateMesh函数,不绘制任何东西。public class EmptyButton : MaskableGraphic { protected EmptyButton() { useLegacyMeshGeneration = false; } protected override void OnPopulateMesh(VertexHelper vh) { vh.Clear(); } }
然后只需要把这个脚本挂载到物体上,并添加Button控件就可以实现空白按钮的功能了。如果我们只是需要一个遮罩的话,直接挂在这个脚本,不添加Button控件就可以了。
2、EventTriggerListener
首先创建一个继承EventTrigger的类,用来监听Untiy支持的EventTrigger事件,具体支持的事件可以参考Unity官方文档。这里参考了宣雨松的UGUI研究院之控件以及按钮的监听事件系统(五)一文。先定义一个 delegate来监听事件。需要监听的事件可以根据需要进行拓展。public delegate void VoidDelegate(GameObject go); public VoidDelegate onClick;
定义一个静态的Get方法来获取我们的监听器:
static public EventTriggerListener Get(GameObject go) { EventTriggerListener listener = go.GetComponent<EventTriggerListener>(); if (listener == null) listener = go.AddComponent<EventTriggerListener>(); return listener; }
实现onClick事件:
public override void OnPointerClick(PointerEventData eventData) { if (onClick != null) onClick(gameObject); }
在另一个行为脚本中对我们需要的UI进行监听,这里注意UI需要可以检测射线碰撞,比如Image控件或者上面提到的EmptyButton,并把Raycast Target勾上。
void Awake() { EventTriggerListener.Get(gameObject).onClick = OnClick; } public OnClick(GameObject go) { if(go == gameObject) { // your code } }
这里给出一个常用事件监听的EventTriggerListener:
//====================================================================================//
// //
// 可代替ugui的button实现更为复杂的按钮功能 //
// 除给出的delegate外还可以自行添加其他的事件 //
// 参考文档:https://docs.unity3d.com/460/Documentation/Manual/SupportedEvents.html //
// 参考实现:http://www.xuanyusong.com/archives/3325 //
// //
//====================================================================================//
using UnityEngine;
using UnityEngine.EventSystems;
public class EventTriggerListener : EventTrigger
{
public delegate void VoidDelegate(GameObject go);
public VoidDelegate onEnter;
public VoidDelegate onExit;
public VoidDelegate onDown;
public VoidDelegate onUp;
public VoidDelegate onClick;
public VoidDelegate onBeginDrag;
public VoidDelegate onDrag;
public VoidDelegate onEndDrag;
// 添加需要的事件
static public EventTriggerListener Get(GameObject go) { EventTriggerListener listener = go.GetComponent<EventTriggerListener>(); if (listener == null) listener = go.AddComponent<EventTriggerListener>(); return listener; }
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 OnPointerDown(PointerEventData eventData)
{
if (onDown != null)
onDown(gameObject);
}
public override void OnPointerUp(PointerEventData eventData)
{
if (onUp != null)
onUp(gameObject);
}
public override void OnPointerClick(PointerEventData eventData) { if (onClick != null) onClick(gameObject); }
public override void OnBeginDrag(PointerEventData eventData)
{
if (onBeginDrag != null)
onBeginDrag(gameObject);
}
public override void OnDrag(PointerEventData eventData)
{
if (onDrag != null)
onDrag(gameObject);
}
public override void OnEndDrag(PointerEventData eventData)
{
if (onEndDrag != null)
onEndDrag(gameObject);
}
}
By:蒋志杰
相关文章推荐
- ARM 开发软件及实用工具介绍
- 介绍两个b/s开发中我常用到的小工具
- 转帖:ARM 开发软件及实用工具介绍
- ARM开发软件及实用工具介绍(转)
- ARM开发软件及实用工具介绍(转)
- [SQL Server]用于压力测试和性能分析的两个支持实用工具[转]
- 介绍两个UML工具
- 介绍Flex UI测试工具:FlexMonkey
- ARM 开发软件及实用工具介绍
- 介绍Java的实用工具类库java.util包
- 介绍两个,b/s开发中我常用到的小工具
- 介绍两个UML工具
- ARM 开发软件及实用工具介绍
- 介绍Flex UI测试工具:FlexMonkey
- [转贴]Diskpart 命令行实用工具介绍
- 介绍一个实用的小工具
- ARM 开发软件及实用工具介绍
- 数据库-oracle【Oracle系统实用工具介绍】
- 介绍一款超实用的演讲必备工具 ZoomIt
- ARM开发软件及实用工具介绍