2024-05-22 16:31:29 +08:00
|
|
|
|
using cfg.GuideCfg;
|
2024-05-22 15:41:05 +08:00
|
|
|
|
using Framework;
|
2024-05-29 13:04:51 +08:00
|
|
|
|
using Gameplay.SubSystems;
|
|
|
|
|
|
using Gameplay;
|
2024-05-22 15:41:05 +08:00
|
|
|
|
using PhxhSDK;
|
|
|
|
|
|
using System.Collections;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using UnityEngine;
|
2024-05-29 13:04:51 +08:00
|
|
|
|
using Cysharp.Threading.Tasks;
|
2024-05-22 15:41:05 +08:00
|
|
|
|
|
2024-05-29 16:36:30 +08:00
|
|
|
|
namespace Gameplay.Guide
|
2024-05-22 15:41:05 +08:00
|
|
|
|
{
|
2024-05-22 16:31:29 +08:00
|
|
|
|
/// <summary>
|
2024-05-29 16:36:30 +08:00
|
|
|
|
/// 新手引导管理器
|
2024-05-22 16:31:29 +08:00
|
|
|
|
/// </summary>
|
2024-05-29 16:36:30 +08:00
|
|
|
|
public class GuideManager : Singlenton<GuideManager>, IInitable
|
2024-05-24 19:11:19 +08:00
|
|
|
|
{
|
2024-05-29 16:36:30 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 新手引导配置字典,key:引导组,Value:引导步骤配置链表
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private Dictionary<int, LinkedList<DataGuideCfg>> dicGuideCfg;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 当前的引导组
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private GuideGroup curGroup;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 当前已完成引导步骤id(测试用)
|
|
|
|
|
|
/// </summary>
|
2024-06-03 19:36:47 +08:00
|
|
|
|
private int completeId = 0;
|
2024-05-29 16:36:30 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 是否启用新手引导
|
|
|
|
|
|
/// </summary>
|
2024-06-04 18:40:17 +08:00
|
|
|
|
public bool IsEnable = false;
|
2024-05-29 16:36:30 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 是否引导中
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool IsGuiding
|
2024-05-24 19:11:19 +08:00
|
|
|
|
{
|
2024-05-29 16:36:30 +08:00
|
|
|
|
get { return curGroup != null && curGroup.IsGuiding; }
|
2024-05-24 19:11:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-05-29 16:36:30 +08:00
|
|
|
|
public void Init()
|
2024-05-24 19:11:19 +08:00
|
|
|
|
{
|
2024-05-29 16:36:30 +08:00
|
|
|
|
EventManager.Instance.Register(EventManager.EventName.AllConfigLoad, InitData);
|
|
|
|
|
|
}
|
2024-05-29 13:04:51 +08:00
|
|
|
|
|
2024-05-29 16:36:30 +08:00
|
|
|
|
public void Release()
|
|
|
|
|
|
{
|
|
|
|
|
|
EventManager.Instance.Unregister(EventManager.EventName.AllConfigLoad, InitData);
|
2024-05-24 19:11:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-05-29 16:36:30 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 开始引导
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool BeginGuide()
|
2024-05-24 19:11:19 +08:00
|
|
|
|
{
|
2024-05-29 16:36:30 +08:00
|
|
|
|
if (!IsEnable)
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
if (IsGuiding)
|
|
|
|
|
|
return false;
|
2024-05-28 18:47:23 +08:00
|
|
|
|
|
2024-05-29 16:36:30 +08:00
|
|
|
|
foreach (var guide in dicGuideCfg)
|
2024-05-24 19:11:19 +08:00
|
|
|
|
{
|
2024-05-29 16:36:30 +08:00
|
|
|
|
if (guide.Key > completeId)
|
|
|
|
|
|
{
|
|
|
|
|
|
curGroup = new(guide.Key, guide.Value); // TODO 测试
|
|
|
|
|
|
curGroup.BeginGuide();
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
2024-05-24 19:11:19 +08:00
|
|
|
|
}
|
2024-05-29 16:36:30 +08:00
|
|
|
|
|
|
|
|
|
|
return false;
|
2024-05-24 19:11:19 +08:00
|
|
|
|
}
|
2024-05-24 15:07:50 +08:00
|
|
|
|
|
2024-05-29 16:36:30 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 完成指定引导步骤
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="step"></param>
|
|
|
|
|
|
public void CompleteStep(GuideStepBase step)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (null == curGroup)
|
|
|
|
|
|
return;
|
2024-05-29 13:04:51 +08:00
|
|
|
|
|
2024-05-29 16:36:30 +08:00
|
|
|
|
if (step != curGroup.CurStep)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("要完成的引导步骤不是当前步骤");
|
|
|
|
|
|
EndGuide(true);
|
2024-05-29 13:04:51 +08:00
|
|
|
|
|
2024-05-29 16:36:30 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
2024-05-29 13:04:51 +08:00
|
|
|
|
|
2024-05-29 16:36:30 +08:00
|
|
|
|
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();
|
|
|
|
|
|
}
|
2024-05-22 16:31:29 +08:00
|
|
|
|
|
2024-05-29 16:36:30 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 结束引导
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private void EndGuide(bool isReEnterMain)
|
2024-05-22 16:31:29 +08:00
|
|
|
|
{
|
2024-05-29 16:36:30 +08:00
|
|
|
|
if (IsGuiding)
|
|
|
|
|
|
curGroup.EndGuide();
|
2024-05-22 16:31:29 +08:00
|
|
|
|
|
2024-05-29 16:36:30 +08:00
|
|
|
|
curGroup = null;
|
|
|
|
|
|
UIManager.Instance.CloseWindow(UINameConst.UI_Guide);
|
|
|
|
|
|
UIManager.Instance.CloseWindow(UINameConst.UI_GuideTip);
|
2024-05-22 15:41:05 +08:00
|
|
|
|
|
2024-05-29 16:36:30 +08:00
|
|
|
|
if (isReEnterMain)
|
|
|
|
|
|
LoadingExecutorManager.Instance.ExecuteLoading(new MainSceneLoadingExecutor()).Forget();
|
2024-05-22 16:31:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-05-29 16:36:30 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 初始化数据
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private void InitData()
|
2024-05-22 16:31:29 +08:00
|
|
|
|
{
|
2024-05-29 16:36:30 +08:00
|
|
|
|
dicGuideCfg = new();
|
|
|
|
|
|
|
|
|
|
|
|
foreach (DataGuideCfg cfg in TableManager.Instance.Tables.GuideConfig.DataList)
|
2024-05-22 16:31:29 +08:00
|
|
|
|
{
|
2024-05-29 16:36:30 +08:00
|
|
|
|
if (dicGuideCfg.ContainsKey(cfg.GroupId) && !IsFirstStep(cfg))
|
2024-05-22 16:31:29 +08:00
|
|
|
|
continue;
|
2024-05-29 16:36:30 +08:00
|
|
|
|
|
|
|
|
|
|
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);
|
2024-05-22 16:31:29 +08:00
|
|
|
|
}
|
2024-05-29 16:36:30 +08:00
|
|
|
|
}
|
2024-05-22 16:31:29 +08:00
|
|
|
|
|
2024-05-29 16:36:30 +08:00
|
|
|
|
#region 检验每个引导组的步骤顺序是否正常
|
|
|
|
|
|
foreach (LinkedList<DataGuideCfg> linkCfg in dicGuideCfg.Values)
|
|
|
|
|
|
{
|
|
|
|
|
|
DataGuideCfg preCfg = null;
|
|
|
|
|
|
foreach (DataGuideCfg cfg in linkCfg)
|
2024-05-22 16:31:29 +08:00
|
|
|
|
{
|
2024-05-29 16:36:30 +08:00
|
|
|
|
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;
|
2024-05-22 16:31:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2024-05-29 16:36:30 +08:00
|
|
|
|
#endregion
|
2024-05-22 16:31:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-05-29 16:36:30 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 是否是引导组的第一步
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
private bool IsFirstStep(DataGuideCfg dataGuideCfg)
|
|
|
|
|
|
{
|
|
|
|
|
|
return dataGuideCfg.Id == dataGuideCfg.GroupId;
|
|
|
|
|
|
}
|
2024-05-22 15:41:05 +08:00
|
|
|
|
}
|
2024-05-24 19:11:19 +08:00
|
|
|
|
}
|