需要游戏运行到某节点,一般是新解锁某功能,出现遮罩,只有指定的按钮能按。
我们已经知道只开放部分区域的UI遮罩的实现。现在需要设计如何把一个引导流程设计配表,反序列化。
一个引导流程由若干个点击引导组成。每个有一个屏幕某位置某大小的矩形,还有一个引导字符串。这个矩形的位置和大小我们可以直接填到配表里,也可以直接从它露出的按钮获取。但是要从按钮获取必须在配表写清楚是哪个按钮,那么必须给游戏所有按钮打一个id。
不过我们也可以只给有可能被引导的按钮打id。
然后为了让引导说明出现在合适的位置,还需要在配表填这个文本框的位置。
然后想象我们刚解锁了一个新功能,我们在程序的此位置发布一个事件。也可以不用事件,就去玩家数据里检查这个功能有没有解锁,刚解锁就触发它相应的引导流程,显示遮罩,然后玩家点击这个按钮的回调事件加一个引导前进到下一步。
或者用事件,游戏运行到某节点,发布某事件名的事件,那么引导配置里加一个此段引导要监听的事件名。
我们要把《显示下一步引导遮罩》的方法加入玩家要按的按钮的回调。那么程序必须知道要给哪个按钮加回调。我们发现还是免不了给按钮加ID。不用全加,只给可能被引导按的按钮加一个组件GuideButton,里面填上GuideID。那么前面引导配表里也就填按钮GuideID就行,显示遮罩直接通过GuideID获取按钮,再获取位置和大小。
怎么通过GuideID获取按钮?FindObjectsOfType可以,想象我们刚解锁了一个新功能,需要显示遮罩,然后根据事件名从配置里读取这组遮罩的配置,然后看第一个遮罩的按钮GuideID,这些是遮罩控制器的工作,遮罩控制器需要在多个场景工作,所以不继承MonoBehavior,或者DontDestroy,它也不知道当前遮罩按钮所属的面板。所以在遮罩配表里把面板名字也写上。
那么引导系统和面板是两个独立的物体,引导系统先去根据面板名字找到面板,从它身上找到GuideID的按钮。这里会不会出现引导先触发,面板没加载出来,导致找不到面板?
我想了想,一组引导的第一个按钮必须在当前打开的面板上。而且必须是最上层的面板。那么就按配置找到面板,然后用GetComponentsInChildren得到所有引导id组件,找到对应的GuideID?每一步引导都要这样找一遍,开销是否太大?
那让每个引导Id组件Awake时把自己加入引导控制器的字典?
我想到,引导控制器持有当前引导组的数据,以及当前走到哪一步的数据,引导步数更新时发布新引导Id的事件,对应的组件如果在,就调用显示遮罩。引导id组件初始化时也去引导控制器看一下当前激活的引导id是不是自己,如果是就显示遮罩。这个方案和红点系统类似,都是不管按钮先存在还是红点节点先存在,按钮都能正确显示红点。
这个方法总结起来就是:业务层变化时发布事件,视图层监听事件,视图层初始化时也查看一下业务层状态。
现在要实现点击按钮前进到下一步引导,那么是给按钮加回调?但是下一次按按钮不能再触发下一步引导了,还要把回调去掉?
我想到引导id组件弄一个函数,把它加入按钮,里面判断如果引导控制器当前步骤的guideId是自己,则引导进一步。