using System; using System.Collections; using System.Collections.Generic; using Cysharp.Threading.Tasks; using DragonSoul.Shared; using Mono.Event; using UnityEngine; using UnityEngine.Playables; using UnityEngine.UI; namespace UnityTest.ZXL { public class FirstProcess : ProcessBase { public override ProcessType processType => ProcessType.一_爆炸发生场景; protected override void OnInit() { base.OnInit(); StartAsync().Coroutine(); EventManager.Instance.Subscribe(ChoiceQuestionEventArgs.EventId, ChoiceQuestionEvent); } private void ChoiceQuestionEvent(object sender, GameEventArgs e) { var args = e as ChoiceQuestionEventArgs; currentTask.SetResult(args.isFirst); } protected override void OnLevel() { base.OnLevel(); EventManager.Instance.Unsubscribe(ChoiceQuestionEventArgs.EventId, ChoiceQuestionEvent); } async ETTask StartAsync() { var ui = UIManager.Instance().ShowUI(UIType.Chapter); var chapterUI = ui as ChapterUI; if (chapterUI == null) { Debug.LogError($"{ui.GetType()}"); return; } await chapterUI.Transit(0); UIManager.Instance().HideUI(UIType.Chapter); Minutia1_1().Coroutine(); } protected override void Next() { base.Next(); switch (index) { case 0: Minutia1_1().Coroutine(); break; case 1: Minutia1_2().Coroutine(); break; case 2: Minutia1_3().Coroutine(); break; case 3: Minutia1_4().Coroutine(); break; default: EventManager.Instance.FireNow(this, new ProcessOverEventArgs(processType)); break; } } public override void ConstEventLogic(object sender, GameEventArgs e) { base.ConstEventLogic(sender, e); var args = e as ConstEventArgs; this.SetPlayDirector(CurrentPlayableDirector, PlayTimelineMode.Pause); switch (args.constDataType) { case ConstDataType.None: break; case ConstDataType.乙炔气瓶开关高亮并等待点击: WaitOperateFinish1_1_1().Coroutine(); break; case ConstDataType.电脑屏幕高亮并等待点击: WaitOperateFinish1_1_2().Coroutine(); break; case ConstDataType.等待点击启动按钮: WaitOperateFinish1_1_3().Coroutine(); break; case ConstDataType.电脑开始启动: currentTask.SetResult(true); break; case ConstDataType.弹出气瓶燃烧提示并等待关闭: break; case ConstDataType.湿抹布高亮等待点击: WaitOperateFinish1_3_1().Coroutine(); break; case ConstDataType.拧紧阀门时弹出选择题并等待关闭: WaitOperateFinish1_3_2().Coroutine(); break; case ConstDataType.等待点击进入实验室按钮: WaitOperateFinish1_4_1().Coroutine(); break; case ConstDataType.点击进入实验室按钮: currentTask.SetResult(true); break; case ConstDataType.打开电源关闭提示等待关闭: WaitOperateFinish1_4_2().Coroutine(); break; case ConstDataType.打开检查结果提示等待关闭: WaitOperateFinish1_4_3().Coroutine(); break; case ConstDataType.关门: EventManager.Instance.FireNow(this, new DoorEventArgs(false)); this.SetPlayDirector(CurrentPlayableDirector, PlayTimelineMode.Resume); break; default: throw new ArgumentOutOfRangeException(); } } public override void ClickObjectEvent(object sender, GameEventArgs e) { base.ClickObjectEvent(sender, e); var args = e as ClickObjectEventArgs; switch (args.objectType) { case HighlightObjectType.乙炔气瓶开关: currentTask.SetResult(true); break; case HighlightObjectType.电脑屏幕: currentTask.SetResult(true); break; case HighlightObjectType.乙炔瓶柜门: break; case HighlightObjectType.湿抹布: currentTask.SetResult(true); break; case HighlightObjectType.警示牌: break; case HighlightObjectType.应急处理表: break; default: throw new ArgumentOutOfRangeException(); } } #region 1-1 private async ETTask WaitOperateFinish1_1_1() // 乙炔气瓶开关高亮并等待点击 { await WaitOperateFinish_ClickHighlight(HighlightObjectType.乙炔气瓶开关); } private async ETTask WaitOperateFinish1_1_2() // 电脑屏幕高亮并等待点击 { await WaitOperateFinish_ClickHighlight(HighlightObjectType.电脑屏幕); } private async ETTask WaitOperateFinish1_1_3() // 等待点击启动按钮 { await WaitOperateFinish_Click(); } #endregion #region 1-2 #endregion #region 1-3 private async ETTask WaitOperateFinish1_3_1() // 湿抹布高亮等待点击 { await WaitOperateFinish_ClickHighlight(HighlightObjectType.湿抹布, false); var ui = UIManager.Instance().ShowUI(UIType.BigStrongTips); var strongTipsUI = ui as BigStrongTipsUI; strongTipsUI.SetContent("提示", "气瓶站立燃烧,由于火焰向外喷射,热量并不会直接炙烤气瓶,加上气体气化的吸热现象,气瓶的温度并不会剧烈升高,可按照应急程序,用湿抹布包住手,绕到自喷火口后方,尝试拧紧阀门。(注意:若气瓶倒在地面火焰朝地面喷射,或火焰被物体阻挡烘烤瓶体时,火的热量会导致气瓶内部温度、压力剧烈升高,气瓶瓶体受热强度下降,存在爆炸危险,这时不可盲目接近,所有人应立即迅速撤离现场。)", () => { currentTask.SetResult(true); }, 1); await WaitOperateFinish_Click(); UIManager.Instance().HideUI(UIType.BigStrongTips); } private async ETTask WaitOperateFinish1_3_2() // 拧紧阀门时弹出选择题并等待关闭 { // TODO: 待添加选择题 var ui = UIManager.Instance().ShowUI(UIType.ChoiceQuestion); var result = await WaitOperateFinish_Click(); UIManager.Instance().HideUI(UIType.ChoiceQuestion); string choiceQuestionResult; if (result) { choiceQuestionResult = "已关闭事故瓶出气口阀门,火焰熄灭,周围未有新的引燃物。"; EffectManager.Instance().ShowOrHideEffect(EffectType.光度计持续燃烧特效, false); } else choiceQuestionResult = "无法关闭事故瓶出气口阀门,火焰依然燃烧,周围未有新的引燃物。"; EventManager.Instance.FireNow(this, new RoleLabelEventArgs() { speakContent = choiceQuestionResult }); await ETTask.CompletedTask; } #endregion #region 1-4 private async ETTask WaitOperateFinish1_4_1() // 等待点击进入实验室按钮 { await WaitOperateFinish_Click(); } private async ETTask WaitOperateFinish1_4_2() // 打开电源关闭提示等待关闭 { var showUI = UIManager.Instance().ShowUI(UIType.StrongTips); var strongTipsUI = showUI as StrongTipsUI; strongTipsUI.SetContent("提示", "“已确认电源关闭", () => { currentTask.SetResult(true); }, 1); await WaitOperateFinish_Click(); await currentTask; UIManager.Instance().HideUI(UIType.StrongTips); } private async ETTask WaitOperateFinish1_4_3() // 打开检查结果提示等待关闭 { var showUI = UIManager.Instance().ShowUI(UIType.StrongTips); var strongTipsUI = showUI as StrongTipsUI; strongTipsUI.SetContent("提示", "经检测确认气瓶无漏气,爆炸起火周围未有被引燃物品(注意:若有检查到起火点用干粉灭火器将气瓶火焰引燃的周围物品火焰根部喷射,扑灭火焰)。", () => { currentTask.SetResult(true); }, 1); await WaitOperateFinish_Click(); await currentTask; UIManager.Instance().HideUI(UIType.StrongTips); } #endregion // 1-1 // ①来到三维场景,播放动画2-1;当同学A打开乙炔柜体后,乙炔气瓶开关高亮,用户点击后再播放剩余动画、弹出“存在泄露”UI,不断闪烁,并伴随着咻~咻~咻~咻的泄气声,关闭柜门后“存在泄露”UI及泄气声消失; // ②此时电脑屏幕高亮,点击后出现电脑画面,画面中“确定”按钮高亮,鼠标点击后,显示启动中UI; // ③启动后0.5s,“蹦”的一声,柜体被爆炸打开,气瓶火焰向外喷射,并且光度计发生轻微爆炸,用户屏幕颤抖,三位同学倒地(动画2-2); private async ETTask Minutia1_1() { this.SetPlayDirector(playableDirectors[0], PlayTimelineMode.Play); await ETTask.CompletedTask; } // 1-2 // ①待动画2-2播放完毕,给个视角能看到爆炸处,又能看到其他同学,紧接着播放动画2-3,动画2-3播放同时光度计再次发生了2次轻微爆炸,1s后火焰慢慢变小,并播放动画2-4;(动画2-3、2-4中人物说话时需要弹出气泡框) private async ETTask Minutia1_2() { this.SetPlayDirector(playableDirectors[1], PlayTimelineMode.Play); await ETTask.CompletedTask; } // 1-3 // ①待动画2-4播完,桌上湿抹布高亮点击后弹出文字提示:“气瓶站立燃烧,由于火焰向外喷射,热量并不会直接炙烤气瓶,加上气体气化的吸热现象,气瓶的温度并不会剧烈升高,可按照应急程序,用湿抹布包住手,绕到自喷火口后方,尝试拧紧阀门。(注意:若气瓶倒在地面火焰朝地面喷射,或火焰被物体阻挡烘烤瓶体时,火的热量会导致气瓶内部温度、压力剧烈升高,气瓶瓶体受热强度下降,存在爆炸危险,这时不可盲目接近,所有人应立即迅速撤离现场。)”用户点击“确定”后,播放动画2-5; // ②2-5播放中间,拧紧阀门时弹出选择框 // 情况一:出气口阀门可以关紧,火焰熄灭,再播放剩余动画;跟同学G说到“已关闭事故瓶出气口阀门,火焰熄灭,周围未有新的引燃物。”,此步骤做完后,直接跳转1-4 // 情况二:出气口阀门无法关紧,火焰无法熄灭,再播放剩余动画;跟同学G说到:“无法关闭事故瓶出气口阀门,火焰依然燃烧,周围未有新的引燃物。”;随后再继续播放剩余动画;动画播放完毕 private async ETTask Minutia1_3() { this.SetPlayDirector(playableDirectors[2], PlayTimelineMode.Play); await ETTask.CompletedTask; } // 1-4 // ①视角对准实验室门口,播放动画2-7,动画播完后,视角对准L老师,播放动画2-8,动画播完,弹出 气体探测器结果界面,显示“正常”,点击“进入实验室”按钮; // ②播放动画2-9,动画播完,自动跳转至下一步; // ③视角来到实验室内,播放动画2-10,待电源开关关闭后,弹出“已确认电源关闭”提示框,点击确认,再播放J老师开门进入实验室动作;弹出再次检查按钮。 // ④按钮点击后,播放动画2-11,完成后弹出文字提示框:经检测确认气瓶无漏气,爆炸起火周围未有被引燃物品(注意:若有检查到起火点用干粉灭火器将气瓶火焰引燃的周围物品火焰根部喷射,扑灭火焰)。 private async ETTask Minutia1_4() { this.SetPlayDirector(playableDirectors[3], PlayTimelineMode.Play); await ETTask.CompletedTask; } } }