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