Unity 事件系统

这篇具有很好参考价值的文章主要介绍了Unity 事件系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介:

EventSystem提供了一种向游戏物体发送消息的途径,这些物体通常是输入信息,包括键盘、鼠标、触摸和自定义输入事件。它包含了一系列组件,它们互相配合,以达到管理和触发器事件的功能。

如果查看物体的EventSystem,会发现可调参数并不多,这是因为EventSystem本身被设计为一种管理器,而不是事件的具体处理者

EventSystem功能包含以下几个方面:

  1. Message System(信息分发系统)
  2. Input Modules(输入模块)
  3. 提供多种常用输入事件接口
  4. 管理各种射线,包括图形射线(Graphic Raycaster,用于UI系统)、物理射线和2D物理射线

一、常用输入事件

Unity至少支持17种常用输入事件,如下图所示

事件名称(接口名称)

说明

IPointerEnterHandler

鼠标进入

IPointerExitHandler

鼠标离开

IPointerUpHandler

鼠标抬起

IPointerDownHandler

鼠标按下

IPointerClickHandler

鼠标单击(按下再抬起)

IInitializePotentialDragHandler

发现可拖拽物体,可用于初始化一些变量

IBeginDragHandler

开始拖拽

IDragHandler

拖拽中

IEndDragHandler

拖拽结束

IDropHandler

拖拽释放

IScrollHandler

鼠标滚轮

IUpdateSelectedHandler

选中物体时,反复触发

ISelectHandler

物体被选择

IDeselectHandler

物体被取消选择

IMoveHandler

物体移动

ISubmitHandler

提交按钮按下

ICancelHandler

取消按钮按下

上篇文章介绍UI控件时,我们知道每种控件仅有一两个可自定义的事件函数,如按钮控件仅包含OnClick事件,输入框控件仅包含OnValueChanged(内容改变)事件和OnEndEdit(结束编辑)事件。那么能否加入更多事件以响应函数呢?

答案是可以的,不仅是控件,而且每个物体都可以支持十多种输入事件。

EventSystem不仅支持UI系统,而且也支持场景中的3D、2D物体。

只要给摄像机增加一个组件——Physics Raycaster(物理射线发射器),就可以支持3D和2D物体了。

二、常用输入事件的参数

上面介绍的多种输入事件,它们的参数类型有所不同。目前有BaseEventDate、PointerEventData和AxisEventData这三种。

其中BaseEventData是所有事件数据的基类;

PointerEventData是用于表示指针滑动、单击的数据;

而AxisEventData则是所有的轴类输入数据,如常见手柄的摇杆就属于轴类输入。

PointerEventData和AxisEventData都是BaseEventData的派生类。

这三个类中,有一些属性比较常用,下面列出:

BaseEventData属性

数据类型

说明

currentInputModule

BaseInputModule

当前输入模块

selectedObject

GameObject

当前选中的物体,也就是“焦点”物体

PointerEventData属性

数据类型

说明

button

InputButton枚举

触发此事件的按钮,鼠标的左、中、右键

clickCount

int

短时间内连击按钮的次数

clickTime

float

上次发送OnClick事件的时间

delta

Vector2

鼠标指针坐标在这一输入帧的变化量

dragging

bool

是否为拖拽状态

enterEventCamera

Camera

最后一个与指针进入事件关联的摄像机,可能为空

hovered

List<GameOnject>

悬停的对象,可能有多个悬停对象,用列表表示

lastPress

GameObject

记录上一次单击的物体

pointerCurrentRaycast

RaycastResult

指针当前射线检测的信息

pointerDrag

GameObject

当前触发拖拽事件的物体

pointerEnter

GameObject

当前触发指针移入事件的对象

pointerld

int

指针ID,例如-1,-2,-3对应鼠标左、中、右键,手机多点触摸也有对应ID

pointerPress

GameObject

被单击的游戏物体

PointerPressRaycast

RaycastResult

单击时的射线检测信息

position

Vector2

当前鼠标指针位置

pressEventCamera

Camera

最后一个与OnClick事件关联的摄像机,可能为空

pressPosition

Vector2

按下事件的指针位置,同一次OnClick事件只有一个

rawPointerPress

GameObject

原始的被单击物体,不管该物体是否响应OnClikck事件

scrollDelta

Vecto2

滚轮的滚动量(有一些滑轮支持横向滚动)

AxisEventData属性

数据类型

说明

moveVector

Vector2

输入的 原始值。横向、纵向的值

moveDir

MoveDirection枚举

将原是输入转化为上下左右或无方向这五种情况

三、动态添加事件响应方法

之前介绍的方法都有一个共同点,需要事先将每个物体和响应函数对应起来。但某些时候需要在运行游戏时,给控件动态指定方法,例如在游戏中,当玩家选择不同技能时,按下攻击按钮会调用不同的技能函数。

可以在运行游戏时动态地给控件指定调用方法,也可以删除、改变和添加响应方法。

四、事件触发器(Event Trigger)

我们知道,Unity支持至少17种输入事件,用脚本可以用到所有这些事件。但是编写专门的绑定事件函数,还是比较复杂,这里介绍一个更方便的方法:使用Event Trigger。

可以为任意物体添加Event Trigger组件,添加该组件后,单击Add New Event Type按钮,就可以添加任意组件了。几乎可以为物体添加所有的输入事件类型,鼠标进入、离开、按下、滚轮和单击等功能皆可直接指定

添加事件类型后,响应函数的指定方法和按钮、输入框等控件是类似的。只是响应函数多了一个BaseEventData类型的参数,可以用它获取相关的事件信息,例如以下的响应函数

public void OnBtnEvent(BaseEventData evt)

{

     Debug.log("当前焦点物体为:"+evt.selectedObject);

     //将基类变量转为派生类变量

     PointerEventData pest=evt as PointerEventData;

     //如果不是鼠标相关的事件,转换会失败

     if(pest==null)

     {

       Debug.log("转换PointerEventData失败");

       return;

     }

     //Pointer类型的事件有更多信息,如位置等

     Debug.log("事件坐标:"+pest.position);

 

BaseEventData类型的参数,本身的信息十分有限,仅有CurrentInputModule(当前输入模块)与SelectedObject(当前焦点物体)两个。

⚠️⚠️⚠️:而很多时候需要注意的都是鼠标或触摸事件,如单击、拖拽、进入物体或离开物体的事件,这类事件往往都属于派生类PointerEventData,可以通过类型转换的方法把它们转换为派生类变量,进而获取到更多有用的信息。文章来源地址https://www.toymoban.com/news/detail-480227.html

到了这里,关于Unity 事件系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity EventSystem的一些理解和使用

    Unity的EventSystem是用于处理用户输入和交互的系统。它是Unity UI系统的核心组件之一,可以用于捕捉和分发各种事件,例如点击、拖拽、按键、射线等。 常用的属性和方法有以下这些: 属性: current : 获取当前的EventSystem实例。 sendNavigationEvents : 一个布尔值,表示是否发送导航

    2024年04月16日
    浏览(32)
  • 【Unity 框架】QFramework v1.0 使用指南 工具篇:13. 其他事件工具 | Unity 游戏框架 | Unity 游戏开发 | Unity 独立游戏

    QFramework 除了支持了 TypeEventSystem、EasyEvent 还支持了 EnumEventSystem、StringEventSystem。 EnumEventSystem 前身是 老版本 QFramework 的 QEventSystem StringEventSystem 的前身是,老版本的 MsgDispatcher TypeEventSystem: 事件体定义简洁 比较适合用于设计框架 支持 struct 获得较好内存性能 使用反射,CPU

    2023年04月17日
    浏览(55)
  • Unity UGUI2——Canvas与EventSystem

    ​ Canvas 的意思是画布,它是 UGUI 中所有 UI 元素能够被显示的根本,它主要负责渲染自己的所有 UI 子对象 ​ 如果 UI 控件对象不是 Canvas 的子对象,那么控件将不能被渲染 ​ 我们可以通过修改 Canvas 组件上的参数修改渲染方式 ​ 场景中允许有多个 Canvas 对象,可以分别管理

    2024年02月12日
    浏览(54)
  • Unity–UI框架-Canvas-EventSystem-Panel

    画布canvas是控制一组UI元素如何呈现的组件, 所有UI元素必须是画布的子项 ,场景中可以有多个画布,但是UI元素至少需要一个可用的画布canvas, 每个画布都有不同的渲染模式,渲染模式可以使用Render Mode进行设置, 1.Screen Space-Overlay 其中,第一种是最常见的渲染模式,也是

    2024年02月03日
    浏览(51)
  • Unity Canvas、Canvas Scaler、Graphic Raycaster、EventSystem 组件详解

    https://blog.csdn.net/qq_33789001/article/details/117781577 https://blog.csdn.net/q764424567/article/details/119923544 属性 功能 Pixel Perfect 使UI元素像素对应,效果就是边缘清晰不模糊 Sort Order 多个Canvas时,数值越大越后渲染。值大的 画布,会挡住值小的 Target Display 目标显示器,如果有多个屏幕的话可

    2024年01月21日
    浏览(61)
  • 【Unity 3D】游戏对象、添加删除获取组件、预制体Prefabs简介

    觉得有帮助请点赞关注收藏~~~ 创建3D对象 选择GameObject -3D Object命令 选择要创建的3D对象 下面是各个对象的意思 cube 立方体 sphere 圆柱体 capsule 平面 cylinder 胶囊体 plane 球体 quad 面片  可以为上面创建的对象添加刚体组件 选中该对象 在Inspector视图中,单机add component按钮, 选在

    2024年02月04日
    浏览(43)
  • GODOT游戏引擎简介,包含与unity性能对比测试,以及选型建议

    GODOT,是一个免费开源的3D引擎。本文以unity作对比,简述两者区别和选型建议。由于是很久以前写的ppt,技术原因视频和部分章节丢失了。建议当做业务参考。 GODOT目前为止遇到3个比较重大的机遇,第一个是oprea的合作奖,第二个是用支持c#换来的微软的投资,第三个是虚幻

    2024年02月14日
    浏览(79)
  • Hazel游戏引擎(008-009)事件系统

    文中若有代码、术语等错误,欢迎指正 此节目的 理清顺序和设计才能更好的编码 设计如图 声明 图是我自己缝合的,流程与大意没错,但是不符合软件工程对应图的规范。 大致是根据视频草稿图与大意画的 使用时序图简单表示 使用类图详细表示 在软件工程中,类图没有消

    2024年02月01日
    浏览(38)
  • 【Unity3D】Unity 脚本 ③ ( C# 脚本的执行入口函数 | 获取当前游戏物体及物体名称 | 获取游戏物体的 Transform 组件数据 | UnityEngine 命名空间简介 )

    在 C# 脚本中控制 游戏物体 GameObject 运动 , 要先获取该物体 , 然后 修改其 Transform 组件的属性 ; 在 游戏开始运行后 , 会自动执行 游戏物体 GameObject 上的 C# 组件代码 , 程序入口是 MonoBehaviour#Start() 函数 ; 在 C# 脚本中 , 主要的内容都在 Start() 函数 中实现 ; 在 C# 脚本中 , 游戏物体

    2023年04月12日
    浏览(82)
  • HarmonyOS4.0系统性深入开发18公共事件简介

    HarmonyOS通过CES(Common Event Service,公共事件服务)为应用程序提供订阅、发布、退订公共事件的能力。 公共事件从系统角度可分为:系统公共事件和自定义公共事件。 系统公共事件:CES内部定义的公共事件,只有系统应用和系统服务才能发布,例如HAP安装,更新,卸载等公共

    2024年02月02日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包