tips穿透问题和UIScroll
UICamer的原理: UICamer就是通过在触摸/鼠标移动的位置的地方发射射线(就是Unity的Raycast),然后获取射线撞击的碰撞体(collider)信息,然后发射消息(通过Unity的SendMessage函数)给该碰撞体关联的GameObject的所有脚本 原本的做法是,给tips加一层背景遮罩(遮罩上加上Box Collider),当触发到遮罩Box Collider时,发送关闭tips事件,然后通过UICamera.lastHit.collider.gameObject获取到射线最后的碰撞对象。给这个对象SendMessage("OnClick") 用NGUI生成ScrollView 有两个重要的类UIScrollview和UIPanel(NGUI Version 3.7.8) ScrollviewPanel上面挂上UIPanel的作用是用来渲染,当有一块需要特殊处理的模块需要渲染时需要用到UIPanel专门控制。 ### Tips穿透问题与UIScroll详解 #### Tips穿透问题解析 在开发过程中,处理用户界面时经常会遇到所谓的“穿透”问题,特别是在使用Unity等游戏引擎进行2D或3D UI设计时更为常见。本文将深入探讨如何解决物品提示(tips)穿透问题。 ##### 基础原理:UICamera的工作机制 UICamera是Unity UI系统中的核心组件之一,它通过在触摸或鼠标移动的位置发射射线(即Raycast)来检测与UI元素的交互。具体来说,当用户触碰屏幕或移动鼠标时,UICamera会发射一条射线并检测射线碰撞的第一个碰撞体(collider),进而触发与该碰撞体相关的GameObject上的事件。这一过程通常利用`SendMessage`函数来完成,使得开发者可以通过简单地向目标GameObject发送自定义消息来实现各种交互逻辑。 ##### 原始解决方案:遮罩+BoxCollider 一种常见的处理方法是在tips界面背后添加一个遮罩层,并在这个遮罩上添加一个BoxCollider。当用户触碰到遮罩时,程序会发送关闭tips的事件,并通过`UICamera.lastHit.collider.gameObject`获取射线最后碰撞的对象。之后,给该对象发送`OnClick`消息以触发进一步的动作。这种方法简单有效,但在某些情况下可能会出现穿透现象,即用户的点击没有被遮罩拦截而是穿透到了后面的UI元素上。 ##### 新的解决方案:Layer隔离 为了克服上述问题,可以采用一种更加灵活的方法——通过为tips界面预设一个新的Layer,并相应地修改相机的CullingMask来包含这个新Layer。这样一来,可以确保射线不会穿过tips界面到达底层的UI元素。具体实现步骤如下: 1. **预设新Layer**:在Unity项目中创建一个新的Layer,并将该Layer分配给tips界面的所有相关GameObject。 2. **修改CullingMask**:在相机设置中,确保其CullingMask包含了新创建的Layer。 3. **添加判断逻辑**:在处理用户输入的代码中,增加条件判断,以检查射线最后碰撞的对象是否属于新Layer。如果属于,则正常处理;如果不是,则认为发生了穿透现象,并发送关闭tips的事件。 示例代码如下: ```lua if(Input.GetMouseButtonDown(0)) then if(UICamera.lastHit.collider.gameObject.layer ~= LayerManager.Tips_Layer) and TipsManager.isShow then EventManager:dispatchEvent(EventName.CloseTips) end end ``` 通过这种方式,即使用户试图点击tips背后的UI元素,也可以有效地避免穿透现象的发生。 #### UIScroll与Scrollview优化 另一个常见的UI设计问题是Scrollview内部空白区域无法响应滑动操作。当Scrollview中的Item数量不足以填充整个可见区域时,空白区域往往不能响应用户的手势操作。为了解决这个问题,可以采取以下策略: ##### 添加背景层 在Scrollview Panel外侧添加一个额外的背景层,以便更好地捕获空白区域的触摸事件。这可以通过调整Scrollview的层级结构来实现。 ##### 设置UIDragScrollView 关键在于正确配置`UIDragScrollView`组件,确保其`ScrollView`属性指向了包含Scrollview的Panel。如果没有明确指定,组件将在运行时自动寻找带有Scrollview的父节点。正确的设置可以确保空白区域也能响应拖动操作。 ##### 使用UIScrollview与UIPanel 在NGUI框架中,UIScrollview和UIPanel是生成Scrollview的两个重要类。UIScrollview负责管理滚动行为,而UIPanel则用于渲染UI元素。为了实现某些特殊效果,如仅显示部分Item或者裁剪显示区域,可以利用UIPanel的Clipping功能。 在UIPanel的`LateUpdate()`函数中,`UpdateSelf()`方法是其中的核心部分。尤其值得关注的是`UpdateWidget()`方法,因为它涉及UIWidget的渲染逻辑。通过调整这些设置,可以轻松实现复杂的UI布局和交互效果。 无论是处理tips穿透问题还是优化Scrollview性能,理解并熟练运用Unity及其插件的特性对于开发高质量的用户界面至关重要。通过上述方法,可以有效提升UI设计的专业性和用户体验。
剩余12页未读,继续阅读
- 粉丝: 10
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助