using cfg.GuideCfg; using cfg.LevelCfg; using Cysharp.Threading.Tasks; using Framework; using Gameplay.Level; using NLDPB; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; namespace Gameplay.Guide { /// /// 新手引导步骤完成基类 /// public abstract class GuideCompleteBase { /// /// 引导完成回调 /// private readonly Action completeAction; /// /// 引导完成类型 /// public E_GuideCompleteType CompleteType { get; private set; } public GuideCompleteBase(DataGuideCfg cfg, Action complete) { CompleteType = cfg.GuideCompleteType; completeAction = complete; } /// /// 添加监听 /// public abstract void AddListener(); /// /// 移除监听 /// public abstract void RemoveListener(); public virtual void Complete() { completeAction?.Invoke(); } } /// /// 播放视频完成 /// internal sealed class PlayVideoComplete : GuideCompleteBase { /// /// 视频路径 /// private readonly string videoPath; public PlayVideoComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { if (cfg.CompleteTypeParams.Length <= 0) throw new Exception($"引导类型:{cfg.GuideCompleteType}参数错误"); videoPath = cfg.CompleteTypeParams[0]; } public override void AddListener() { EventManager.Instance.Register(EventManager.EventName.PlayVideoComplete, (Action)OnPlayVideoComplete); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.PlayVideoComplete, (Action)OnPlayVideoComplete); } /// /// 播放视频完成回调 /// /// private void OnPlayVideoComplete(string path) { if (path != videoPath) return; Complete(); } } /// /// 打开UI完成 /// internal sealed class OpenUIComplete : GuideCompleteBase { private readonly string uiName; public OpenUIComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { if (cfg.CompleteTypeParams.Length <= 0) throw new Exception($"引导类型:{cfg.GuideCompleteType}参数错误"); uiName = cfg.CompleteTypeParams[0]; } public override void AddListener() { EventManager.Instance.Register(EventManager.EventName.UIOpen, (Action)OnComplete); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.UIOpen, (Action)OnComplete); } private void OnComplete(string uiName) { if (this.uiName != uiName) return; Complete(); } } /// /// 关闭UI完成 /// internal sealed class CloseUIComplete : GuideCompleteBase { private readonly string uiName; public CloseUIComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { if (cfg.CompleteTypeParams.Length <= 0) throw new Exception($"引导类型:{cfg.GuideCompleteType}参数错误"); uiName = cfg.CompleteTypeParams[0]; } public override void AddListener() { EventManager.Instance.Register(EventManager.EventName.UIClose, (Action)OnComplete); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.UIClose, (Action)OnComplete); } private void OnComplete(string uiName) { if (this.uiName != uiName) return; Complete(); } } /// /// 打开UI并且UI动画播放完成 /// internal sealed class OpenUIAndAnimComplete : GuideCompleteBase { private readonly string uiName; public OpenUIAndAnimComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { if (cfg.CompleteTypeParams.Length <= 0) throw new Exception($"引导类型:{cfg.GuideCompleteType}参数错误"); uiName = cfg.CompleteTypeParams[0]; } public override void AddListener() { EventManager.Instance.Register(EventManager.EventName.UIOpenAndAnim, (Action)OnComplete); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.UIOpenAndAnim, (Action)OnComplete); } private void OnComplete(string uiName) { if (this.uiName != uiName) return; Complete(); } } /// /// 进入战斗关卡完成 /// internal sealed class EnterFightLevelComplete : GuideCompleteBase { /// /// 需要打开的战斗UI数量 /// private const int OPEN_FIGHT_UI_COUNT = 4; /// /// 关卡id /// private readonly int levelId; /// /// 需要打开的UICount数量 /// private int uiOpenCount; public EnterFightLevelComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { uiOpenCount = 0; if (cfg.CompleteTypeParams.Length <= 0) throw new Exception($"引导类型:{cfg.GuideCompleteType},参数错误"); if (int.TryParse(cfg.CompleteTypeParams[0], out int id)) levelId = id; } public override void AddListener() { EventManager.Instance.Register(EventManager.EventName.UIOpen, OnOpenUI); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.UIOpen, OnOpenUI); } private void OnOpenUI(string uiName) { if (UINameConst.UI_StartBtn_CMSBtn != uiName && UINameConst.UITeamFight != uiName && UINameConst.UIFightClock != uiName && UINameConst.UIFightScene != uiName) return; ++uiOpenCount; if (OPEN_FIGHT_UI_COUNT >= uiOpenCount) OnComplete(levelId); } private async void OnComplete(int levelId) { if (this.levelId != levelId) return; await UniTask.Delay(3000); // 延迟3秒 UIManager.Instance.CloseWindow(UINameConst.UI_Guide); Complete(); } } /// /// 关卡上阵完成 /// internal sealed class LevelEmbattleComplete : GuideCompleteBase { /// /// 上阵数量 /// private readonly int embattleCount; public LevelEmbattleComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { if (cfg.CompleteTypeParams.Length <= 0) throw new Exception($"引导类型:{cfg.GuideCompleteType},参数错误"); if (int.TryParse(cfg.CompleteTypeParams[0], out int count)) embattleCount = count; } public override void AddListener() { EventManager.Instance.Register(EventManager.EventName.LevelFightStartChange, OnStartChange); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.LevelFightStartChange, OnStartChange); } private void OnStartChange() { if (TeamManager.Instance.GetFightList().Count >= embattleCount) Complete(); } } /// /// 关卡载具上阵完成 /// internal sealed class LevelVehicleEmbattleComplete : GuideCompleteBase { /// /// 上阵数量 /// private readonly int embattleCount; public LevelVehicleEmbattleComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { if (cfg.CompleteTypeParams.Length <= 0) throw new Exception($"引导类型:{cfg.GuideCompleteType},参数错误"); if (int.TryParse(cfg.CompleteTypeParams[0], out int count)) embattleCount = count; } public override void AddListener() { EventManager.Instance.Register(EventManager.EventName.LevelFightStartChange, OnStartChange); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.LevelFightStartChange, OnStartChange); } private void OnStartChange() { if (TeamManager.Instance.GetFightList().Count >= embattleCount) Complete(); } } /// /// 战斗开始完成 /// internal sealed class FightBeginComplete : GuideCompleteBase { public FightBeginComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { } public override void AddListener() { EventManager.Instance.Register(EventManager.EventName.UIPreLevelBattleBegin, Complete); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.UIPreLevelBattleBegin, Complete); } public override void Complete() { LevelManager.Instance.CurrentLevel.SetPause(true); base.Complete(); } } /// /// 教学战斗角色移动完成 /// internal sealed class FightMoveComplete : GuideCompleteBase { public FightMoveComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { } public override void AddListener() { EventManager.Instance.Register(EventManager.EventName.INFIGHT_OP_SET_MOVEPOS, Complete); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_OP_SET_MOVEPOS, Complete); } public override void Complete() { LevelManager.Instance.CurrentLevel.SetPause(false); base.Complete(); } } /// /// 教学战斗角色攻击完成 /// internal sealed class FightAttackComplete : GuideCompleteBase { public FightAttackComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { } public override void AddListener() { EventManager.Instance.Register(EventManager.EventName.INFIGHT_OP_SET_TARGET, Complete); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_OP_SET_TARGET, Complete); } public override void Complete() { LevelManager.Instance.CurrentLevel.SetPause(false); base.Complete(); } } /// /// 教学战斗角色释放技能完成 /// internal sealed class FightUseSkillComplete : GuideCompleteBase { public FightUseSkillComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { } public override void AddListener() { //EventManager.Instance.Register(EventManager.EventName.INFIGHT_PLAYER_SKILL_RELEASE, Complete); EventManager.Instance.Register(EventManager.EventName.UI_START_USE_SKILL, Complete); } public override void RemoveListener() { //EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_PLAYER_SKILL_RELEASE, Complete); EventManager.Instance.Unregister(EventManager.EventName.UI_START_USE_SKILL, Complete); } public override void Complete() { LevelManager.Instance.CurrentLevel.SetPause(false); base.Complete(); } } /// /// 教学战斗上阵完成 /// internal sealed class FightEmbattleComplete : GuideCompleteBase { public FightEmbattleComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { } public override void AddListener() { EventManager.Instance.Register(EventManager.EventName.INFIGHT_UNIT_READY, Complete); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_UNIT_READY, Complete); } public override void Complete() { LevelManager.Instance.CurrentLevel.SetPause(false); base.Complete(); } } /// /// 教学士气与压制完成 /// internal sealed class FightMoraleAndRepressionComplete : GuideCompleteBase { public FightMoraleAndRepressionComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { } public override void AddListener() { EventManager.Instance.Register(EventManager.EventName.UIClose, (Action)OnComplete); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.UIClose, (Action)OnComplete); } public void OnComplete(string uiName) { if (UINameConst.UI_GuideTip != uiName) return; LevelManager.Instance.CurrentLevel.SetPause(false); Complete(); } } /// /// 关卡完成 /// internal sealed class LevelComplete : GuideCompleteBase { public LevelComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { } public override void AddListener() { EventManager.Instance.Register(EventManager.EventName.GuideExitLevel, Complete); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.GuideExitLevel, Complete); } } /// /// 选择模式完成 /// internal sealed class SelectModeComplete : GuideCompleteBase { public SelectModeComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { } public override void AddListener() { EventManager.Instance.Register(EventManager.EventName.GuideSelectMode, Complete); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.GuideSelectMode, Complete); } } /// /// 选择章节完成 /// internal sealed class SelectChapterComplete : GuideCompleteBase { public SelectChapterComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { } public override void AddListener() { EventManager.Instance.Register(EventManager.EventName.GuideSelectChapter, Complete); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.GuideSelectChapter, Complete); } } /// /// 打开指挥官技能选择 /// internal sealed class OpenCommandSkillComplete : GuideCompleteBase { public OpenCommandSkillComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { } public override void AddListener() { EventManager.Instance.Register(EventManager.EventName.GuideOpenCommandSkill, (Action)OnComplete); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.GuideOpenCommandSkill, (Action)OnComplete); } private void OnComplete(bool isOpen) { if (!isOpen) return; Complete(); } } /// /// 关闭指挥官技能选择 /// internal sealed class CloseCommandSkillComplete : GuideCompleteBase { public CloseCommandSkillComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { } public override void AddListener() { EventManager.Instance.Register(EventManager.EventName.GuideOpenCommandSkill, (Action)OnComplete); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.GuideOpenCommandSkill, (Action)OnComplete); } private void OnComplete(bool isOpen) { if (isOpen) return; Complete(); } } /// /// 点击引导按钮完成 /// internal sealed class ClickGuideButtonComplete : GuideCompleteBase { public ClickGuideButtonComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { } public override void AddListener() { EventManager.Instance.Register(EventManager.EventName.GuideClickButton, Complete); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.GuideClickButton, Complete); } } /// /// 角色升级完成 /// internal sealed class CharacterLevelUpComplete : GuideCompleteBase { public CharacterLevelUpComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { } public override void AddListener() { EventManager.Instance.Register(EventManager.EventName.EN_CharacterLevelUp, (Action)OnComplete); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.EN_CharacterLevelUp, (Action)OnComplete); } private void OnComplete(UpgradeType upgradeType) { if (UpgradeType.UtLevel != upgradeType) return; Complete(); } } }