guid_mian - woodelf-treetop/rcwiki GitHub Wiki

说明

目前,新手引导的结构大致是这样的。我们以GuideManager.lua作为基本脚本,从而引申出继承GuideStep.lua的所有操作类型。
我们的新手引导是以事件的形式驱动的。所以有时候新手引导卡住,但也没有报错,可能就是对应的事件没有触发。
另外,由于新手引导是和各个界面有交互,所以需要注意很多小细节。这个做了的时候需要思考全面,是个体力活。

平时常用的脚本和表:

脚本:GuideManager、GuideStep、GuideRecord(服务器记录点)、BeginnerGuideCtrl、BeginnerGuidePanel。

表:BeginnerGuide(主表,所有的步骤)、GuideTriggerType(每一步的startTrigger 和 endTrigger的枚举类型)、GuideType(主类型的表,每一步的大类型)、GuideEventType(每一步的特殊事件)

GuideManager

GuideManager里设置了很多参数,这里有几个参数很重要。

GuideManager.isShow = nil --新手引导是否打开
GuideManager.maxGuideStage = 11 --这里新手战场和界面引导一共加起来的点
GuideManager.MaingameHideEnum = {
    HideAll = 1,
    ShowExceptKing = 2,
    HideExitBtn = 3,
}
  • isShow:是查看新手引导是否开启的。
  • maxGuideStage:这个值是我后来加的,从第一步到强制新手引导截止时,所有的guideType类型为confData_freshman_EGuideType.RECORD的个数,我们用这个值可以判断新手引导是否走完了。
  • MaingameHideEnum:在新手引导中初始化战场的时候,我们可以指定战场里的屏蔽模式。HideExitBtn是只屏蔽右上角认输按钮。具体的代码跟进看一下。

需要注意的是:在对BeginnerGuide表进行修改时,如果增/减了【5】的类型,那么GuideManager.maxGuideStage也需要进行相应的修改。

新手引导的开始都是从 GuideManager.Init( guideStepInfo ,loginInCombat) 开始的。

function GuideManager.Init( guideStepInfo ,loginInCombat)
    .
    this.steps[i] = GuideManager.CreateGuideStep( confData_freshman_BeginnerGuide[i] ) --得到了this.steps
    .
    .
    .
    for i = 1, #confData_freshman_BeginnerGuide do
        .
        .
        .
        if confData_freshman_EGuideType.RECORD == this.steps[i].stepType then
            this.stages[#this.stages + 1] = i --得到this.stages,value是表id
        end
    end
    for i = 1, #this.stages do
        --logError(" id:"..this.stages[i].." stageId:"..i)
        --对类型是confData_freshman_EGuideType.RECORD的数据,追加stageId,其值为顺序id
        this.steps[this.stages[i]].stageId = i
    end
    
    --这里先做个测试数据
    --finishStage = 4
    .
    .
    .
end
  • 开始是对BeginnerGuide表遍历,将每一步的信息以事先写好的guideType类型存储,得到了this.steps。然后需要服务器做记录的步骤存储了stageId值。这个值用于和maxGuideStage值做比较,是否结束引导。
  • 如果存在新手引导的情况下,我们每一次进入游戏是基于你上次发送给服务器的关键点作为开始的(新号的话这里做了判断,没有就是从第一步开始)。所以我们在开发的时候,可以修改这个值到想要的关键点开始。
  • 剩下还有一个比较关键的是 StartEventEndEvent。我们每一步的进入和离开是通过这两个event控制的。

GuideStep

这个里面有几个重要的函数:GuideManager会驱动 ExitStep() 方法进行前进,经过判断会走进 EnterStep() 方法。

当进入 EnterStep() 的时候,会先后调用self:OnGuideEnter()、slef:OnGuideShow()、slef:OnGuideEnd()

具体调用步骤是:刚进入一个新的步骤,会先调用self:OnGuideEnter(),然后经过表里的延迟控制调用slef:OnGuideShow(),当endTrigger相应后,清除当前引导事件并调用slef:OnGuideEnd()。
我们继承(guideType类型的)脚本,可以继承这些函数。其中主要用OnGuideShow方法来处理当前步骤的的逻辑。

需要注意的

  • BeginnerGuide的 step 这列需要注意,在每一个大类型里面代表的意义不一样(这个功能可能开始没想太多,结果后面都杂在这里了)。
  • BeginnerGuide的 stepId 这列是小步骤,这个参照一下之前的逻辑。
  • 把握 BeginnerGuide表里 startTrigger 和 endTrigger 的时机。
  • 另外,引导中有大量的 SetActive(true) SetActive(false),这里是不是可以考虑用改变坐标的方式做?

在修改BeginnerGuide后,还需要着重看一下上图里的步骤是否连续,着重注意一下。

另注

我认为我们新手引导在结构上算是稳定的。

每一步对应一个guideType的大类型,并且我们可以通过条件控制来确定进入该步骤和退出该步骤。各个大类型通过重写OnGuideShow来展示新手引导,每一步之间相对独立,方便增删。

现在引导可能存在的缺陷是:我们每次在修改需要服务器记录的步骤时,可能会伴随着我们在代码里进行修改(上图),感觉这里不太方便,后续改进的话,可以在表里面进行修改。

⚠️ **GitHub.com Fallback** ⚠️