using System; using System.Collections; using System.Collections.Generic; using System.Threading.Tasks; using GameFramework.Event; using UnityEngine; using UnityEngine.Playables; using UnityEngine.Serialization; public enum Power_FaultQuestionType { select, trigger } public enum Power_FaultType { fused, UspGone, pl, dc, none, } public struct PowerStepItemTriggerData { public Power_FaultQuestionType questionType; public Power_FaultType faultType; //如果是选择题的话选择对应错误 public UI_TriggerItemType item_1; public UI_TriggerItemType item_2; public float timeLineStart; public float timeLineEnd; } public class Power_FaultFixCtrl : MonoBehaviour { public PlayableDirector fused_TimeLine; public PlayableDirector UspGone_TimeLine; public PlayableDirector fault3_TimeLine;//新增故障 //步骤统计 private int currentStepIndex = 0; private Power_FaultType currentType = Power_FaultType.none; private List fusedStepList; private List uspGoneStepList; private List fault3StepList; private void Awake() { InitFusedStep(); InitUsp_GoneStep(); InitFault3Step(); } private void Start() { GameMain.Event.Subscribe(UI_ItemMoveDoneEvent.EventId, OnGetUI_ItemMoveDone); GameMain.Event.Subscribe(Power_SelectFaultItemEvent.EventId, OnGetSelectFaultItem); GameMain.Event.Subscribe(Power_FaultStartEvent.EventId, OnGetPower_FaultStart); } private void OnDestroy() { if (GameMain.Event.Check(UI_ItemMoveDoneEvent.EventId, OnGetUI_ItemMoveDone)) { GameMain.Event.Unsubscribe(UI_ItemMoveDoneEvent.EventId, OnGetUI_ItemMoveDone); } if (GameMain.Event.Check(Power_SelectFaultItemEvent.EventId, OnGetSelectFaultItem)) { GameMain.Event.Unsubscribe(Power_SelectFaultItemEvent.EventId, OnGetSelectFaultItem); } if (GameMain.Event.Check(Power_FaultStartEvent.EventId, OnGetPower_FaultStart)) { GameMain.Event.Unsubscribe(Power_FaultStartEvent.EventId, OnGetPower_FaultStart); } } private void InitFusedStep() { fusedStepList = new List(); //1 选择更换保险丝 fusedStepList.Add(new PowerStepItemTriggerData() { questionType = Power_FaultQuestionType.select, faultType = Power_FaultType.fused, item_1 = UI_TriggerItemType.none, item_2 = UI_TriggerItemType.none, timeLineStart = 11, timeLineEnd = -1 }); //2 合成手套 fusedStepList.Add(new PowerStepItemTriggerData() { questionType = Power_FaultQuestionType.trigger, faultType = Power_FaultType.fused, item_1 = UI_TriggerItemType.hand, item_2 = UI_TriggerItemType.gloves, timeLineStart = 11, timeLineEnd = -1 }); //3 关闸 fusedStepList.Add(new PowerStepItemTriggerData() { questionType = Power_FaultQuestionType.trigger, faultType = Power_FaultType.fused, item_1 = UI_TriggerItemType.handWithGloves, item_2 = UI_TriggerItemType.powerSwitch, timeLineStart = 20, timeLineEnd = 25 }); //4 取出保险丝 fusedStepList.Add(new PowerStepItemTriggerData() { questionType = Power_FaultQuestionType.trigger, faultType = Power_FaultType.fused, item_1 = UI_TriggerItemType.handWithGloves, item_2 = UI_TriggerItemType.fuse, timeLineStart = 34, timeLineEnd = 40 }); //5 插入保险丝 fusedStepList.Add(new PowerStepItemTriggerData() { questionType = Power_FaultQuestionType.trigger, faultType = Power_FaultType.fused, item_1 = UI_TriggerItemType.fuse, item_2 = UI_TriggerItemType.fusePos, timeLineStart = 40, timeLineEnd = 44 }); //6 开闸 fusedStepList.Add(new PowerStepItemTriggerData() { questionType = Power_FaultQuestionType.trigger, faultType = Power_FaultType.fused, item_1 = UI_TriggerItemType.handWithGloves, item_2 = UI_TriggerItemType.powerSwitch, timeLineStart = 46, timeLineEnd = 50 }); } private void InitUsp_GoneStep() { uspGoneStepList = new List(); //1 选择更换蓄电池 uspGoneStepList.Add(new PowerStepItemTriggerData() { questionType = Power_FaultQuestionType.select, faultType = Power_FaultType.UspGone, item_1 = UI_TriggerItemType.none, item_2 = UI_TriggerItemType.none, timeLineStart = 12, timeLineEnd = -1 }); //2 合成手套 uspGoneStepList.Add(new PowerStepItemTriggerData() { questionType = Power_FaultQuestionType.trigger, faultType = Power_FaultType.UspGone, item_1 = UI_TriggerItemType.hand, item_2 = UI_TriggerItemType.gloves, timeLineStart = 12, timeLineEnd = -1 }); //3 关闸 uspGoneStepList.Add(new PowerStepItemTriggerData() { questionType = Power_FaultQuestionType.trigger, faultType = Power_FaultType.UspGone, item_1 = UI_TriggerItemType.handWithGloves, item_2 = UI_TriggerItemType.powerSwitch, timeLineStart = 21, timeLineEnd = 25 }); //4 拧螺丝 uspGoneStepList.Add(new PowerStepItemTriggerData() { questionType = Power_FaultQuestionType.trigger, faultType = Power_FaultType.UspGone, item_1 = UI_TriggerItemType.screwdriver, item_2 = UI_TriggerItemType.battery, timeLineStart = 33, timeLineEnd = 36 }); //5 取走电源 uspGoneStepList.Add(new PowerStepItemTriggerData() { questionType = Power_FaultQuestionType.trigger, faultType = Power_FaultType.UspGone, item_1 = UI_TriggerItemType.handWithGloves, item_2 = UI_TriggerItemType.battery, timeLineStart = 36, timeLineEnd = 38 }); //6 换上新电源 uspGoneStepList.Add(new PowerStepItemTriggerData() { questionType = Power_FaultQuestionType.trigger, faultType = Power_FaultType.UspGone, item_1 = UI_TriggerItemType.battery, item_2 = UI_TriggerItemType.batteryPos, timeLineStart = 39, timeLineEnd = 42 }); //7 拧螺丝 uspGoneStepList.Add(new PowerStepItemTriggerData() { questionType = Power_FaultQuestionType.trigger, faultType = Power_FaultType.UspGone, item_1 = UI_TriggerItemType.screwdriver, item_2 = UI_TriggerItemType.battery, timeLineStart = 42, timeLineEnd = 46 }); //8 开闸 uspGoneStepList.Add(new PowerStepItemTriggerData() { questionType = Power_FaultQuestionType.trigger, faultType = Power_FaultType.UspGone, item_1 = UI_TriggerItemType.handWithGloves, item_2 = UI_TriggerItemType.powerSwitch, timeLineStart = 48, timeLineEnd = 52 }); } //错误修复3 private void InitFault3Step() { fault3StepList = new List(); fault3StepList.Add(new PowerStepItemTriggerData() { questionType = Power_FaultQuestionType.select, faultType = Power_FaultType.dc, item_1 = UI_TriggerItemType.none, item_2 = UI_TriggerItemType.none, timeLineStart = 6, timeLineEnd = -1 }); fault3StepList.Add(new PowerStepItemTriggerData() { questionType = Power_FaultQuestionType.trigger, faultType = Power_FaultType.dc, item_1 = UI_TriggerItemType.hand, item_2 = UI_TriggerItemType.gloves, timeLineStart = 6, timeLineEnd = -1 }); fault3StepList.Add(new PowerStepItemTriggerData() { questionType = Power_FaultQuestionType.trigger, faultType = Power_FaultType.dc, item_1 = UI_TriggerItemType.handWithGloves, item_2 = UI_TriggerItemType.fuse, timeLineStart = 14, timeLineEnd = 18 }); fault3StepList.Add(new PowerStepItemTriggerData() { questionType = Power_FaultQuestionType.trigger, faultType = Power_FaultType.dc, item_1 = UI_TriggerItemType.fuse, item_2 = UI_TriggerItemType.fusePos, timeLineStart = 22, timeLineEnd = 25 }); fault3StepList.Add(new PowerStepItemTriggerData() { questionType = Power_FaultQuestionType.trigger, faultType = Power_FaultType.dc, item_1 = UI_TriggerItemType.handWithGloves, item_2 = UI_TriggerItemType.powerSwitch, timeLineStart = 33, timeLineEnd = 35 }); fault3StepList.Add(new PowerStepItemTriggerData() { questionType = Power_FaultQuestionType.trigger, faultType = Power_FaultType.dc, item_1 = UI_TriggerItemType.handWithGloves, item_2 = UI_TriggerItemType.battery, timeLineStart = 40, timeLineEnd = 42 }); } private void ReSetFaultFix() { currentStepIndex = 0; if (currentType == Power_FaultType.fused) { fused_TimeLine.Stop(); fused_TimeLine.time = fusedStepList[0].timeLineStart; } if (currentType == Power_FaultType.UspGone) { UspGone_TimeLine.Stop(); UspGone_TimeLine.time = uspGoneStepList[0].timeLineStart; } if (currentType == Power_FaultType.dc) { fault3_TimeLine.Stop(); fault3_TimeLine.time = fault3StepList[0].timeLineStart; } } private async void OnGetPower_FaultStart(object sender, GameEventArgs e) { Power_FaultStartEvent args = (Power_FaultStartEvent)e; if (args.type == Power_FaultType.fused && currentType != Power_FaultType.fused) { currentType = Power_FaultType.fused; currentStepIndex = 0; UspGone_TimeLine.Stop(); UspGone_TimeLine.gameObject.SetActive(false); fault3_TimeLine.Stop(); fault3_TimeLine.gameObject.SetActive(false); fused_TimeLine.gameObject.SetActive(true); fused_TimeLine.time = fusedStepList[0].timeLineStart; fused_TimeLine.Play(); await Task.Delay(50); fused_TimeLine.Pause(); GameMain.Event.Fire(this, Power_FaultNextEvent.Create(currentType, currentStepIndex)); } if (args.type == Power_FaultType.UspGone && currentType != Power_FaultType.UspGone) { currentType = Power_FaultType.UspGone; currentStepIndex = 0; fused_TimeLine.Stop(); fused_TimeLine.gameObject.SetActive(false); fault3_TimeLine.Stop(); fault3_TimeLine.gameObject.SetActive(false); UspGone_TimeLine.gameObject.SetActive(true); UspGone_TimeLine.time = uspGoneStepList[0].timeLineStart; UspGone_TimeLine.Play(); await Task.Delay(50); UspGone_TimeLine.Pause(); GameMain.Event.Fire(this, Power_FaultNextEvent.Create(currentType, currentStepIndex)); } if (args.type == Power_FaultType.dc && currentType != Power_FaultType.dc) { currentType = Power_FaultType.dc; currentStepIndex = 0; fused_TimeLine.Stop(); fused_TimeLine.gameObject.SetActive(false); UspGone_TimeLine.Stop(); UspGone_TimeLine.gameObject.SetActive(false); fault3_TimeLine.gameObject.SetActive(true); fault3_TimeLine.time = fault3StepList[0].timeLineStart; fault3_TimeLine.Play(); await Task.Delay(50); fault3_TimeLine.Pause(); GameMain.Event.Fire(this, Power_FaultNextEvent.Create(currentType, currentStepIndex)); } } private async void OnGetUI_ItemMoveDone(object sender, GameEventArgs e) { List currentList = null; int stepCount = -1; PlayableDirector currentPlayableDirector = null; switch (currentType) { case Power_FaultType.fused: currentList = fusedStepList; stepCount = currentList.Count; currentPlayableDirector = fused_TimeLine; break; case Power_FaultType.UspGone: currentList = uspGoneStepList; stepCount = currentList.Count; currentPlayableDirector = UspGone_TimeLine; break; case Power_FaultType.dc: currentList = fault3StepList; stepCount = fault3StepList.Count; currentPlayableDirector = fault3_TimeLine; break; } Debug.Log(stepCount+" "+currentList.Count); if (currentList[currentStepIndex].questionType == Power_FaultQuestionType.trigger) { UI_ItemMoveDoneEvent args = (UI_ItemMoveDoneEvent)e; Debug.Log( $"{args.item_1}:{args.item_2} {currentList[currentStepIndex].item_1}:{currentList[currentStepIndex].item_2}"); bool pass = false; if (args.item_1 == currentList[currentStepIndex].item_1) { if (args.item_2 == currentList[currentStepIndex].item_2) { pass = true; } } else if (args.item_2 == currentList[currentStepIndex].item_1) { if (args.item_1 == currentList[currentStepIndex].item_2) { pass = true; } } if (pass) { if (currentList[currentStepIndex].timeLineEnd != -1) { currentPlayableDirector.Play(); await Task.Delay((int)(currentList[currentStepIndex].timeLineEnd - currentList[currentStepIndex].timeLineStart) * 1000); currentPlayableDirector.Pause(); } currentStepIndex++; if (currentStepIndex >= stepCount) { GameMain.Event.Fire(this, IT_TrainStudyDoneEvent.Create()); } else { //todo nextStep currentPlayableDirector.time = currentList[currentStepIndex].timeLineStart; currentPlayableDirector.Play(); await Task.Delay(50); currentPlayableDirector.Pause(); Debug.Log($"{stepCount} {currentStepIndex}"); GameMain.Event.Fire(this, Power_FaultNextEvent.Create(currentType, currentStepIndex)); } } } } private async void OnGetSelectFaultItem(object sender, GameEventArgs e) { List currentList = null; int stepCount = -1; PlayableDirector currentPlayableDirector=null; switch (currentType) { case Power_FaultType.fused: currentList = fusedStepList; stepCount = currentList.Count; currentPlayableDirector = fused_TimeLine; break; case Power_FaultType.UspGone: currentList = uspGoneStepList; stepCount = currentList.Count; currentPlayableDirector = UspGone_TimeLine; break; case Power_FaultType.dc: currentList = fault3StepList; stepCount = fault3StepList.Count; currentPlayableDirector = fault3_TimeLine; break; } if (currentList[currentStepIndex].questionType == Power_FaultQuestionType.select) { Power_SelectFaultItemEvent args = (Power_SelectFaultItemEvent)e; if (args.faultType == currentList[currentStepIndex].faultType) { if (currentList[currentStepIndex].timeLineEnd != -1) { currentPlayableDirector.Play(); await Task.Delay((int)(currentList[currentStepIndex].timeLineEnd-currentList[currentStepIndex].timeLineStart)*1000); currentPlayableDirector.Pause(); } currentStepIndex++; if (currentStepIndex >= stepCount) { //todo 完成 } else { //todo nextStep currentPlayableDirector.time = currentList[currentStepIndex].timeLineStart; currentPlayableDirector.Play(); await Task.Delay(50); currentPlayableDirector.Pause(); Debug.Log($"{currentType} {currentStepIndex}"); GameMain.Event.Fire(this,Power_FaultNextEvent.Create(currentType,currentStepIndex)); } } } } }