NGUI 的 UICamera 脚本工作机制

下面对进行NGUI 的 UICamera 脚本非常详细的分析,涵盖了它的作用、输入模式、事件分发机制、射线检测、输入数据结构、以及事件分发的底层实现。下面我帮你梳理一下重点,并补充一些常见问题和实际开发中的注意事项,方便你更好地理解和应用。


1. UICamera 的核心作用

  • 事件生产者和分发者:UICamera 负责从 Unity 的 Input 系统获取输入(鼠标、触摸、手柄),并将其转换为 NGUI 的 UI 事件,分发给对应的 UI 控件。
  • 与渲染无关:UICamera 只负责事件,不影响 UI 的渲染。没有挂载 UICamera 的 Camera 依然能渲染 UI,但无法响应交互。

2. 输入模式与事件类型

  • 输入模式:Mouse(鼠标)、Touch(触摸)、Controller(手柄),自动根据平台和设备切换。
  • 事件类型:分为 World 和 UI,影响射线检测的方式(物理距离 vs. UIWidget 的 raycastDepth)。

3. 射线检测与事件接收

  • eventReceiverMask:指定哪些 Layer 能接收 UI 事件。
  • rangeDistance:限制射线检测的最大距离。
  • Raycast 逻辑:UI 类型用 raycastDepth 判断,World 类型用物理距离判断。

4. 输入数据结构

  • MouseOrTouch:封装了每个输入点(鼠标/手指/手柄)的状态。
    • 鼠标:mMouse(3个 MouseOrTouch,左/右/中键)
    • 触摸:mTouches(Dictionary,支持多点触控)
    • 手柄:controller

5. 事件分发流程

  • 每帧 Update 检测输入,分为:

    1. 处理触摸/鼠标事件(ProcessTouches/ProcessMouse)
    2. OnCustomInput 委托(可自定义输入)
    3. 处理选中控件
    4. 处理键盘/手柄事件
  • ProcessTouches 负责遍历所有触摸点,封装输入数据,射线检测,最终调用 ProcessTouch 进行事件分发。

  • ProcessTouch 通过 Unity 的 SendMessage 机制,向目标 GameObject 发送如 OnPressOnClick 等消息,实现事件通知。


6. 典型事件分发流程(以触摸为例)

  1. 获取输入数据(Input.GetTouch)
  2. 封装为 MouseOrTouch
  3. 射线检测(Raycast)
  4. 确定目标对象
  5. 分发事件(SendMessage)

7. 常见问题与开发建议

  • 多摄像机场景:多个 UICamera 时,注意 eventReceiverMask 和摄像机的 Depth,避免事件冲突。
  • 性能优化:大量 UI 控件时,合理设置 eventReceiverMask 和 UIWidget 的 raycastDepth,减少不必要的射线检测。
  • 自定义输入:可通过 OnCustomInput 委托扩展输入方式(如虚拟摇杆、手势等)。
  • 事件响应方式:NGUI 事件是通过 SendMessage 分发的,目标对象需有对应的消息处理方法(如 OnClick、OnPress 等)。

8. 典型用法示例

void OnClick()
{
   
   
    Debug.Log("Button Clicked!");
}

void OnPress(bool isPressed)
{
   
   
    if (isPressed)
        Debug.Log("Button Pressed Down");
    else
        Debug.Log("Button Released");
}

只要你的脚本挂在 UI 控件上,且方法名和参数匹配,UICamera 就会自动调用。


<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你一身傲骨怎能输

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值