NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Guide/GuideManager.cs

188 lines
5.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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;
namespace Gameplay.Guide
{
/// <summary>
/// 新手引导管理器
/// </summary>
public class GuideManager : Singlenton<GuideManager>, IInitable
{
/// <summary>
/// 新手引导配置字典key引导组Value引导步骤配置链表
/// </summary>
private Dictionary<int, LinkedList<DataGuideCfg>> dicGuideCfg;
/// <summary>
/// 当前的引导组
/// </summary>
private GuideGroup curGroup;
/// <summary>
/// 当前已完成引导步骤id(测试用)
/// </summary>
private int completeId = 299;
/// <summary>
/// 是否启用新手引导
/// </summary>
public bool IsEnable = false;
/// <summary>
/// 是否引导中
/// </summary>
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);
}
/// <summary>
/// 开始引导
/// </summary>
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;
}
/// <summary>
/// 完成指定引导步骤
/// </summary>
/// <param name="step"></param>
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<DataGuideCfg> linkCfg))
{
curGroup = new(nextGroupId, linkCfg);
curGroup.BeginGuide();
}
else
EndGuide(false);
}
else
curGroup.BeginNextStep();
}
/// <summary>
/// 结束引导
/// </summary>
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();
}
/// <summary>
/// 初始化数据
/// </summary>
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<DataGuideCfg> 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<DataGuideCfg> 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
}
/// <summary>
/// 是否是引导组的第一步
/// </summary>
/// <returns></returns>
private bool IsFirstStep(DataGuideCfg dataGuideCfg)
{
return dataGuideCfg.Id == dataGuideCfg.GroupId;
}
}
}