当前位置: 首页 > news >正文

Unity:UGUI笔记(二)——UI事件监听接口

写在前面:

写本系列(自用)的目的是回顾已经学过的知识、记录新学习的知识或是记录心得理解,方便自己以后快速复习,减少遗忘。这里只有代码相关部分,没有面板部分。

三、UI事件监听接口

1、事件接口用来解决什么问题

目前所有UI控件只提供常用事件监听列表(如Button的onClick),无法实现长按、双击、拖拽等特殊交互功能。并且,Image、Text、RawImage三大基础控件无法响应玩家输入。事件接口让所有控件都能添加更多事件监听来处理复杂逻辑。

2、事件接口

(1)常用事件接口

①鼠标交互类

IPointerEnterHandler/OnPointerEnter: 当指针进入对象时调用(鼠标进入)

IPointerExitHandler/OnPointerExit: 当指针退出对象时调用(鼠标离开)

IPointerDownHandler/OnPointerDown: 在对象上按下指针时调用(按下)

IPointerUpHandler/OnPointerUp: 松开指针时调用(在指针正在点击的游戏对象上调用)(抬起)

IPointerClickHandler/OnPointerClick: 在同一对象上按下再松开指针时调用(点击)

由于所有接口的调用方式都一样,因此仅仅演示几个常用接口。在调用时,需要先继承接口,然后实现对应接口。

public class lession12 : MonoBehaviour,IPointerEnterHandler,IPointerExitHandler,IPointerDownHandler,IPointerUpHandler
{public void OnPointerDown(PointerEventData eventData){print("鼠标(触碰)按下");}public void OnPointerEnter(PointerEventData eventData){print("鼠标进入");}public void OnPointerExit(PointerEventData eventData){print("鼠标离开");}public void OnPointerUp(PointerEventData eventData){print("鼠标(触碰)抬起");}
}

将继承了脚本的接口挂载到场景中需要事件响应的对象上,如图,挂载到了image对象上。而后运行,在鼠标移动、退出场景中的image对象、点击/抬起鼠标时均会打印信息。

②拖曳操作类

IBeginDragHandler/OnBeginDrag: 即将开始拖动时在拖动对象上调用(开始拖拽)

IDragHandler/OnDrag: 发生拖动时在拖动对象上调用(拖拽中)

IEndDragHandler/OnEndDrag: 拖动完成时在拖动对象上调用(结束拖拽)

(2)不常用事件接口

①特殊交互类     

IInitializePotentialDragHandler/OnInitializePotentialDrag: 在找到拖动目标时调用,可用于初始化值

IDropHandler/OnDrop: 在拖动目标对象上调用

IScrollHandler/OnScroll: 当鼠标滚轮滚动时调用

IUpdateSelectedHandler/OnUpdateSelected: 每次勾选时在选定对象上调用

②选择状态类

ISelectHandler/OnSelect: 当对象成为选定对象时调用

IDeselectHandler/OnDeselect: 取消选择选定对象时调用

③导航相关类

IMoveHandler/OnMove: 发生移动事件(上、下、左、右等)时调用

ISubmitHandler/OnSubmit: 按下Submit按钮时调用

ICancelHandler/OnCancel: 按下Cancel按钮时调用

3、PointerEventData

PointerEventData继承自BaseEventData,所有事件接口响应时传入的参数都是PointerEventData类型。主要用于处理UI事件中的指针(鼠标/触摸)相关数据。

eventData.pointerId:获取按键标识,可用于区分不同鼠标按键的交互逻辑。左键-1,右键-2,中键-3。

position: 当前指针位置(屏幕坐标系)

pressPosition: 按下时的指针位置

eventData.delta:拖动中德尔塔值的变化

clickCount: 连击次数(可用于实现双击/三击)

clickTime: 点击时间(系统时间戳,需自行计算时间间隔)

pressEventCamera: 按下事件关联的摄像机

enterEventCamera: 进入事件关联的摄像机

这里仅做部分演示:

public class lession12 : MonoBehaviour,IPointerEnterHandler
{public void OnPointerDown(PointerEventData eventData){print("鼠标(触碰)按下");print(eventData.pointerId);print(eventData.position);}
}

四、EventTrigger事件触发器

1、事件触发器

事件触发器是EventTrigger组件,它是一个集成了所有事件接口的脚本,可以让我们更加方便地为控件添加事件监听。

为需要事件监听的对象在Inspector窗口添加EventTrigger脚本:

2、代码

有两种添加事件函数的方式:拖曳代码和直接代码添加。

(1)拖曳代码

在EventTrigger脚本处点击Add New Event Type,即可选择需要添加的事件函数类型,这里以Pointer Enter为例:

需要注意的是,这里的BaseEventData的意思是,我们书写的事件函数必须传入参数BaseEventData。BaseEventData之前提到过,是PointerEventData的父类,这里可以当作是父类装子类,主要用于处理UI事件中的指针(鼠标/触摸)相关数据。

有如下所示的函数:

public void TestPointerEnter(BaseEventData data)
{PointerEventData eventData = data as PointerEventData;print("鼠标进入");
}

接下来就可以通过拖曳代码来关联了,将挂载了包含上述函数的脚本的对象拖拽到EventTrigger中,并选择对应函数,注意要选择Dynamic下的:

这样就关联好了。

(2)直接代码关联

声明一个EventTrigger变量et,并且声明一个单事件触发的类:EventTrigger.Entry entry

使用entry.eventID = EventTriggerType.PointerUp;设置事件类型

使用entry.callback.AddListener()为事件添加函数,最后将该事件添加至EventTrigger中,如下:

EventTrigger et;void Start()
{EventTrigger.Entry entry = new EventTrigger.Entry();entry.eventID = EventTriggerType.PointerUp;entry.callback.AddListener((data) =>{print("抬起");});et.triggers.Add(entry);
}

五、屏幕坐标转UI相对坐标

1、RectTransformUtility

RectTransformUtility公共类是一个RectTransform的辅助类,主要用于一些坐标转换等操作。目前对我们来说最重要的函数是ScreenPointToLocalPointInRectangle,它可以将屏幕空间上的点转换为UI本地坐标的点。

2、代码

RectTransformUtility.ScreenPointToLocalPointInRectangle()

参数一:相对父对象,类型为RectTransform。这个参数的意思是,得到的转换后的坐标的坐标系以谁为准,传入的是当前对象的父对象。

参数二:屏幕点:传入需要转换的屏幕上的点

参数三:摄像机:传入当前的摄像机

参数四:最终得到的点。

这个函数一般配合拖拽事件使用,如下所示:

public class lession14 : MonoBehaviour,IDragHandler
{ Vector2 nowPos;public void OnDrag(PointerEventData eventData){RectTransformUtility.ScreenPointToLocalPointInRectangle(this.transform.parent as RectTransform,eventData.position,eventData.enterEventCamera,out nowPos);this.transform.localPosition = nowPos;}
}

六、异形按钮

当你想制作一个异形按钮例如下图时

你会希望玩家点击透明区域时按钮不响应,点击有图片的部分按钮才响应。但在矩形框内的区域都会响应。

接着,我们需要勾选图片的读写通道:

最后,书写代码并关联控件。 img.alphaHitTestMinimumThreshold = 0.1f;的意思是,当透明度大于0.1时,点击的部分才会响应。

public Image img;
void Start()
{img.alphaHitTestMinimumThreshold = 0.1f;
}
http://www.dtcms.com/a/499928.html

相关文章:

  • CSRF 漏洞全解析:从原理到实战
  • 建设项目备案网站管理系统一般网站建设流程有哪些步骤
  • 深圳AI搜索优化:助力企业精准获客新趋势
  • 免费搭建个人网站河北省建设厅网站老版
  • 菏泽市建设职工培训中心网站重庆seo结算
  • dedecms 网站模板网络营销推广技术
  • SMDJ14CA双向 TVS瞬态抑制二极管:高效瞬态电压抑制,保护电路安全
  • 怎么免费自己做网站适合0基础网站开发软件
  • 响应式网站排名如何医疗卫生网站前置审批
  • 网站建设的合理建议企业网站商城
  • C++ vector容器的解析和使用
  • STM32G474单片机开发入门(十四)SPI总线详解及NRF2401模块实战
  • 接口测试的测试用例应该怎么写?
  • java.lang 包详解
  • GTA5浏览器网站建设中建设银行网站定酒店
  • C++编程学习(第38天)
  • 许昌做网站公司哪家专业找装修公司的网站
  • 问题“A fatal error occurred: Failed to connect to ESP32”分析解决
  • 基数排序基础透彻理解
  • 批处理重命名遇到的几个问题
  • 网站风格的设计微信小程序开发费用一览表
  • 门户网站开发框架应用网站
  • 做网站如何调字体格式衡阳做网站ss0734
  • 云南省城乡和住房建设厅网站大连seo建站公司
  • 微服务降本增效措施
  • [优选算法专题四.前缀和——NO.27 寻找数组的中心下标]
  • 多模块exe文件和ini文件文件之间是如何耦合的
  • 【MySQL】数据库的相关操作
  • 房地产网站源码Wordpress页面无侧边栏
  • 营销神器官方网站竞价单页模板