using BX; using Config.config; using DG.Tweening; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; /// /// 引导管理器 /// public class GuidanceManger : MBSingletonManager { /// /// 固定车数 /// private int fixedCarNumber; /// /// 变道车数 /// private int changeLanesCarNumber; /// /// 是否变道引导完成 /// public bool isChannelChangeguidanceOver; /// /// 是否使用技能引导完成 /// private bool isUseSkillguidanceOver; /// /// 生成NPCcar /// private bool isGenerateNpcCar; /// /// 开启正常模式 /// public bool isEnableNormalMode; /// /// 是否加速度 /// public bool isAcceleratedSpeed; /// /// 是否技能结束 /// public bool isSkillOver; /// /// 引导UI /// private TeachUI teachUI; /// /// 车 /// private NPCCar npcCar; /// /// 是否滑动 /// public bool isSlide; /// /// 生成时间 /// private float generateTime; /// /// NPCCar列表 /// private List nPCCars; private void Awake() { if(UserDataManager.Instance.userData.guidance.isOverInitialEntry) { isChannelChangeguidanceOver = true; isUseSkillguidanceOver = true; isEnableNormalMode = true; isAcceleratedSpeed = true; isSkillOver = true; isSlide = true; } else { UIManager.Instance.SetPostProcessVolume(true); nPCCars = new List(); } } private void FixedUpdate() { if (!UserDataManager.Instance.userData.guidance.isOverInitialEntry) { Trial(); PutCar(); } } /// /// 初始化 /// public void Init() { UIManager.Instance.AsynShowUI((teachUI) => { this.teachUI = teachUI; }); } /// /// 点击开始 /// public void TapPlay(MainUI mainUI) { DelayedProcessingManager.Instance.DelayDoSecond(this, 0.1f, () => { teachUI.SetFocus(E_FocusType.Square); teachUI.SetHandState(mainUI.playBtn.transform.position, E_HandAniKindType.Tap); teachUI.SetLookState(mainUI.playBtn.transform.position, true, (mainUI.playBtn.transform as RectTransform).sizeDelta+Vector2.one*20); teachUI.SetBtnState(mainUI.playBtn.transform.position, (mainUI.playBtn.transform as RectTransform).sizeDelta + Vector2.one * 30, () => { ExecuteEvents.Execute(mainUI.playBtn.gameObject, new PointerEventData(EventSystem.current), ExecuteEvents.pointerClickHandler); UIManager.Instance.HideUI(); UIManager.Instance.SetPostProcessVolume(false); }); }); } /// /// 变道引导 /// public void ChannelChangeguidance() { if (!UserDataManager.Instance.userData.guidance.isOverInitialEntry) { isSlide = true; UIManager.Instance.SetPostProcessVolume(true); DelayedProcessingManager.Instance.DelayDoSecond(this, 0.1f, () => { UIManager.Instance.AsynShowUI(); teachUI.SetMaskBGRay(false); teachUI.SetHandState(teachUI.transform.position, E_HandAniKindType.Slide); teachUI.SetTalkText("SLIDE TO CHANGE LANE"); }); } } /// /// 变道引导完成 /// public void ChannelChangeguidanceOver() { if (isChannelChangeguidanceOver) return; BXSdk.Instance.LogEvent("Guide", new System.Collections.Generic.Dictionary() { {"Guide_Step","ChangeLane"} }); isChannelChangeguidanceOver = true; if (!UserDataManager.Instance.userData.guidance.isOverInitialEntry) { DelayedProcessingManager.Instance.DelayDoSecond(this, 0.5f, () => { teachUI.SetGuidelinesCG(false); teachUI.SetDialogueCGCG(false); GenerateFixedNpcCar(); }); } } /// /// 生成固定NPC车 /// public void GenerateFixedNpcCar() { isSlide = false; DelayedProcessingManager.Instance.DelayDoSecond(this, 1, () => { npcCar = Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 80, "Car_2"); SetTimeScale(false, () => { teachUI.SetFocus(E_FocusType.Round); teachUI.SetLookState(Camera.main.WorldToScreenPoint(npcCar.transform.position + Vector3.right * 3), false, new Vector2(400, 400)); teachUI.SetTapEvent(true); teachUI.SetTalkText("AVOID OTHER CARS!"); }); UIManager.Instance.AddCustomEventListener(teachUI.tapEvent, EventTriggerType.PointerDown, (data) => { BXSdk.Instance.LogEvent("Guide", new System.Collections.Generic.Dictionary() { {"Guide_Step","DodgeCar"} }); teachUI.SetGuidelinesCG(false); teachUI.SetDialogueCGCG(false); teachUI.SetMaskBGCG(false); teachUI.SetTapEvent(false); SetTimeScale(true); isSlide = true; UIManager.Instance.RemoveCustomEventListener(teachUI.tapEvent, EventTriggerType.PointerDown); DelayedProcessingManager.Instance.DelayDoSecond(this, 1, () => { Destroy(npcCar.gameObject); npcCar = null; GenerateChangeLanesNpcCar(); }); }); }); } /// /// 生成变道NPC车 /// public void GenerateChangeLanesNpcCar() { isSlide = false; DelayedProcessingManager.Instance.DelayDoSecond(this, 1, () => { if (Scenes.Instance.player.moveIndex < Scenes.Instance.player.sectionRoad.maxIndex) { npcCar = Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 100 - Vector3.forward * 4.4f, "Car_6"); npcCar.SetData(Scenes.Instance.player.moveIndex+1, Scenes.Instance.player.sectionRoad); npcCar.SetRightLeft(E_DirectionType.Left); } else { npcCar = Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 100 +Vector3.forward * 4.4f, "Car_6"); npcCar.SetData(Scenes.Instance.player.moveIndex-1, Scenes.Instance.player.sectionRoad); npcCar.SetRightLeft(E_DirectionType.Right); } SetTimeScale(false, () => { teachUI.SetFocus(E_FocusType.Round); teachUI.SetLookState(Camera.main.WorldToScreenPoint(npcCar.transform.position + Vector3.right * 3), false, new Vector2(400, 400)); teachUI.SetTapEvent(true); teachUI.SetTalkText("WATCH FOR INDICATORS!"); }); UIManager.Instance.AddCustomEventListener(teachUI.tapEvent, EventTriggerType.PointerDown, (data) => { BXSdk.Instance.LogEvent("Guide", new System.Collections.Generic.Dictionary() { {"Guide_Step","Indicator"} }); teachUI.SetGuidelinesCG(false); teachUI.SetDialogueCGCG(false); teachUI.SetMaskBGCG(false); teachUI.SetTapEvent(false); SetTimeScale(true); isSlide = true; UIManager.Instance.RemoveCustomEventListener(teachUI.tapEvent, EventTriggerType.PointerDown); UIManager.Instance.SetPostProcessVolume(false); DelayedProcessingManager.Instance.DelayDoSecond(this, 2, () => { Destroy(npcCar.gameObject); npcCar = null; isGenerateNpcCar = true; Scenes.Instance.player.moveSpeed = 70; }); }); }); } /// /// 试炼 /// private void Trial() { if (isGenerateNpcCar) { generateTime += Time.deltaTime; if (generateTime >= 1 && !Scenes.Instance.player.isChangeLanes) { if (fixedCarNumber != 10) { if (ProbabilityManager.Instance.GetPercent(50)) { if (ProbabilityManager.Instance.GetPercent(50)) { if (Scenes.Instance.player.moveIndex < Scenes.Instance.player.sectionRoad.maxIndex) { nPCCars.Add(Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 200 - Vector3.forward * 4.4f, "Car_" + Random.Range(1, 24))); } else { nPCCars.Add(Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 200 + Vector3.forward * 4.4f, "Car_" + Random.Range(1, 24))); } } else { if (Scenes.Instance.player.moveIndex > Scenes.Instance.player.sectionRoad.minIndex) { nPCCars.Add(Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 200 + Vector3.forward * 4.4f, "Car_" + Random.Range(1, 24))); } else { nPCCars.Add(Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 200 - Vector3.forward * 4.4f, "Car_" + Random.Range(1, 24))); } } } nPCCars.Add(Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 200, "Car_" + Random.Range(1, 24))); fixedCarNumber++; } else if (changeLanesCarNumber != 8) { if (ProbabilityManager.Instance.GetPercent(50)) { if (Scenes.Instance.player.moveIndex < Scenes.Instance.player.sectionRoad.maxIndex) { npcCar = Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 200 - Vector3.forward * 4.4f, "Car_" + Random.Range(1, 24)); npcCar.SetRightLeft(E_DirectionType.Left); npcCar.SetData(Scenes.Instance.player.moveIndex + 1, Scenes.Instance.player.sectionRoad); } else { npcCar = Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 200 + Vector3.forward * 4.4f, "Car_" + Random.Range(1, 24)); npcCar.SetRightLeft(E_DirectionType.Left); npcCar.SetData(Scenes.Instance.player.moveIndex - 1, Scenes.Instance.player.sectionRoad); } } else { if (Scenes.Instance.player.moveIndex > Scenes.Instance.player.sectionRoad.minIndex) { npcCar = Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 200 + Vector3.forward * 4.4f, "Car_" + Random.Range(1, 24)); npcCar.SetRightLeft(E_DirectionType.Left); npcCar.SetData(Scenes.Instance.player.moveIndex - 1, Scenes.Instance.player.sectionRoad); } else { npcCar = Scenes.Instance.player.sectionRoad.GenerateNPCCar(Scenes.Instance.player.transform.position + Vector3.right * 200 - Vector3.forward * 4.4f, "Car_" + Random.Range(1, 24)); npcCar.SetRightLeft(E_DirectionType.Left); npcCar.SetData(Scenes.Instance.player.moveIndex + 1, Scenes.Instance.player.sectionRoad); } } nPCCars.Add(npcCar); changeLanesCarNumber++; } generateTime = 0; } if (fixedCarNumber >= 10 && changeLanesCarNumber >= 8) { isGenerateNpcCar = false; UseSkill(); } } } /// /// 放回车 /// private void PutCar() { if(nPCCars.Count>0) { for (int i = 0; i < nPCCars.Count; i++) { if(nPCCars[i].transform.position.x /// 使用技能 /// public void UseSkill() { DelayedProcessingManager.Instance.DelayDoSecond(this, 4, () => { UIManager.Instance.GetUI().OpenSkin(); Scenes.Instance.player.FullEnergy(); teachUI.SetTalkText("DOUBLE TAP TO USE"); teachUI.SetGuidelinesCG(false); teachUI.SetHandState(teachUI.transform.position, E_HandAniKindType.DoubleClick); }); } /// /// 使用技能引导完成 /// public void UseSkillguidanceOver() { if (isUseSkillguidanceOver) return; BXSdk.Instance.LogEvent("Guide", new System.Collections.Generic.Dictionary() { {"Guide_Step","Skill"} }); isUseSkillguidanceOver = true; teachUI.SetTalkText("INVINCIBLE IN THIS FROM!"); isEnableNormalMode= true; Scenes.Instance.gameScene.mapManager.InitguidanceGenerateNPCCar(); teachUI.SetGuidelinesCG(false); isAcceleratedSpeed = true; } /// /// 技能释放结束 /// public void SkillOver() { if (isSkillOver) return; isSkillOver = true; BXSdk.Instance.LogEvent("Guide", new System.Collections.Generic.Dictionary() { {"Guide_Step","StartCount"} }); UIManager.Instance.GetUI().OpenOthe(); UIManager.Instance.GetUI().Flicker(); teachUI.SetDialogueCGCG(false); Scenes.Instance.gameScene.GenerateEnd(1500); } /// /// 设置时间缩放 /// private void SetTimeScale(bool isTrue, UnityAction callBack = null) { float startValue; float endValue; if (isTrue) { teachUI.SetMaskBGRay(false); Scenes.Instance.player.RunningSound(true); startValue = 0; endValue = 1; DOTween.To(() => startValue, x => startValue = x, endValue, 1.5f).SetEase(Ease.InQuad).SetUpdate(true).OnUpdate(() => { Time.timeScale = startValue; }); } else { startValue = 1; endValue = 0; teachUI.SetMaskBGRay(true); DOTween.To(() => startValue, x => startValue = x, endValue, 1.5f).SetEase(Ease.InQuad).SetUpdate(true).OnUpdate(() => { Time.timeScale = startValue; }).OnComplete(() => { Scenes.Instance.player.RunningSound(false); callBack?.Invoke(); }); } } }