using cfg.GuideCfg; using Framework; using Gameplay.Area; using Gameplay.Level; using Gameplay.Net; using Gameplay.PlayerSkill; using Gameplay.Skill; using NLDPB; using PhxhSDK; using System; using System.Collections.Generic; using UnityEngine; namespace Gameplay.Guide { /// /// 新手引导管理器 /// public class GuideManager : Singlenton, IInitable, IUpdatable { /// /// 新手引导配置字典,key:引导组,Value:引导步骤配置链表 /// private Dictionary> dicGuideCfg; /// /// 当前的引导组 /// private GuideGroup curGroup; /// /// 是否引导中 /// public bool IsGuiding { get { return curGroup != null && curGroup.IsGuiding; } } /// /// 控制地板点击 /// public bool IsControlFloor = false; /// /// 是否改名 /// public bool IsChangeName = true; /// /// 指定地板索引 /// public int FloorIndex = -1; /// /// 是否编队引导 /// public bool IsEditTeamGuide = false; public void Init() { EventManager.Instance.Register(EventManager.EventName.AllConfigLoad, InitData); } public void Update(float deltaTime) { if (!Instance.IsGuiding) return; if (!LevelManager.Instance.IsInLevel) return; if (null == LevelManager.Instance.CurrentLevel) return; if (!LevelManager.Instance.CurrentLevel.isInBattle) return; if (!LevelManager.Instance.CurrentLevel.IsPause()) return; AreaManager.instance.LogicUpdate(deltaTime); SkillManager.instance.playerSkillManager.LogicUpdate(deltaTime); } public void Release() { EventManager.Instance.Unregister(EventManager.EventName.AllConfigLoad, InitData); } /// /// 开始引导 /// public bool BeginGuide() { #if GUIDE if (IsGuiding) return false; try { foreach (var guide in dicGuideCfg) { int completeGroupId = (int)Actor.Instance.Logic.GetCount((uint)LogicID.NewGuideProgress); if (guide.Key > completeGroupId) { UIManager.Instance.IsEnableBack = false; DebugUtil.Log($"已完成的引导组id:{completeGroupId},开始引导组id:{guide.Key}"); curGroup = new(guide.Key, guide.Value); curGroup.BeginGuide(); return true; } } } catch (Exception e) { DebugUtil.LogError($"跳过引导,错误信息:{e}"); } #endif return false; } /// /// 完成指定引导步骤 /// /// public void CompleteStep(GuideStepBase step) { if (null == curGroup) return; if (step != curGroup.CurStep) { DebugUtil.LogError("要完成的引导步骤不是当前步骤"); EndGuide(true); return; } if (curGroup.IsComplete) { NetHelper.SaveGuideProgress((uint)curGroup.GroupId); // 完成引导组,保存服务器 DebugUtil.Log($"完成引导组,服务器保存组id:{curGroup.GroupId}"); int nextGroupId = curGroup.NextGroupId; if (dicGuideCfg.TryGetValue(nextGroupId, out LinkedList linkCfg)) { curGroup = new(nextGroupId, linkCfg, true); curGroup.BeginGuide(); } else EndGuide(false); } else { if (curGroup.CurStep.Cfg.IsComplete) { NetHelper.SaveGuideProgress((uint)curGroup.GroupId); // 完成引导组,保存服务器 DebugUtil.Log($"提前完成引导组,服务器保存组id:{curGroup.GroupId}"); } curGroup.BeginNextStep(); } } /// /// 回到指定步骤 /// /// public void ReturnStep(int stepId) { curGroup.EndGuide(); curGroup.BeginGuideById(stepId); } /// /// 结束引导 /// public void EndGuide(bool isReEnterMain) { if (IsGuiding) curGroup.EndGuide(); UIManager.Instance.IsEnableBack = true; curGroup = null; UIManager.Instance.CloseWindow(UINameConst.UI_Guide); UIManager.Instance.CloseWindow(UINameConst.UI_GuideTip); if (isReEnterMain) GameStateManager.Instance.ChangeState(new GameStateMainScene()); } /// /// 初始化数据 /// 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); if (0 == addCfg.NextId) addCfg = null; else if (addCfg.Id >= addCfg.NextId) throw new Exception($"{addCfg.Id}引导的下一步id配置错误,下一步id小于等于当前id可能导致死循环"); else 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}"); return; } else preCfg = cfg; } } #endregion } /// /// 是否是引导组的第一步 /// /// private bool IsFirstStep(DataGuideCfg dataGuideCfg) { return dataGuideCfg.Id == dataGuideCfg.GroupId; } } }