using cfg.GuideCfg;
using System;
using Cysharp.Threading.Tasks;
using Gameplay.Level;
using UnityEngine.UI;
using UnityEngine;
using Framework;
namespace Gameplay.Guide
{
///
/// 引导状态
///
public enum E_GuideState
{
///
/// 等待引导
///
Idle,
///
/// 引导中
///
Guiding,
///
/// 引导完成
///
Complete,
}
///
/// 引导步骤基类
///
public abstract class GuideStepBase
{
///
/// 引导完成类型
///
private readonly GuideCompleteBase completeBase;
///
/// 引导配置
///
public DataGuideCfg Cfg { get; private set; }
///
/// 引导状态
///
public E_GuideState GuideState { get; private set; }
///
/// 是否引导中
///
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.EnterStorylineLevelComplete => new EnterStorylineLevelComplete(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.FightMoveBeginComplete => new FightBeginMoveComplete(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.PreparaUseSkillComplete => new FightPreparaUseSkillComplete(Cfg, Complete),
E_GuideCompleteType.PreparaUsePlayerSkillComplete => new FightPreparaUsePlayerSkillComplete(Cfg, Complete),
E_GuideCompleteType.FightUseSkillComplete => new FightUseSkillComplete(Cfg, Complete),
E_GuideCompleteType.FightUsePlayerSkillComplete => new FightUsePlayerSkillComplete(Cfg, Complete),
E_GuideCompleteType.LevelComplete => new LevelComplete(Cfg, Complete),
E_GuideCompleteType.ClickGuideButton => new ClickGuideButtonComplete(Cfg, Complete),
E_GuideCompleteType.ClickFloorComplete => new ClickGuideFloorComplete(Cfg, Complete),
E_GuideCompleteType.FightStartButtonShowComplete => new WaitFightStartButtonShowComplete(Cfg, Complete),
E_GuideCompleteType.WaitPreparatShowComplete => new WaitPreparatShowComplete(Cfg, Complete),
E_GuideCompleteType.WaitEnemyRetreat => new WaitEnemyRetreatComplete(Cfg, Complete),
E_GuideCompleteType.WaitChangeName => new WaitChangeNameComplete(Cfg, Complete),
E_GuideCompleteType.WaitEditTeamComplete => new WaitEditTeamComplete(Cfg, Complete),
E_GuideCompleteType.AnyClickComplete => new AnyClickComplete(Cfg, Complete),
E_GuideCompleteType.SaveTeamComplete => new SaveTeamComplete(Cfg, Complete),
_ => throw new Exception($"未处理类型:{Cfg.GuideCompleteType}"),
};
}
///
/// 开始引导
///
public async void StartGuide()
{
DebugUtil.Log($"开始id为{Cfg.Id}的引导,延迟{Cfg.StepStartDelay}秒开始"); // #00FA9A绿色
await DoBeforeGuide();
GuideState = E_GuideState.Guiding;
await UniTask.Delay((int)(Cfg.StepStartDelay * 1000f)); // 延迟时间开始
DebugUtil.Log($"实际执行id为{Cfg.Id}的引导"); // #00FA9A绿色
DoGuide();
}
///
/// 完成引导
///
public void Complete()
{
if (!IsGuiding)
return;
DebugUtil.Log($"完成id为{Cfg.Id}的引导"); // #00FA9A绿色
GuideState = E_GuideState.Complete;
DoBeforeComplete();
GuideManager.Instance.CompleteStep(this);
}
///
/// 结束引导
///
public void EndGuide()
{
if (!IsGuiding)
return;
completeBase.RemoveListener();
GuideState = E_GuideState.Idle;
}
///
/// 引导开始之前
///
protected virtual async UniTask DoBeforeGuide()
{
await UI_GuideController.Open();
completeBase.AddListener();
}
///
/// 引导
///
protected abstract void DoGuide();
///
/// 引导完成之前
///
protected virtual void DoBeforeComplete()
{
completeBase.RemoveListener();
UIManager.Instance.CloseWindow(UINameConst.UI_Guide);
}
}
///
/// 点击按钮
///
internal sealed class ClickButtonStep : GuideStepBase
{
///
/// UI名
///
private readonly string uiName;
///
/// 按钮路径
///
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 DoGuide()
{
if (LevelManager.Instance.IsInLevel &&
null != LevelManager.Instance.CurrentLevel)
{
LevelManager.Instance.CurrentLevel.SetPause(true);
}
await UI_GuideController.Open(UI_GuideController.E_GuideArrowType.Button, uiName, buttonPath, Cfg);
}
}
///
/// 滑动按钮
///
internal sealed class SliderButtonStep : GuideStepBase
{
///
/// UI名
///
private readonly string uiName;
///
/// 按钮路径
///
private readonly string buttonPath;
///
/// 地板索引
///
private readonly int floorIndex;
public SliderButtonStep(DataGuideCfg cfg) : base(cfg)
{
if (cfg.GuideTypeParams.Length <= 1)
throw new Exception($"引导类型:{Cfg.GuideStepType},参数错误");
uiName = cfg.GuideTypeParams[0];
buttonPath = cfg.GuideTypeParams[1];
if (cfg.GuideTypeParams.Length > 2 && int.TryParse(cfg.GuideTypeParams[2], out int index))
floorIndex = index;
}
protected override async void DoGuide()
{
if (LevelManager.Instance.IsInLevel &&
null != LevelManager.Instance.CurrentLevel)
{
LevelManager.Instance.CurrentLevel.SetPause(true);
}
await UI_GuideController.Open(UI_GuideController.E_GuideArrowType.SliderButton, uiName, buttonPath, Cfg, floorIndex);
}
}
///
/// 点击地板
///
internal sealed class ClickFloorStep : GuideStepBase
{
///
/// 底板索引
///
private readonly int floorIndex;
public ClickFloorStep(DataGuideCfg cfg) : base(cfg)
{
if (cfg.GuideTypeParams.Length <= 0)
throw new Exception($"引导类型:{Cfg.GuideStepType},参数错误");
if (int.TryParse(cfg.GuideTypeParams[0], out int index))
floorIndex = index;
}
protected override async void DoGuide()
{
if (LevelManager.Instance.IsInLevel &&
null != LevelManager.Instance.CurrentLevel &&
LevelManager.Instance.CurrentLevel.isInBattle)
{
LevelManager.Instance.CurrentLevel.SetPause(true);
}
UIRoot.Instance.IsEnableGraphicRaycaster(false);
GuideManager.Instance.IsControlFloor = true;
GuideManager.Instance.FloorIndex = floorIndex;
await UI_GuideController.Open(floorIndex, Cfg);
}
}
///
/// 播放视频
///
internal sealed class PlayVideoStep : GuideStepBase
{
///
/// 视频路径
///
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);
}
}
///
/// 切换主场景状态
///
internal sealed class EnterMainStateStep : GuideStepBase
{
public EnterMainStateStep(DataGuideCfg cfg) : base(cfg)
{
}
protected override void DoGuide()
{
GameStateManager.Instance.ChangeState(new GameStateMainScene());
}
}
///
/// 显示引导提示
///
internal sealed class ShowGuideTipStep : GuideStepBase
{
///
/// 引导提示配置id
///
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);
}
}
///
/// 进入关卡
///
internal sealed class EnterLevelStep : GuideStepBase
{
///
/// 关卡id
///
private readonly int levelId;
///
/// 进入故事关卡后是否立即播放
///
private readonly bool isPlay;
public EnterLevelStep(DataGuideCfg cfg) : base(cfg)
{
if (Cfg.GuideTypeParams.Length < 1)
throw new Exception($"引导类型:{Cfg.GuideStepType},参数错误");
if (int.TryParse(Cfg.GuideTypeParams[0], out int id))
levelId = id;
if (Cfg.GuideTypeParams.Length > 1 && bool.TryParse(Cfg.GuideTypeParams[1], out bool isPlay))
this.isPlay = isPlay;
else
this.isPlay = true;
}
protected override void DoGuide()
{
LevelManager.Instance.TryEnterLevel(levelId, null, null, isPlay);
//var levelInfo = LevelManager.Instance.GetLevelInfoByID(levelId);
// if (!levelInfo.IsStory)
// LevelManager.Instance.PlayBGM();
}
}
///
/// 关卡上阵
///
internal sealed class LevelEmbattleStep : GuideStepBase
{
public LevelEmbattleStep(DataGuideCfg cfg) : base(cfg)
{
}
protected override async UniTask DoBeforeGuide()
{
await base.DoBeforeGuide();
UIWindow uiWindow = UIManager.Instance.GetOpenedWindowByPath(UINameConst.UI_StartBtn_CMSBtn);
if (null == uiWindow)
return;
Transform ts = uiWindow.gameObject.transform.Find("UIStartBtn/Image_UI_Start_BG/Button_StartBtn");
if (null == ts)
return;
Button btn = ts.GetComponent