using cfg.StoryCfg; using Cysharp.Threading.Tasks; using Framework; using Gameplay; using Gameplay.Common; using Gameplay.Effect; using Gameplay.Guide; using Gameplay.Level; using Gameplay.Story; using Gameplay.SubSystems; using PhxhSDK; namespace Code.Scripts.Gameplay.Game { public class GameStateStory : IState { private readonly cfg.StoryCfg.DataStoryMain _storyConfig; public cfg.StoryCfg.DataStoryMain storyConfig { get { return _storyConfig; } } private bool _isReady; /// /// 记录剧情关卡加载完成后是否立即播放 /// private bool _autoPlay; private bool _needExit; public bool IsReady { set { _isReady = value; } } public GameStateStory(string storyId, bool autoPlay = true) { _storyConfig = TableManager.Instance.Tables.StoryMainConfig.Get(storyId); _autoPlay = autoPlay; EventManager.Instance.Register(EventManager.EventName.LoadingExecutorComplete, OnLoadingExecutorComplete); } public GameStateStory(DataStoryMain storyConfig) { _storyConfig = storyConfig; _autoPlay = true; EventManager.Instance.Register(EventManager.EventName.LoadingExecutorComplete, OnLoadingExecutorComplete); } public void OnEnter() { _needExit = false; _isReady = false; EventManager.Instance.Register(EventManager.EventName.STORY_CLICK_SKIP, _OnRecvExit); LoadingManager.Instance.ExecuteLoading(new StoryLoadingExecutor(_storyConfig)).Forget(); EventManager.Instance.Send(EventManager.EventName.Guide_ChangeStoryState); } public void OnUpdate(float deltaTime) { if (_needExit) return; if (!_isReady) return; StoryManager.instance.LogicUpdate(deltaTime); } private void _OnRecvExit() { EventManager.Instance.Unregister(EventManager.EventName.STORY_CLICK_SKIP, _OnRecvExit); _needExit = true; if (LevelManager.Instance.IsInLevel) LevelManager.Instance.TryExitLevel(true); else GameStateManager.Instance.ChangeState(new GameStateMainScene()); } private void OnLoadingExecutorComplete() { _isReady = _autoPlay; } public void OnExit() { EventManager.Instance.Unregister(EventManager.EventName.LoadingExecutorComplete, OnLoadingExecutorComplete); StoryManager.instance.DisposeForGame(); EffectManager.instance.ClearPool(); GameSceneManager.Instance.UnLoadSceneAsync(_storyConfig.ScenePath).Forget(); AssetManager.Instance.Unload(PathDefine.Story.STORY_HEAD_CAMERA_PATH); } } }