OvertakingLegend/Assets/Script/GameScene.cs

669 lines
21 KiB
C#

using BX;
using Config.config;
using DG.Tweening;
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;
/// <summary>
/// 游戏场景
/// </summary>
public class GameScene : MonoBehaviour
{
/// <summary>
/// 惊险超车次数
/// </summary>
[HideInInspector] public int judgmentOvertakingNumber;
/// <summary>
/// 在关卡内看广告次数
/// </summary>
public int adNumber;
/// <summary>
/// 使用技能次数
/// </summary>
public int useSkillNumber;
/// <summary>
/// 游戏时长
/// </summary>
public float levelTime;
/// <summary>
/// 记录惊险超车次数
/// </summary>
private int recordJudgmentOvertakingNumbe;
/// <summary>
/// 总超车次数
/// </summary>
[HideInInspector] public int totaiJudgmentOvertakingNumbe;
/// <summary>
/// 撞车次数
/// </summary>
private int carAccidentNumber;
/// <summary>
/// NPC车变道速度
/// </summary>
[HideInInspector] public float npcLaneChangeSpeed;
/// <summary>
/// 火车移动速度
/// </summary>
[HideInInspector] public float trainMoveSpeed;
/// <summary>
/// 闪灯数
/// </summary>
[HideInInspector] public float flashingLightNumber;
/// <summary>
/// 行驶距离
/// </summary>
private float operatingRange;
/// <summary>
/// 总分
/// </summary>
private float totalScore;
/// <summary>
/// 行驶距离得分
/// </summary>
private float operatingRangeScore;
/// <summary>
/// 惊险超车得分
/// </summary>
private float dangerousOvertakingScore;
/// <summary>
/// 子弹时间时间
/// </summary>
private float speedbreakerTime;
/// <summary>
/// 终点
/// </summary>
private float endPos;
/// <summary>
/// 是否子弹时间
/// </summary>
public bool isSpeedbreaker;
/// <summary>
/// 是否暂停
/// </summary>
public bool isSuspend;
/// <summary>
/// 玩家
/// </summary>
private Player player;
/// <summary>
/// 关卡配置
/// </summary>
private LevelConfig levelConfig;
/// <summary>
/// 地图管理器
/// </summary>
public MapManager mapManager;
/// <summary>
/// 终点
/// </summary>
private GameObject end;
/// <summary>
/// 后处理
/// </summary>
private PostProcessVolume postProcessVolume;
/// <summary>
/// 模糊Tween
/// </summary>
private Tween blurEffectTween;
private void Awake()
{
Scenes.Instance.gameScene = this;
mapManager = Instantiate(YooAssetManager.Instance.LoadAssetSync<GameObject>(PackagesName.GameData, "MapManager")).GetComponent<MapManager>();
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<GameUI>()?.SetTotalScore(totalScore);
Speedbreaker();
SetLevelTime();
}
/// <summary>
/// 记录关卡时长
/// </summary>
private void SetLevelTime()
{
if(Scenes.Instance.e_GameState==E_GameState.Gameing)
{
levelTime += Time.deltaTime;
}
}
/// <summary>
/// 初始化
/// </summary>
private void Init()
{
levelTime = 0;
adNumber = 0;
useSkillNumber = 0;
AudioManager.Instance.SetBackgroundMusic(YooAssetManager.Instance.LoadAssetSync<AudioClip>(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();
}
/// <summary>
/// 设置数值
/// </summary>
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);
}
}
/// <summary>
/// 得到屏幕模糊效果
/// </summary>
private void GetChromaticAberration()
{
PostProcessVolume[] postProcessVolume = Camera.main.GetComponents<PostProcessVolume>();
for (int i = 0; i < postProcessVolume.Length; i++)
{
if (postProcessVolume[i].profile.TryGetSettings<ChromaticAberration>(out ChromaticAberration outSetting))
{
this.postProcessVolume = postProcessVolume[i];
}
}
}
/// <summary>
/// 子弹时间
/// </summary>
public void Speedbreaker()
{
if (isSpeedbreaker && !isSuspend)
{
BlurEffect(true);
Time.timeScale = 0.6f;
speedbreakerTime += Time.unscaledDeltaTime;
if (speedbreakerTime >= GameNumericalValue.SpeedbreakerTime)
{
BlurEffect(false);
UIManager.Instance.GetUI<GameUI>().SetSpeedbreakerBtn(true);
isSpeedbreaker = false;
speedbreakerTime = 0;
Time.timeScale = 1;
}
}
}
/// <summary>
/// 模糊效果
/// </summary>
private void BlurEffect(bool isShow)
{
if (isShow)
{
if (postProcessVolume.weight > 0) return;
AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync<AudioClip>(PackagesName.GameData, "BulletTimeStart"));
DelayedProcessingManager.Instance.DelayDoSecond(this, 2, () =>
{
AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync<AudioClip>(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<AudioClip>(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;
});
}
}
/// <summary>
/// 重置子弹时间
/// </summary>
public void ResetSpeedbreaker()
{
isSpeedbreaker = false;
speedbreakerTime = 0;
Time.timeScale = 1;
blurEffectTween.Kill();
postProcessVolume.weight = 0;
AudioManager.Instance.SetBkMusic(true, 2);
AudioManager.Instance.ClearIndividually("BulletTimeCycle");
}
/// <summary>
/// 重置关卡
/// </summary>
public void ResetLevel()
{
UIManager.Instance.ResourcesShowUI<LoadUI>((ui) =>
{
ui.SetAction(() =>
{
UIManager.Instance.AsynShowUI<GameUI>((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();
});
}
/// <summary>
/// 设置关卡配置
/// </summary>
/// <param name="level"></param>
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);
}
}
/// <summary>
/// 设置行驶距离
/// </summary>
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<GameUI>()?.ShowOperatingRange(operatingRange, endPos);
}
}
}
/// <summary>
/// 计算分数
/// </summary>
public void SetdangerousOvertakingScore(float value)
{
dangerousOvertakingScore += value;
UIManager.Instance.GetUI<GameUI>().SetExtraScore(value);
}
/// <summary>
/// 得到关卡进度
/// </summary>
/// <returns></returns>
public float GetSchedule()
{
return operatingRange / levelConfig.End;
}
/// <summary>
/// 得到分数
/// </summary>
/// <returns></returns>
public float GetScore()
{
return totalScore;
}
/// <summary>
/// 胜利
/// </summary>
public void Victory()
{
ResetSpeedbreaker();
Scenes.Instance.SetGameState(E_GameState.GameVictory);
UIManager.Instance.HideUI<GameUI>();
UIManager.Instance.AsynShowUI<VictoryUI>();
mapManager.GameOver();
player.FireInit();
player.skill.Clear();
player.skinCar.OpenFrontLight();
}
/// <summary>
/// 暂停
/// </summary>
public void Suspend()
{
player.RunningSound(false);
isSuspend = true;
Time.timeScale = 0;
}
/// <summary>
/// 游戏结束
/// </summary>
public void GameOver()
{
ResetSpeedbreaker();
UIManager.Instance.HideUI<GameUI>();
DelayedProcessingManager.Instance.DelayDoSecond(this, 1, () =>
{
UIManager.Instance.AsynShowUI<ResurgenceUI>();
});
Scenes.Instance.SetGameState(E_GameState.GameOver);
}
/// <summary>
/// 复活
/// </summary>
public void Resurgence()
{
ResetSpeedbreaker();
UIManager.Instance.ResourcesShowUI<LoadUI>((ui) =>
{
ui.SetAction(() =>
{
mapManager.GameOver();
UIManager.Instance.HideUI<ResurgenceUI>();
player.Resurgence();
mapManager.ResurgenceInit();
}, () =>
{
Scenes.Instance.SetGameState(E_GameState.Gameing);
player.RunningSound(true);
});
ui.Load();
});
}
/// <summary>
/// 回到大厅
/// </summary>
public void BackHall()
{
Time.timeScale = 1;
player.RunningSound(false);
UserDataManager.Instance.TrySkillOver();
UIManager.Instance.ResourcesShowUI<LoadUI>((ui) =>
{
ui.SetAction(() =>
{
UIManager.Instance.DeleteUI<GameUI>();
UIManager.Instance.DeleteUI<ResurgenceUI>();
UIManager.Instance.DeleteUI<SettlementUI>();
UIManager.Instance.DeleteUI<VictoryUI>();
UIManager.Instance.DeleteUI<SuspendUI>();
CachePoolManager.Instance.Clear();
}, () =>
{
Scenes.Instance.hallScene.SkipInit();
});
ScenesLoadManager.Instance.AsynLoadScene(MyConstant.HallScene, () =>
{
ui.Load();
});
});
}
/// <summary>
/// 得到惊险超车次数
/// </summary>
/// <returns></returns>
public int GetJudgmentOvertakingNumber()
{
judgmentOvertakingNumber++;
if (judgmentOvertakingNumber > 10)
{
judgmentOvertakingNumber = 10;
}
recordJudgmentOvertakingNumbe = judgmentOvertakingNumber;
return judgmentOvertakingNumber;
}
/// <summary>
/// 设置总惊险超车数
/// </summary>
public void SetTotaiJudgmentOvertakingNumbe()
{
totaiJudgmentOvertakingNumbe++;
}
/// <summary>
/// 得到撞车次数
/// </summary>
/// <returns></returns>
public int GetCarAccidentNumber()
{
return carAccidentNumber;
}
/// <summary>
/// 设置总惊险超车数
/// </summary>
public void SetGetCarAccidentNumbe()
{
carAccidentNumber++;
}
/// <summary>
/// 设置惊险超车次数
/// </summary>
public void SetJudgmentOvertakingNumber()
{
judgmentOvertakingNumber = 0;
if (recordJudgmentOvertakingNumbe != 0)
{
UIManager.Instance.GetUI<GameUI>().SetMultipleState();
}
}
/// <summary>
/// 续倍乘
/// </summary>
public void Multiple()
{
judgmentOvertakingNumber = recordJudgmentOvertakingNumbe;
UIManager.Instance.GetUI<GameUI>().SetEventType(E_ShowEventType.JudgmentOvertaking, (GameNumericalValue.JudgmentOvertakingAwardMoney * judgmentOvertakingNumber).ToString());
UIManager.Instance.GetUI<GameUI>().SetCloseCall(judgmentOvertakingNumber);
}
/// <summary>
/// 开始游戏
/// </summary>
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);
}
/// <summary>
/// 生成终点
/// </summary>
public void GenerateEnd(float distance)
{
YooAssetManager.Instance.LoadAssetAsync<GameObject>(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);
});
}
/// <summary>
/// 倒计时
/// </summary>
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>();
gameUI.SetCountDownkeepOut();
gameUI.SetCountDown(3.ToString(), E_CountDownType.Three);
gameUI.SetCountdownEnds(false);
player.GetReady(E_CountDownType.Three);
AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync<AudioClip>(PackagesName.GameData, "CountDown"));
DOTween.To(() => countdow, value => countdow = value, 2, 1.3f).OnComplete(() =>
{
AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync<AudioClip>(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<AudioClip>(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<AudioClip>(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);
});
});
});
});
}
/// <summary>
/// 中途倒计时
/// </summary>
public void HalfWayCountdown()
{
int value = 3;
UIManager.Instance.GetUI<GameUI>().SetCountDown(value.ToString(), E_CountDownType.Three);
AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync<AudioClip>(PackagesName.GameData, "CountDown"));
DOTween.To(() => value, x => value = x, 2, 1).OnComplete(() =>
{
UIManager.Instance.GetUI<GameUI>().SetCountDown(value.ToString(), E_CountDownType.Two);
AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync<AudioClip>(PackagesName.GameData, "CountDown"));
DOTween.To(() => value, x => value = x, 1, 1).OnComplete(() =>
{
UIManager.Instance.GetUI<GameUI>().SetCountDown(value.ToString(), E_CountDownType.One);
AudioManager.Instance.PlaySound(YooAssetManager.Instance.LoadAssetSync<AudioClip>(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<AudioClip>(PackagesName.GameData, "GO"));
UIManager.Instance.GetUI<GameUI>().SetCountDown("GO!!!", E_CountDownType.GO);
UIManager.Instance.GetUI<GameUI>().SetCountdownEnds(true);
isSuspend = false;
}).SetUpdate(true);
}).SetUpdate(true);
}).SetUpdate(true);
}
}