using cfg.GuideCfg; using Framework; using Gameplay.SubSystems; using Gameplay; using PhxhSDK; using System.Collections; using System.Collections.Generic; using UnityEngine; using Cysharp.Threading.Tasks; /// /// 新手引导管理器 /// public class GuideManager : Singlenton, IInitable { /// /// 新手引导配置字典,key:引导组,Value:引导步骤配置链表 /// private Dictionary> dicGuideCfg; /// /// 当前的引导组 /// private GuideGroup curGroup; /// /// 当前已完成引导步骤id(测试用) /// private int completeId = 0; /// /// 是否启用新手引导 /// public bool IsEnable = false; /// /// 是否引导中 /// public bool IsGuiding { get { return curGroup != null && curGroup.IsGuiding; } } public void Init() { EventManager.Instance.Register(EventManager.EventName.AllConfigLoad, InitData); } public void Release() { EventManager.Instance.Unregister(EventManager.EventName.AllConfigLoad, InitData); } /// /// 开始引导 /// public bool BeginGuide() { if (!IsEnable) return false; if (IsGuiding) return false; foreach (var guide in dicGuideCfg) { if (guide.Key > completeId) { curGroup = new(guide.Key, guide.Value); // TODO 测试 curGroup.BeginGuide(); return true; } } return false; } /// /// 完成指定引导步骤 /// /// public void CompleteStep(GuideStepBase step) { if (null == curGroup) return; if (step != curGroup.CurStep) { DebugUtil.LogError("要完成的引导步骤不是当前步骤"); EndGuide(true); return; } if (curGroup.IsComplete) { completeId = curGroup.GroupId; // TODO 完成引导组,保存服务器 int nextGroupId = curGroup.NextGroupId; if (dicGuideCfg.TryGetValue(nextGroupId, out LinkedList linkCfg)) { curGroup = new(nextGroupId, linkCfg); curGroup.BeginGuide(); } else EndGuide(false); } else curGroup.BeginNextStep(); } /// /// 结束引导 /// private void EndGuide(bool isReEnterMain) { if (IsGuiding) curGroup.EndGuide(); curGroup = null; UIManager.Instance.CloseWindow(UINameConst.UI_Guide); UIManager.Instance.CloseWindow(UINameConst.UI_GuideTip); if (isReEnterMain) LoadingExecutorManager.Instance.ExecuteLoading(new MainSceneLoadingExecutor()).Forget(); } /// /// 初始化数据 /// private void InitData() { dicGuideCfg = new(); foreach (DataGuideCfg cfg in TableManager.Instance.Tables.GuideConfig.DataList) { if (dicGuideCfg.ContainsKey(cfg.GroupId) && !IsFirstStep(cfg)) continue; DataGuideCfg addCfg = cfg; // 记录要添加进链表的引导步骤配置 int groudId = cfg.GroupId; LinkedList linkCfg = new(); dicGuideCfg[groudId] = linkCfg; while (null != addCfg && addCfg.GroupId == groudId) { linkCfg.AddLast(addCfg); addCfg = TableManager.Instance.Tables.GuideConfig.Get(addCfg.NextId); } } #region 检验每个引导组的步骤顺序是否正常 foreach (LinkedList linkCfg in dicGuideCfg.Values) { DataGuideCfg preCfg = null; foreach (DataGuideCfg cfg in linkCfg) { if (null == preCfg) { preCfg = cfg; continue; } if (preCfg.NextId != cfg.Id) { Debug.LogError($"新手引导配置出错,组id:{cfg.GroupId}, 当前步骤id:{preCfg.Id}, 实际下一步步骤id:{preCfg.NextId}, 当前下一步步骤id:{cfg.Id}"); IsEnable = false; return; } else preCfg = cfg; } } #endregion } /// /// 是否是引导组的第一步 /// /// private bool IsFirstStep(DataGuideCfg dataGuideCfg) { return dataGuideCfg.Id == dataGuideCfg.GroupId; } }