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);
}
}