using BX; using Config.config; using DG.Tweening; using UnityEngine; using UnityEngine.Rendering.PostProcessing; /// /// 游戏场景 /// public class GameScene : MonoBehaviour { /// /// 惊险超车次数 /// [HideInInspector] public int judgmentOvertakingNumber; /// /// 在关卡内看广告次数 /// public int adNumber; /// /// 使用技能次数 /// public int useSkillNumber; /// /// 游戏时长 /// public float levelTime; /// /// 记录惊险超车次数 /// private int recordJudgmentOvertakingNumbe; /// /// 总超车次数 /// [HideInInspector] public int totaiJudgmentOvertakingNumbe; /// /// 撞车次数 /// private int carAccidentNumber; /// /// NPC车变道速度 /// [HideInInspector] public float npcLaneChangeSpeed; /// /// 火车移动速度 /// [HideInInspector] public float trainMoveSpeed; /// /// 闪灯数 /// [HideInInspector] public float flashingLightNumber; /// /// 行驶距离 /// private float operatingRange; /// /// 总分 /// private float totalScore; /// /// 行驶距离得分 /// private float operatingRangeScore; /// /// 惊险超车得分 /// private float dangerousOvertakingScore; /// /// 子弹时间时间 /// private float speedbreakerTime; /// /// 终点 /// private float endPos; /// /// 是否子弹时间 /// public bool isSpeedbreaker; /// /// 是否暂停 /// public bool isSuspend; /// /// 玩家 /// private Player player; /// /// 关卡配置 /// private LevelConfig levelConfig; /// /// 地图管理器 /// public MapManager mapManager; /// /// 终点 /// private GameObject end; /// /// 后处理 /// private PostProcessVolume postProcessVolume; /// /// 模糊Tween /// private Tween blurEffectTween; private void Awake() { Scenes.Instance.gameScene = this; mapManager = Instantiate(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "MapManager")).GetComponent(); SetLevelConfig(UserDataManager.Instance.userData.level); mapManager.Init(); GetChromaticAberration(); } private void Start() { Init(); PlayGame(); mapManager.SetPlayer(player); mapManager.InitGenerateNPCCar(); if (UserDataManager.Instance.userData.guidance.isOverInitialEntry) { GenerateEnd(levelConfig.End); } SetJudgmentOvertakingNumber(); } private void FixedUpdate() { SetNumericalValue(); SetOperatingRange(); UIManager.Instance.GetUI()?.SetTotalScore(totalScore); Speedbreaker(); SetLevelTime(); } /// /// 记录关卡时长 /// private void SetLevelTime() { if(Scenes.Instance.e_GameState==E_GameState.Gameing) { levelTime += Time.deltaTime; } } /// /// 初始化 /// private void Init() { levelTime = 0; adNumber = 0; useSkillNumber = 0; AudioManager.Instance.SetBackgroundMusic(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "GameBGM_" + Random.Range(1, 4))); trainMoveSpeed = GameNumericalValue.TrainMoveSpeed; npcLaneChangeSpeed = GameNumericalValue.NpcLaneChangeSpeed; flashingLightNumber = GameNumericalValue.FlashingLightNumber; operatingRangeScore = 0; dangerousOvertakingScore = 0; totalScore = 0; carAccidentNumber = 0; totaiJudgmentOvertakingNumbe = 0; speedbreakerTime = 0; ResetSpeedbreaker(); } /// /// 设置数值 /// private void SetNumericalValue() { if (Scenes.Instance.e_GameState == E_GameState.Gameing) { npcLaneChangeSpeed -= Time.deltaTime * 0.01f; npcLaneChangeSpeed = Mathf.Clamp(npcLaneChangeSpeed, 0.3f, GameNumericalValue.NpcLaneChangeSpeed); trainMoveSpeed += Time.deltaTime * 0.01f; trainMoveSpeed = Mathf.Clamp(trainMoveSpeed, GameNumericalValue.TrainMoveSpeed, 25); flashingLightNumber -= Time.deltaTime * 0.015f; flashingLightNumber = Mathf.Clamp(flashingLightNumber, 4, 6); } } /// /// 得到屏幕模糊效果 /// private void GetChromaticAberration() { PostProcessVolume[] postProcessVolume = Camera.main.GetComponents(); for (int i = 0; i < postProcessVolume.Length; i++) { if (postProcessVolume[i].profile.TryGetSettings(out ChromaticAberration outSetting)) { this.postProcessVolume = postProcessVolume[i]; } } } /// /// 子弹时间 /// public void Speedbreaker() { if (isSpeedbreaker && !isSuspend) { BlurEffect(true); Time.timeScale = 0.6f; speedbreakerTime += Time.unscaledDeltaTime; if (speedbreakerTime >= GameNumericalValue.SpeedbreakerTime) { BlurEffect(false); UIManager.Instance.GetUI().SetSpeedbreakerBtn(true); isSpeedbreaker = false; speedbreakerTime = 0; Time.timeScale = 1; } } } /// /// 模糊效果 /// private void BlurEffect(bool isShow) { if (isShow) { if (postProcessVolume.weight > 0) return; AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "BulletTimeStart")); DelayedProcessingManager.Instance.DelayDoSecond(this, 2, () => { AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "BulletTimeCycle"), true); }); AudioManager.Instance.SetBkMusic(false, 1); Scenes.Instance.player.RunningSound(false); float value = 0; blurEffectTween = DOTween.To(() => value, x => value = x, 0.5f, 0.3f).OnUpdate(() => { postProcessVolume.weight = value; }); } else { AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "BulletTimeEnd")); AudioManager.Instance.ClearIndividually("BulletTimeCycle"); AudioManager.Instance.SetBkMusic(true, 2); player.RunningSound(true); float value = 0.5f; blurEffectTween = DOTween.To(() => value, x => value = x, 0, 3).OnUpdate(() => { postProcessVolume.weight = value; }); } } /// /// 重置子弹时间 /// public void ResetSpeedbreaker() { isSpeedbreaker = false; speedbreakerTime = 0; Time.timeScale = 1; blurEffectTween.Kill(); postProcessVolume.weight = 0; AudioManager.Instance.SetBkMusic(true, 2); AudioManager.Instance.ClearIndividually("BulletTimeCycle"); } /// /// 重置关卡 /// public void ResetLevel() { UIManager.Instance.ResourcesShowUI((ui) => { ui.SetAction(() => { UIManager.Instance.AsynShowUI((gameUI) => { gameUI.SetCountDownkeepOut(true); }); Init(); SetJudgmentOvertakingNumber(); mapManager.GameOver(); mapManager.Init(); mapManager.InitGenerateNPCCar(); (Vector3, int) birthPoint = mapManager.sectionRoadOne.GetBirthPoint(); player.transform.position = birthPoint.Item1; player.SetMoveIndex(birthPoint.Item2); player.Init(); player.SetPlay(); Scenes.Instance.SetGameState(E_GameState.Start); }, () => { CountDown(); }); ui.Load(); }); } /// /// 设置关卡配置 /// /// public void SetLevelConfig(int level) { if (UserDataManager.Instance.userData.guidance.isOverInitialEntry) { if (UserDataManager.Instance.userData.level > 4) { levelConfig = ConfigManager.Instance.Tables.TbLevelConfig.Get("Level_" + Random.Range(1, 5)); mapManager.SetLevel(levelConfig); } else { levelConfig = ConfigManager.Instance.Tables.TbLevelConfig.Get("Level_" + level); mapManager.SetLevel(levelConfig); } } else { levelConfig = ConfigManager.Instance.Tables.TbLevelConfig.Get("Level_" +0); mapManager.SetLevel(levelConfig); } } /// /// 设置行驶距离 /// private void SetOperatingRange() { if (end != null) { if (player != null && Scenes.Instance.e_GameState == E_GameState.Gameing) { operatingRange = endPos - Vector3.Distance(end.transform.position, player.transform.position); operatingRangeScore = operatingRange; totalScore = operatingRangeScore + dangerousOvertakingScore; UIManager.Instance.GetUI()?.ShowOperatingRange(operatingRange, endPos); } } } /// /// 计算分数 /// public void SetdangerousOvertakingScore(float value) { dangerousOvertakingScore += value; UIManager.Instance.GetUI().SetExtraScore(value); } /// /// 得到关卡进度 /// /// public float GetSchedule() { return operatingRange / levelConfig.End; } /// /// 得到分数 /// /// public float GetScore() { return totalScore; } /// /// 胜利 /// public void Victory() { ResetSpeedbreaker(); Scenes.Instance.SetGameState(E_GameState.GameVictory); UIManager.Instance.HideUI(); UIManager.Instance.AsynShowUI(); mapManager.GameOver(); player.FireInit(); player.skill.Clear(); player.skinCar.OpenFrontLight(); } /// /// 暂停 /// public void Suspend() { player.RunningSound(false); isSuspend = true; Time.timeScale = 0; } /// /// 游戏结束 /// public void GameOver() { ResetSpeedbreaker(); UIManager.Instance.HideUI(); DelayedProcessingManager.Instance.DelayDoSecond(this, 1, () => { UIManager.Instance.AsynShowUI(); }); Scenes.Instance.SetGameState(E_GameState.GameOver); } /// /// 复活 /// public void Resurgence() { ResetSpeedbreaker(); UIManager.Instance.ResourcesShowUI((ui) => { ui.SetAction(() => { mapManager.GameOver(); UIManager.Instance.HideUI(); player.Resurgence(); mapManager.ResurgenceInit(); }, () => { Scenes.Instance.SetGameState(E_GameState.Gameing); player.RunningSound(true); }); ui.Load(); }); } /// /// 回到大厅 /// public void BackHall() { Time.timeScale = 1; player.RunningSound(false); UserDataManager.Instance.TrySkillOver(); UIManager.Instance.ResourcesShowUI((ui) => { ui.SetAction(() => { UIManager.Instance.DeleteUI(); UIManager.Instance.DeleteUI(); UIManager.Instance.DeleteUI(); UIManager.Instance.DeleteUI(); UIManager.Instance.DeleteUI(); CachePoolManager.Instance.Clear(); }, () => { Scenes.Instance.hallScene.SkipInit(); }); ScenesLoadManager.Instance.AsynLoadScene(MyConstant.HallScene, () => { ui.Load(); }); }); } /// /// 得到惊险超车次数 /// /// public int GetJudgmentOvertakingNumber() { judgmentOvertakingNumber++; if (judgmentOvertakingNumber > 10) { judgmentOvertakingNumber = 10; } recordJudgmentOvertakingNumbe = judgmentOvertakingNumber; return judgmentOvertakingNumber; } /// /// 设置总惊险超车数 /// public void SetTotaiJudgmentOvertakingNumbe() { totaiJudgmentOvertakingNumbe++; } /// /// 得到撞车次数 /// /// public int GetCarAccidentNumber() { return carAccidentNumber; } /// /// 设置总惊险超车数 /// public void SetGetCarAccidentNumbe() { carAccidentNumber++; } /// /// 设置惊险超车次数 /// public void SetJudgmentOvertakingNumber() { judgmentOvertakingNumber = 0; if (recordJudgmentOvertakingNumbe != 0) { UIManager.Instance.GetUI().SetMultipleState(); } } /// /// 续倍乘 /// public void Multiple() { judgmentOvertakingNumber = recordJudgmentOvertakingNumbe; UIManager.Instance.GetUI().SetEventType(E_ShowEventType.JudgmentOvertaking, (GameNumericalValue.JudgmentOvertakingAwardMoney * judgmentOvertakingNumber).ToString()); UIManager.Instance.GetUI().SetCloseCall(judgmentOvertakingNumber); } /// /// 开始游戏 /// public void PlayGame() { (Vector3, int) birthPoint = mapManager.sectionRoadOne.GetBirthPoint(); Scenes.Instance.PlayerCarInit(birthPoint.Item1); player = Scenes.Instance.player; player.SetPlay(); player.SetMoveIndex(birthPoint.Item2); player.SetGameBK(levelConfig); } /// /// 生成终点 /// public void GenerateEnd(float distance) { YooAssetManager.Instance.LoadAssetAsync(PackagesName.GameData, "End", (obj) => { end = Instantiate(obj); if (UserDataManager.Instance.userData.level > 4) { end.transform.position = player.transform.position + player.transform.forward * (distance + UserDataManager.Instance.userData.level * 1.35f); } else { end.transform.position = player.transform.position + player.transform.forward * distance; } endPos = Vector3.Distance(player.transform.position, end.transform.position); }); } /// /// 倒计时 /// public void CountDown() { DelayedProcessingManager.Instance.DelayDoSecond(this, 0.35f, () => { player.skinCar.SetAllLight(true); player.playerAnim.Play("Player_Shank"); float countdow = 3; GameUI gameUI = UIManager.Instance.GetUI(); gameUI.SetCountDownkeepOut(); gameUI.SetCountDown(3.ToString(), E_CountDownType.Three); gameUI.SetCountdownEnds(false); player.GetReady(E_CountDownType.Three); AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "CountDown")); DOTween.To(() => countdow, value => countdow = value, 2, 1.3f).OnComplete(() => { AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "CountDown")); player.GetReady(E_CountDownType.Two); gameUI.SetCountDownkeepOut(); gameUI.SetCountDown(2.ToString(), E_CountDownType.Two); DOTween.To(() => countdow, value => countdow = value, 1, 1.3f).OnComplete(() => { AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "CountDown")); player.GetReady(E_CountDownType.One); gameUI.SetCountDownkeepOut(); gameUI.SetCountDown(1.ToString(), E_CountDownType.One); DOTween.To(() => countdow, value => countdow = value, 0, 1.4f).OnComplete(() => { GuidanceManger.Instance.ChannelChangeguidance(); AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "GO")); player.playerAnim.Stop("Player_Shank"); gameUI.SetCountDownkeepOut(false); gameUI.SetCountdownEnds(true); player.TurnToGameCamear(); gameUI.SetCountDownkeepOut(); gameUI.SetCountDown("GO!!!", E_CountDownType.GO); player.skinCar.SetAllLight(false); Scenes.Instance.SetGameState(E_GameState.Gameing); player.RunningSound(true); }); }); }); }); } /// /// 中途倒计时 /// public void HalfWayCountdown() { int value = 3; UIManager.Instance.GetUI().SetCountDown(value.ToString(), E_CountDownType.Three); AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "CountDown")); DOTween.To(() => value, x => value = x, 2, 1).OnComplete(() => { UIManager.Instance.GetUI().SetCountDown(value.ToString(), E_CountDownType.Two); AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "CountDown")); DOTween.To(() => value, x => value = x, 1, 1).OnComplete(() => { UIManager.Instance.GetUI().SetCountDown(value.ToString(), E_CountDownType.One); AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "CountDown")); DOTween.To(() => value, x => value = x, 0, 1).OnComplete(() => { if (isSpeedbreaker) { Time.timeScale = 0.6f; } else { player.RunningSound(true); Time.timeScale = 1; } AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "GO")); UIManager.Instance.GetUI().SetCountDown("GO!!!", E_CountDownType.GO); UIManager.Instance.GetUI().SetCountdownEnds(true); isSuspend = false; }).SetUpdate(true); }).SetUpdate(true); }).SetUpdate(true); } }