OvertakingLegend/Assets/Script/SectionRoad/SectionRoad.cs

321 lines
11 KiB
C#

using Config.config;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 路段
/// </summary>
public partial class SectionRoad : MonoBehaviour
{
/// <summary>
/// 最大索引
/// </summary>
[HideInInspector] public int maxIndex;
/// <summary>
/// 最小索引
/// </summary>
[HideInInspector] public int minIndex;
/// <summary>
/// 记录最大索引
/// </summary>
private int recordMaxIndex;
/// <summary>
/// 记录最小索引
/// </summary>
private int recordMinIndex;
/// <summary>
/// NPC车节点
/// </summary>
public Transform npcCarNode;
/// <summary>
/// 左建筑群
/// </summary>
public GameObject leftBuilding;
/// <summary>
/// 右建筑群
/// </summary>
public GameObject rightBuilding;
/// <summary>
/// 车道
/// </summary>
public List<GameObject> lane;
/// <summary>
/// 生成点
/// </summary>
public List<Transform> generatePoints;
/// <summary>
/// NPC车
/// </summary>
private List<NPCCar> npcCars = new List<NPCCar>();
/// <summary>
/// 火车
/// </summary>
private List<Train> trains = new List<Train>();
/// <summary>
/// 路障
/// </summary>
private List<GameObject> roadblockObjs = new List<GameObject>();
/// <summary>
/// 生成距离
/// </summary>
private List<int> generatingDistance = new List<int>() { 0, -15, -30, -45, -60 };
/// <summary>
/// 初始化
/// </summary>
public void Init()
{
minIndex = 0;
maxIndex = lane.Count - 1;
recordMaxIndex = maxIndex;
recordMinIndex = minIndex;
for (int i = 0; i < lane.Count; i++)
{
lane[i].gameObject.SetActive(true);
}
}
/// <summary>
/// 初始化车道数
/// </summary>
public void InitLaneNumber(int number)
{
int currenLaneNumber = GetCurrentLaneNumber();
bool isShow = currenLaneNumber > number ? false : true;//是否是显示
bool isLeft = false;
for (int i = 0; i < Mathf.Abs(currenLaneNumber - number); i++)
{
isLeft = ProbabilityManager.Instance.GetPercent(50);
if (isShow)
{
if (minIndex == recordMinIndex)
{
isLeft = false;
}
else if (maxIndex == recordMaxIndex)
{
isLeft = true;
}
}
if (isLeft)//从左开始
{
if (isShow)
{
lane[--minIndex].gameObject.SetActive(true);
}
else
{
lane[minIndex++].gameObject.SetActive(false);
}
}
else
{
if (isShow)
{
lane[++maxIndex].gameObject.SetActive(true);
}
else
{
lane[maxIndex--].gameObject.SetActive(false);
}
}
SetBuilding();
}
}
/// <summary>
/// 生成路障
/// </summary>
public void GenerateRoadblock(SectionRoad sectionRoad)
{
PutRoadblockObjs();
for (int i = 0; i < sectionRoad.lane.Count; i++)
{
if (lane[i].activeInHierarchy && !sectionRoad.lane[i].activeInHierarchy)
{
for (int j = 0; j < 3; j++)
{
GameObject roadblockObj = CachePoolManager.Instance.Take(YooAssetManager.Instance.LoadAssetSync<GameObject>(PackagesName.GameData, "Roadblock"));
roadblockObj.transform.position = lane[i].transform.position + Vector3.right * (300 - j * 20);
roadblockObj.transform.localEulerAngles = Vector3.zero;
roadblockObj.transform.localScale = Vector3.one;
roadblockObjs.Add(roadblockObj);
}
}
}
}
/// <summary>
/// 两者一致
/// </summary>
public void BothAreConsistent(SectionRoad sectionRoad)
{
for (int i = 0; i < sectionRoad.lane.Count; i++)
{
this.lane[i].gameObject.SetActive(sectionRoad.lane[i].activeInHierarchy);
}
this.minIndex = sectionRoad.minIndex;
this.maxIndex = sectionRoad.maxIndex;
SetBuilding();
}
/// <summary>
/// 返回空车道
/// </summary>
/// <returns></returns>
public (Vector3, int) GetEmptyLane()
{
List<int> ints = new List<int> { 0, 1, 2, 3, 4, 5 };
int number;
while (true)
{
number = ints[Random.Range(0, ints.Count)];
if (lane[number].activeInHierarchy && occupationIndex.Find(s => s.index == number) == null)
{
return (lane[number].transform.localPosition, number);
}
else
{
ints.Remove(number);
}
}
}
/// <summary>
/// 车放回缓存池
/// </summary>
public void PutCar()
{
for (int i = 0; i < npcCars.Count; i++)
{
CachePoolManager.Instance.Put(npcCars[i].gameObject);
}
for (int i = 0; i < trains.Count; i++)
{
CachePoolManager.Instance.Put(trains[i].gameObject);
}
npcCars.Clear();
trains.Clear();
}
/// <summary>
/// 路障放回缓存池
/// </summary>
public void PutRoadblockObjs()
{
for (int i = 0; i < roadblockObjs.Count; i++)
{
CachePoolManager.Instance.Put(roadblockObjs[i].gameObject);
}
roadblockObjs.Clear();
}
/// <summary>
/// 设置建筑群
/// </summary>
public void SetBuilding()
{
leftBuilding.transform.localPosition = new Vector3((lane[minIndex].transform.localPosition - Vector3.right * 13f).x, leftBuilding.transform.localPosition.y, 0);
rightBuilding.transform.localPosition = new Vector3((lane[maxIndex].transform.localPosition + Vector3.right * 13f).x, rightBuilding.transform.localPosition.y, 0);
}
/// <summary>
/// 设置建筑主题
/// </summary>
public void SetBuildingTheme(LevelConfig levelConfig)
{
GameObject building;
switch (levelConfig.Theme)
{
case "Country":
building = Instantiate(YooAssetManager.Instance.LoadAssetSync<GameObject>(PackagesName.GameData, "LeftCountryBuilding"));
building.transform.SetParent(leftBuilding.transform);
building.transform.localEulerAngles = Vector3.zero;
building.transform.localScale = Vector3.one;
building.transform.localPosition = Vector3.zero;
building = Instantiate(YooAssetManager.Instance.LoadAssetSync<GameObject>(PackagesName.GameData, "RightCountryBuilding"));
building.transform.SetParent(rightBuilding.transform);
building.transform.localEulerAngles = Vector3.zero;
building.transform.localScale = Vector3.one;
building.transform.localPosition = Vector3.zero;
break;
case "City":
building = Instantiate(YooAssetManager.Instance.LoadAssetSync<GameObject>(PackagesName.GameData, "LeftCityBuilding"));
building.transform.SetParent(leftBuilding.transform);
building.transform.localEulerAngles = Vector3.zero;
building.transform.localScale = Vector3.one;
building.transform.localPosition = Vector3.zero;
building = Instantiate(YooAssetManager.Instance.LoadAssetSync<GameObject>(PackagesName.GameData, "RightCityBuilding"));
building.transform.SetParent(rightBuilding.transform);
building.transform.localEulerAngles = Vector3.zero;
building.transform.localScale = Vector3.one;
building.transform.localPosition = Vector3.zero;
break;
case "MountainousRegion":
building = Instantiate(YooAssetManager.Instance.LoadAssetSync<GameObject>(PackagesName.GameData, "LeftMountainousRegionBuilding"));
building.transform.SetParent(leftBuilding.transform);
building.transform.localEulerAngles = Vector3.zero;
building.transform.localScale = Vector3.one;
building.transform.localPosition = Vector3.zero;
building = Instantiate(YooAssetManager.Instance.LoadAssetSync<GameObject>(PackagesName.GameData, "RightMountainousRegionBuilding"));
building.transform.SetParent(rightBuilding.transform);
building.transform.localEulerAngles = Vector3.zero;
building.transform.localScale = Vector3.one;
building.transform.localPosition = Vector3.zero;
break;
case "Desert":
building = Instantiate(YooAssetManager.Instance.LoadAssetSync<GameObject>(PackagesName.GameData, "LeftDesertBuilding"));
building.transform.SetParent(leftBuilding.transform);
building.transform.localEulerAngles = Vector3.zero;
building.transform.localScale = Vector3.one;
building.transform.localPosition = Vector3.zero;
building = Instantiate(YooAssetManager.Instance.LoadAssetSync<GameObject>(PackagesName.GameData, "RightDesertBuilding"));
building.transform.SetParent(rightBuilding.transform);
building.transform.localEulerAngles = Vector3.zero;
building.transform.localScale = Vector3.one;
building.transform.localPosition = Vector3.zero;
break;
}
}
/// <summary>
/// 得到当前显示车道数
/// </summary>
/// <returns></returns>
public int GetCurrentLaneNumber()
{
int number = 0;
for (int i = 0; i < lane.Count; i++)
{
if (lane[i].activeInHierarchy)
{
number++;
}
}
return number;
}
/// <summary>
/// 得到出生点
/// </summary>
/// <returns></returns>
public (Vector3, int) GetBirthPoint()
{
int randomIndex = Random.Range(minIndex + 1, maxIndex);
return (lane[randomIndex].transform.position + transform.forward * 20, randomIndex);
}
}