using cfg.GuideCfg; using Framework; using Gameplay.Level; using NLDPB; using System; using UnityEngine; using UnityEngine.UI; 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(); } } #region UI /// /// 打开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(); } } #endregion #region 关卡战斗 /// /// 进入战斗关卡完成 /// internal sealed class EnterFightLevelComplete : GuideCompleteBase { private bool isChangeLevelState; private bool isLoadingExecutor; private bool isLoadingClose; public EnterFightLevelComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { isChangeLevelState = false; isLoadingExecutor = false; isLoadingClose = false; } public override void AddListener() { EventManager.Instance.Register(EventManager.EventName.Guide_ChangeLevelState, OnChangeLevelState); EventManager.Instance.Register(EventManager.EventName.GuideLoadingExecutor, OnLoadingExecutor); EventManager.Instance.Register(EventManager.EventName.UIClose, (Action)OnLoadingClose); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.UIClose, (Action)OnLoadingClose); EventManager.Instance.Unregister(EventManager.EventName.GuideLoadingExecutor, OnLoadingExecutor); EventManager.Instance.Unregister(EventManager.EventName.Guide_ChangeLevelState, OnChangeLevelState); } private void OnChangeLevelState() { isChangeLevelState = true; CheckComplete(); } private void OnLoadingExecutor() { isLoadingExecutor = true; CheckComplete(); } private void OnLoadingClose(string uiName) { if (UINameConst.UI_Loading != uiName) return; isLoadingClose = true; CheckComplete(); } private void CheckComplete() { if (!isChangeLevelState) return; if (!isLoadingExecutor) return; if (!isLoadingClose) return; Complete(); } } /// /// 进入故事关卡完成 /// internal sealed class EnterStorylineLevelComplete : GuideCompleteBase { private bool isChangeStoryState; private bool isLoadingExecutor; private bool isLoadingClose; public EnterStorylineLevelComplete(DataGuideCfg cfg, Action complete) : base(cfg, complete) { isChangeStoryState = false; isLoadingExecutor = false; isLoadingClose = false; } public override void AddListener() { EventManager.Instance.Register(EventManager.EventName.Guide_ChangeStoryState, OnChangeStoryState); EventManager.Instance.Register(EventManager.EventName.GuideLoadingExecutor, OnLoadingExecutor); EventManager.Instance.Register(EventManager.EventName.UIClose, (Action)OnLoadingClose); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.UIClose, (Action)OnLoadingClose); EventManager.Instance.Unregister(EventManager.EventName.GuideLoadingExecutor, OnLoadingExecutor); EventManager.Instance.Unregister(EventManager.EventName.Guide_ChangeStoryState, OnChangeStoryState); } private void OnChangeStoryState() { isChangeStoryState = true; CheckComplete(); } private void OnLoadingExecutor() { isLoadingExecutor = true; CheckComplete(); } private void OnLoadingClose(string uiName) { if (UINameConst.UI_Loading != uiName) return; isLoadingClose = true; CheckComplete(); } private void CheckComplete() { if (!isChangeStoryState) return; if (!isLoadingExecutor) return; if (!isLoadingClose) return; Complete(); } } #endregion /// /// 关卡上阵完成 /// 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.UIOpen, (Action)OnOpenUIPause); EventManager.Instance.Register(EventManager.EventName.GuideExitLevel, Complete); } public override void RemoveListener() { EventManager.Instance.Unregister(EventManager.EventName.GuideExitLevel, Complete); EventManager.Instance.Unregister(EventManager.EventName.UIOpen, (Action)OnOpenUIPause); } private void OnOpenUIPause(string uiName) { if (UINameConst.UIPause != uiName) return; UIWindow uiWindow = UIManager.Instance.GetOpenedWindowByPath(UINameConst.UIPause); if (null == uiWindow) return; Transform ts = uiWindow.gameObject.transform.Find("UI_MainPause/UIRetreatAndReturn/Button_Retreat"); if (null == ts) return; Button btn = ts.GetComponent