新手引导是个费力不讨好的活,该功能与其他功能产生大量耦合,因此,新手引导设计的核心就是解耦!解耦!解耦!
该项目中几个出现的名词先给大家解释一下
GuideMgr常驻内存(引导框架管理类,负责管理引导组、引导项、引导的开启、所有事件的管理)
GuideItem(引导项数据,由于可能存在多个引导同时存在的可能,每个引导项数据独立存在)
--引导项打开
function GuideItem:Init()
self:FindUITarget() --流程1判断是否有引导物体
self:StopTime()
self:ShowMask() --流程3再显示遮罩
self:MaskClip() --流程2设置遮罩信息
self:IsDialog() --流程5是否显示对话
self:FocusEvent()
self:IsBtnEffect() --流程6是否显示圆形特效
self:IsArrow() --流程7是否显示箭头
self:IsHandMoveEffect() --流程*是否显示手指移动
self:IshandCircleEffect() --流程8是否显示方形特效
self:IsHand() --流程9是否显示手势
self:IsTips() --流程10是否显示提示框
self:IsRocker() --流程11是否显示摇杆提示
self:IsRhombus() --流程12,显示菱形
self:IsFightPosEffect()
self:IsPlayAudio() --流程17,播放音效
self:ShowCountDown() --流程18,是否自动完成
self:ShowSkip() --流程19,是否可以跳过
end
UIMgr(UI框架管理类,负责UI的生命周期功能,例如加载、显示、隐藏等)
UI_Guide(引导UI预设)
先说一下引导常见的完成方式
- 引导点击UI按钮完成引导(强制引导或弱引导)
- 强制引导战斗系统上阵某个角色到指定站位
- 强制引导战点击攻击某个敌方角色
引导架构设计
UI类型的引导主要是按钮点击,这类引导方式的发起点是UIMgr显示目标UI后向GuideMgr抛事件,当检测是目标UI后GuideMgr启动引导项。UIMgr一定要设计一套按钮管理机制,当任意UI加载后,要把它身上的所有Button的组件管理起来,这样做的好处是可以实现按钮过滤。举个例子:当主城UI启动后开启竞技场引导,玩家手速快点了其他按钮跳出了其他UI,请注意,此时是强制引导状态,但你的引导目标已被新UI覆盖点不到导致卡死。如果有了按钮过滤系统,你压根就无法点击除目标按钮以外的按钮,这个锁定UI的名字叫FocusButton合适。
有个特殊的UI引导就是
引导UI按钮点击
问题1:手机平台的引导界面是异步加载的,引导界面会比引导目标UI晚出现
问题2:切换场景、切换战斗时引导界面还没出现,但引导物体已被点击的问题
问题3:玩家手速快在UI_Guide显示之前点击了其他UI按钮进入了功能,导致引导组错乱卡死。
解决方案:
GuideMgr实现引导数据和UI剥离,当UI_Guide加载后去显示当前的GuideItem的数据即可,解决UI_Guide异步加载慢的问题。问题2引导还没显示但先点击UI完成的情况,引导项直接删除,开启下一项引导数据即可,也就是说,引导UI加载后显示啥,永远以当前的GuideItem数据为准。问题3就靠UIMgr的FocusButton功能