下面对进行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 检测输入,分为:
- 处理触摸/鼠标事件(ProcessTouches/ProcessMouse)
- OnCustomInput 委托(可自定义输入)
- 处理选中控件
- 处理键盘/手柄事件
-
ProcessTouches 负责遍历所有触摸点,封装输入数据,射线检测,最终调用 ProcessTouch 进行事件分发。
-
ProcessTouch 通过 Unity 的
SendMessage
机制,向目标 GameObject 发送如OnPress
、OnClick
等消息,实现事件通知。
6. 典型事件分发流程(以触摸为例)
- 获取输入数据(Input.GetTouch)
- 封装为 MouseOrTouch
- 射线检测(Raycast)
- 确定目标对象
- 分发事件(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 就会自动调用。