Unity--UI的Event事件

Unity–UI的Event事件

0.简介

UI作为交互的重要使者, 他需要不断的响应玩家的交互–按下,松开,点击,双击,长按等事件.

Unity中的UI事件系统是一个强大的框架,允许开发者创建交互式的用户界面。它基于事件驱动模型,意味着UI元素可以触发事件,而开发者可以编写代码来响应这些事件。UI事件系统特别适用于处理用户输入,如鼠标点击、触摸、拖拽等。

1.主要特点:

  1. 事件监听器:通过为UI元素添加事件监听器,可以捕获并响应特定的事件。
  2. 事件调度:Unity的事件系统负责事件的分发,确保正确的事件被发送到正确的监听器。
  3. 模块化:可以轻松地为不同的UI元素添加或移除事件监听器,从而创建动态和响应式的用户界面。
  4. 自定义事件:除了Unity内置的事件类型外,开发者还可以定义自己的事件类型。

2.常用UI事件:

  • 点击(Click):当用户点击UI元素时触发。
  • 双击(DoubleClick):当用户快速连续两次点击UI元素时触发。
  • 按下(Down):当用户按下鼠标按钮或触摸屏幕时触发。
  • 松开(Up):当用户释放鼠标按钮或停止触摸屏幕时触发。
  • 进入(Enter):当指针(鼠标或触摸点)进入UI元素的边界时触发。
  • 离开(Exit):当指针离开UI元素的边界时触发。
  • 拖拽(Drag):当用户在UI元素上拖拽时触发。

3.使用UI事件:

  1. 添加UI组件:首先,在UI元素(如按钮、图像等)上添加相应的UI组件。
  2. 实现事件接口:在脚本中,实现相应的事件接口,如IPointerClickHandler
  3. 添加事件监听器:在脚本中,为UI元素添加事件监听器。
  4. 处理事件:在接口方法中编写代码来处理事件。

4.具体步骤

1.命名空间

需要引入命名空间 UnityEngine.EventSystems;

using UnityEngine.EventSystems;
2.自带的UI事件拆解

在Unity的UGUI中自带的一些组件中(例如: Image, Button)含有基本的UI响应事件, 例如Button的按下事件, 我们一般使用的通过OnClick添加按下按钮的监听事件AddListener, 即 button.OnClick.AddListener(响应函数名). 但是这是Unity为我们封装好的函数. 因此,如果想要自己实现自定义的交互事件,或者自己手动写一个Button脚本,就需要我们探索. 而Unity提供了基础的接口以便我们实现.

举一个简单的例子: 上文中,Unity中创建的Button我们可以通过添加OnClick.AddListener的方式添加点击后的效果, 但是仔细思考一下. 鼠标的点击分为按下松开. 因此我们自己写一个Button的点击事件,需要拆分为鼠标按下响应事件和鼠标松开响应事件. 如果你需要长按鼠标,3s,需要记录按下与松开之间的时间(该时间可以是秒数也可以是帧数)

3.鼠标按下帧检测

回到鼠标按下和松开例子中, 鼠标按下是后什么时候松开呢? 为了检测鼠标松开 ,计算机需要实时检测鼠标的按下状态, 这里的实时指的每一帧. 在每一帧中检测鼠标的状态,如果鼠标的状态发生改变,就调用对应的的函数. 为了检测鼠标的状态是否发生改变, 我们可以使用枚举类定义鼠标的各种状态, 例如: 按下--0, 松开--1, 按下并松开--3, 没有改变--4. 在Unity中以下是鼠标的按下状态检测枚举. 当然,VR中就是手柄的按下.

public enum FramePressState
{
   
   
    Pressed = 0,
    Released = 1,
    PressedAndReleased = 2,
    NotChanged = 3
}
4.常用接口

因此, 要自定一些效果,长按,短按, 滑动,双击,三击,需要我们自己实现. 或者使用现成的插件.

在Unity中常用的接口有:

鼠标进入, 鼠标移出, 鼠标按下, 鼠标抬起, 获得鼠标的的位置, 获取鼠标按下按键索引值(左键, 右键,中键)

对应的接口名称如下

  • IPointerEnterHandler:当指针进入UI元素时触发。
  • IPointerExitHandler:当指针离开UI元素时触发。
  • IPointerDownHandler:当指针在UI元素上按下时触发。
  • IPointerUpHandler:当指针在UI元素上松开时触发。
  • IPointerClickHandler:当指针在UI元素上点击时触发。
  • IPointerDoubleClickHandler:当指针在UI元素上双击时触发。

5.实践代码

所以, 只要继承了接口,我们就可以实现自己想要的功能. 例如以下代码是实现了一张图片简单模拟按钮的功能, 实现了基础的鼠标进入,鼠标移出,鼠标按下,鼠标松开的自定义功能,修改了图片的颜色

using UnityEngine.EventSystems;

public class UIEvent : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler, IPointerUpHandler
{
   
   

    private Image imgButton;							// 图片
    private Color originalColor;						// 图片的原始颜色
    private Color hoverColor;							// 鼠标进入的颜色
    private Color pressColor;							// 鼠标按下的颜色
    private Color unpressColor;							// 鼠标松开的颜色


    void Start()
    {
   
   
        imgButton = this.transform.gameObject.
Unity-JNI在处理复杂的UI交互,如滑动或触摸事件时,通常涉及以下几个步骤: 1. **事件注册**:在Android代码中,你需要在相应的View或GestureDetector上注册监听器,比如`OnTouchListener`或`OnGestureListener`,这些监听器会捕获用户的触屏动作。 ```java view.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // 这里处理滑动事件 int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: // 开始滑动 break; case MotionEvent.ACTION_MOVE: // 接收滑动距离 float xDiff = event.getX() - initialX; float yDiff = event.getY() - initialY; // 调用JNI函数通知Unity nativeHandleSwipe(xDiff, yDiff); break; case MotionEvent.ACTION_UP: // 结束滑动 break; } return false; // 让事件继续传递给其他拦截者 } }); ``` 2. **JNI调用**:然后,每当Android应用接收到滑动事件,它会通过JNI(Java Native Interface)接口调用到Unity的C#脚本,传递所需的参数,如滑动的距离、方向等。 3. **Unity处理**:在Unity的C#脚本中,你可以接收到这些参数,然后更新Unity内相应的游戏对象位置、动画或触发游戏逻辑。 ```csharp [DllImport("UnityJniLib")] private static extern void HandleSwipe(float dx, float dy); void Update() { if (IsSwiping) { HandleSwipe(dx, dy); // dx 和 dy 来自JNI // 更新Unity UI或游戏对象位置 } } ``` 4. **来回通信**:对于复杂的交互,可能需要在两端之间频繁地交换信息,例如,Unity可能还需要反馈给Android一些状态变化,这时候也需要通过JNI来回传消息。 注意,每个操作的具体实现可能会因项目需求而有所不同,以上是一种常见的模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值