490 lines
14 KiB
C#
490 lines
14 KiB
C#
using cfg.GuideCfg;
|
|
using Gameplay.SubSystems;
|
|
using System;
|
|
using Cysharp.Threading.Tasks;
|
|
using Gameplay.Level;
|
|
using Framework;
|
|
|
|
namespace Gameplay.Guide
|
|
{
|
|
/// <summary>
|
|
/// 引导状态
|
|
/// </summary>
|
|
public enum E_GuideState
|
|
{
|
|
/// <summary>
|
|
/// 等待引导
|
|
/// </summary>
|
|
Idle,
|
|
/// <summary>
|
|
/// 引导中
|
|
/// </summary>
|
|
Guiding,
|
|
/// <summary>
|
|
/// 引导完成
|
|
/// </summary>
|
|
Complete,
|
|
}
|
|
|
|
/// <summary>
|
|
/// 引导步骤基类
|
|
/// </summary>
|
|
public abstract class GuideStepBase
|
|
{
|
|
/// <summary>
|
|
/// 引导完成类型
|
|
/// </summary>
|
|
private readonly GuideCompleteBase completeBase;
|
|
|
|
/// <summary>
|
|
/// 引导配置
|
|
/// </summary>
|
|
public DataGuideCfg Cfg { get; private set; }
|
|
|
|
/// <summary>
|
|
/// 引导状态
|
|
/// </summary>
|
|
public E_GuideState GuideState { get; private set; }
|
|
|
|
/// <summary>
|
|
/// 是否引导中
|
|
/// </summary>
|
|
public bool IsGuiding
|
|
{
|
|
get { return E_GuideState.Guiding == GuideState; }
|
|
}
|
|
|
|
public GuideStepBase(DataGuideCfg cfg)
|
|
{
|
|
Cfg = cfg;
|
|
|
|
GuideState = E_GuideState.Idle;
|
|
|
|
completeBase = Cfg.GuideCompleteType switch
|
|
{
|
|
E_GuideCompleteType.PlayVideoOver => new PlayVideoComplete(Cfg, Complete),
|
|
E_GuideCompleteType.OpenUI => new OpenUIComplete(Cfg, Complete),
|
|
E_GuideCompleteType.CloseUI => new CloseUIComplete(Cfg, Complete),
|
|
E_GuideCompleteType.OpenUIAndAnim => new OpenUIAndAnimComplete(Cfg, Complete),
|
|
E_GuideCompleteType.EnterFightLevelComplete => new EnterFightLevelComplete(Cfg, Complete),
|
|
E_GuideCompleteType.EmbattleComplete => new LevelEmbattleComplete(Cfg, Complete),
|
|
E_GuideCompleteType.EmbattleVehicleComplete => new LevelEmbattleComplete(Cfg, Complete),
|
|
E_GuideCompleteType.FightBegin => new FightBeginComplete(Cfg, Complete),
|
|
E_GuideCompleteType.FightMoveComplete => new FightMoveComplete(Cfg, Complete),
|
|
E_GuideCompleteType.FightAttackComplete => new FightAttackComplete(Cfg, Complete),
|
|
E_GuideCompleteType.FightEmbattleComplete => new FightEmbattleComplete(Cfg, Complete),
|
|
E_GuideCompleteType.FightMoraleAndRepressionComplete => new FightMoraleAndRepressionComplete(Cfg, Complete),
|
|
E_GuideCompleteType.FightUseSkillComplete => new FightUseSkillComplete(Cfg, Complete),
|
|
E_GuideCompleteType.LevelComplete => new LevelComplete(Cfg, Complete),
|
|
E_GuideCompleteType.SelectModel => new SelectModeComplete(Cfg, Complete),
|
|
E_GuideCompleteType.SelectChapter => new SelectChapterComplete(Cfg, Complete),
|
|
E_GuideCompleteType.OpenCommandSkill => new OpenCommandSkillComplete(Cfg, Complete),
|
|
E_GuideCompleteType.CloseCommandSkill => new CloseCommandSkillComplete(Cfg, Complete),
|
|
E_GuideCompleteType.CharacterLevelUp => new CharacterLevelUpComplete(Cfg, Complete),
|
|
E_GuideCompleteType.ClickGuideButton => new ClickGuideButtonComplete(Cfg, Complete),
|
|
_ => throw new Exception($"未处理类型:{Cfg.GuideCompleteType}"),
|
|
};
|
|
}
|
|
|
|
/// <summary>
|
|
/// 开始引导
|
|
/// </summary>
|
|
public async void StartGuide()
|
|
{
|
|
DebugUtil.Log($"<color=#00FA9A>开始id为{Cfg.Id}的引导</color>"); // #00FA9A绿色
|
|
|
|
DoBeforeGuide();
|
|
|
|
GuideState = E_GuideState.Guiding;
|
|
|
|
await UniTask.Delay((int)(Cfg.StepStartDelay * 1000f)); // 延迟时间开始
|
|
|
|
DebugUtil.Log($"<color=#00FA9A>实际执行id为{Cfg.Id}的引导</color>"); // #00FA9A绿色
|
|
|
|
DoGuide();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 完成引导
|
|
/// </summary>
|
|
public void Complete()
|
|
{
|
|
if (!IsGuiding)
|
|
return;
|
|
|
|
DebugUtil.Log($"<color=#00FA9A>完成id为{Cfg.Id}的引导</color>"); // #00FA9A绿色
|
|
|
|
GuideState = E_GuideState.Complete;
|
|
DoBeforeComplete();
|
|
GuideManager.Instance.CompleteStep(this);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 结束引导
|
|
/// </summary>
|
|
public void EndGuide()
|
|
{
|
|
if (!IsGuiding)
|
|
return;
|
|
|
|
GuideState = E_GuideState.Idle;
|
|
completeBase.RemoveListener();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 引导开始之前
|
|
/// </summary>
|
|
protected virtual void DoBeforeGuide()
|
|
{
|
|
completeBase.AddListener();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 引导
|
|
/// </summary>
|
|
protected abstract void DoGuide();
|
|
|
|
/// <summary>
|
|
/// 引导完成之前
|
|
/// </summary>
|
|
protected virtual void DoBeforeComplete()
|
|
{
|
|
completeBase.RemoveListener();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 点击按钮
|
|
/// </summary>
|
|
internal sealed class ClickButtonStep : GuideStepBase
|
|
{
|
|
/// <summary>
|
|
/// UI名
|
|
/// </summary>
|
|
private readonly string uiName;
|
|
/// <summary>
|
|
/// 按钮路径
|
|
/// </summary>
|
|
private readonly string buttonPath;
|
|
|
|
public ClickButtonStep(DataGuideCfg cfg) : base(cfg)
|
|
{
|
|
if (cfg.GuideTypeParams.Length <= 1)
|
|
throw new Exception($"引导类型:{Cfg.GuideStepType},参数错误");
|
|
|
|
uiName = cfg.GuideTypeParams[0];
|
|
buttonPath = cfg.GuideTypeParams[1];
|
|
}
|
|
|
|
protected override async void DoBeforeGuide()
|
|
{
|
|
await UI_GuideController.Open();
|
|
|
|
base.DoBeforeGuide();
|
|
}
|
|
|
|
protected override async void DoGuide()
|
|
{
|
|
await UI_GuideController.Open(uiName, buttonPath, Cfg);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 播放视频
|
|
/// </summary>
|
|
internal sealed class PlayVideoStep : GuideStepBase
|
|
{
|
|
/// <summary>
|
|
/// 视频路径
|
|
/// </summary>
|
|
private readonly string videoPath;
|
|
|
|
public PlayVideoStep(DataGuideCfg cfg) : base(cfg)
|
|
{
|
|
if (cfg.GuideTypeParams.Length <= 0)
|
|
throw new Exception($"引导类型:{Cfg.GuideStepType},参数错误");
|
|
|
|
videoPath = cfg.GuideTypeParams[0];
|
|
}
|
|
|
|
protected override async void DoGuide()
|
|
{
|
|
UIManager.Instance.CloseWindow(UINameConst.UI_Guide);
|
|
await UI_PlayVideoController.Open(videoPath);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 播放剧情
|
|
/// </summary>
|
|
internal sealed class PlayStorylineStep : GuideStepBase
|
|
{
|
|
/// <summary>
|
|
/// 剧情关卡id
|
|
/// </summary>
|
|
private readonly int levelId;
|
|
|
|
public PlayStorylineStep(DataGuideCfg cfg) : base(cfg)
|
|
{
|
|
if (cfg.GuideTypeParams.Length <= 0)
|
|
throw new Exception($"引导id:{Cfg.Id}, 引导类型:{Cfg.GuideStepType}, 参数错误");
|
|
|
|
if (int.TryParse(cfg.GuideTypeParams[0], out int id))
|
|
levelId = id;
|
|
}
|
|
|
|
protected override void DoGuide()
|
|
{
|
|
LevelManager.Instance.TryEnterLevel(levelId);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 第一次进入主界面
|
|
/// </summary>
|
|
internal sealed class EnterMainStep : GuideStepBase
|
|
{
|
|
public EnterMainStep(DataGuideCfg cfg) : base(cfg)
|
|
{
|
|
}
|
|
|
|
protected override void DoGuide()
|
|
{
|
|
GameStateManager.Instance.ChangeState(new GameStateMainScene());
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 显示引导提示
|
|
/// </summary>
|
|
internal sealed class ShowGuideTipStep : GuideStepBase
|
|
{
|
|
/// <summary>
|
|
/// 引导提示配置id
|
|
/// </summary>
|
|
private readonly int guideTipCfgId;
|
|
|
|
public ShowGuideTipStep(DataGuideCfg cfg) : base(cfg)
|
|
{
|
|
if (cfg.GuideTypeParams.Length <= 0)
|
|
throw new Exception($"引导类型:{Cfg.GuideStepType},参数错误");
|
|
|
|
if (int.TryParse(cfg.GuideTypeParams[0], out int id))
|
|
guideTipCfgId = id;
|
|
}
|
|
|
|
protected override async void DoGuide()
|
|
{
|
|
await UI_GuideTipController.Open(guideTipCfgId);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 进入关卡
|
|
/// </summary>
|
|
internal sealed class EnterLevelStep : GuideStepBase
|
|
{
|
|
/// <summary>
|
|
/// 关卡id
|
|
/// </summary>
|
|
private readonly int levelId;
|
|
|
|
public EnterLevelStep(DataGuideCfg cfg) : base(cfg)
|
|
{
|
|
if (Cfg.GuideTypeParams.Length <= 0)
|
|
throw new Exception($"引导类型:{Cfg.GuideStepType},参数错误");
|
|
|
|
if (int.TryParse(Cfg.GuideTypeParams[0], out int id))
|
|
levelId = id;
|
|
}
|
|
|
|
protected override void DoGuide()
|
|
{
|
|
LevelManager.Instance.TryEnterLevel(levelId);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 关卡上阵
|
|
/// </summary>
|
|
internal sealed class LevelEmbattleStep : GuideStepBase
|
|
{
|
|
public LevelEmbattleStep(DataGuideCfg cfg) : base(cfg)
|
|
{
|
|
|
|
}
|
|
|
|
protected override void DoGuide()
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 教学战斗移动
|
|
/// </summary>
|
|
internal sealed class TeachFightMoveStep : GuideStepBase
|
|
{
|
|
/// <summary>
|
|
/// 引导提示配置id
|
|
/// </summary>
|
|
private readonly int guideTipCfgId;
|
|
|
|
public TeachFightMoveStep(DataGuideCfg cfg) : base(cfg)
|
|
{
|
|
if (cfg.GuideTypeParams.Length <= 0)
|
|
throw new Exception($"引导类型:{Cfg.GuideStepType},参数错误");
|
|
|
|
if (int.TryParse(cfg.GuideTypeParams[0], out int id))
|
|
guideTipCfgId = id;
|
|
}
|
|
|
|
protected override async void DoGuide()
|
|
{
|
|
LevelManager.Instance.CurrentLevel.SetPause(true);
|
|
await UI_GuideTipController.Open(guideTipCfgId);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 教学战斗攻击
|
|
/// </summary>
|
|
internal sealed class TeachFightAttackStep : GuideStepBase
|
|
{
|
|
/// <summary>
|
|
/// 引导提示配置id
|
|
/// </summary>
|
|
private readonly int guideTipCfgId;
|
|
|
|
public TeachFightAttackStep(DataGuideCfg cfg) : base(cfg)
|
|
{
|
|
if (cfg.GuideTypeParams.Length <= 0)
|
|
throw new Exception($"引导类型:{Cfg.GuideStepType},参数错误");
|
|
|
|
if (int.TryParse(cfg.GuideTypeParams[0], out int id))
|
|
guideTipCfgId = id;
|
|
}
|
|
|
|
protected override async void DoGuide()
|
|
{
|
|
LevelManager.Instance.CurrentLevel.SetPause(true);
|
|
await UI_GuideTipController.Open(guideTipCfgId);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 教学士气与压制
|
|
/// </summary>
|
|
internal sealed class TeachMoraleAndRepression : GuideStepBase
|
|
{
|
|
/// <summary>
|
|
/// 引导提示配置id
|
|
/// </summary>
|
|
private readonly int guideTipCfgId;
|
|
|
|
public TeachMoraleAndRepression(DataGuideCfg cfg) : base(cfg)
|
|
{
|
|
if (cfg.GuideTypeParams.Length <= 0)
|
|
throw new Exception($"引导类型:{Cfg.GuideStepType},参数错误");
|
|
|
|
if (int.TryParse(cfg.GuideTypeParams[0], out int id))
|
|
guideTipCfgId = id;
|
|
}
|
|
|
|
protected override async void DoGuide()
|
|
{
|
|
LevelManager.Instance.CurrentLevel.SetPause(true);
|
|
await UI_GuideTipController.Open(guideTipCfgId);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 教学使用技能
|
|
/// </summary>
|
|
internal sealed class TeachUseSkill : GuideStepBase
|
|
{
|
|
/// <summary>
|
|
/// 引导提示配置id
|
|
/// </summary>
|
|
private readonly int guideTipCfgId;
|
|
|
|
public TeachUseSkill(DataGuideCfg cfg) : base(cfg)
|
|
{
|
|
if (cfg.GuideTypeParams.Length <= 0)
|
|
throw new Exception($"引导类型:{Cfg.GuideStepType},参数错误");
|
|
|
|
if (int.TryParse(cfg.GuideTypeParams[0], out int id))
|
|
guideTipCfgId = id;
|
|
}
|
|
|
|
protected override async void DoGuide()
|
|
{
|
|
LevelManager.Instance.CurrentLevel.SetPause(true);
|
|
await UI_GuideTipController.Open(guideTipCfgId);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 教学战斗中上阵
|
|
/// </summary>
|
|
internal sealed class TeachFightEmbattle : GuideStepBase
|
|
{
|
|
/// <summary>
|
|
/// 引导提示配置id
|
|
/// </summary>
|
|
private readonly int guideTipCfgId;
|
|
|
|
public TeachFightEmbattle(DataGuideCfg cfg) : base(cfg)
|
|
{
|
|
if (cfg.GuideTypeParams.Length <= 0)
|
|
throw new Exception($"引导类型:{Cfg.GuideStepType},参数错误");
|
|
|
|
if (int.TryParse(cfg.GuideTypeParams[0], out int id))
|
|
guideTipCfgId = id;
|
|
}
|
|
|
|
protected override async void DoGuide()
|
|
{
|
|
LevelManager.Instance.CurrentLevel.SetPause(true);
|
|
await UI_GuideTipController.Open(guideTipCfgId);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 等待关卡结束
|
|
/// </summary>
|
|
internal sealed class WaitLevelComplete : GuideStepBase
|
|
{
|
|
private readonly bool isContinue;
|
|
|
|
public WaitLevelComplete(DataGuideCfg cfg) : base(cfg)
|
|
{
|
|
if (cfg.GuideTypeParams.Length <= 0)
|
|
throw new Exception($"引导类型:{Cfg.GuideStepType},参数错误");
|
|
|
|
if (bool.TryParse(cfg.GuideTypeParams[0], out bool isContinue))
|
|
this.isContinue = isContinue;
|
|
}
|
|
|
|
protected override void DoGuide()
|
|
{
|
|
LevelManager.Instance.ExitLevelChangeMainFunc = () => { return isContinue; };
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 关卡载具上阵
|
|
/// </summary>
|
|
internal sealed class LevelVehicleEmbattleStep : GuideStepBase
|
|
{
|
|
public LevelVehicleEmbattleStep(DataGuideCfg cfg) : base(cfg)
|
|
{
|
|
|
|
}
|
|
|
|
protected override void DoGuide()
|
|
{
|
|
|
|
}
|
|
}
|
|
} |