using Config.config;
using System.Collections.Generic;
using UnityEngine;
///
/// 路段
///
public partial class SectionRoad : MonoBehaviour
{
///
/// 最大索引
///
[HideInInspector] public int maxIndex;
///
/// 最小索引
///
[HideInInspector] public int minIndex;
///
/// 记录最大索引
///
private int recordMaxIndex;
///
/// 记录最小索引
///
private int recordMinIndex;
///
/// NPC车节点
///
public Transform npcCarNode;
///
/// 左建筑群
///
public GameObject leftBuilding;
///
/// 右建筑群
///
public GameObject rightBuilding;
///
/// 车道
///
public List lane;
///
/// 生成点
///
public List generatePoints;
///
/// NPC车
///
private List npcCars = new List();
///
/// 火车
///
private List trains = new List();
///
/// 路障
///
private List roadblockObjs = new List();
///
/// 生成距离
///
private List generatingDistance = new List() { 0, -15, -30, -45, -60 };
///
/// 初始化
///
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);
}
}
///
/// 初始化车道数
///
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();
}
}
///
/// 生成路障
///
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(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);
}
}
}
}
///
/// 两者一致
///
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();
}
///
/// 返回空车道
///
///
public (Vector3, int) GetEmptyLane()
{
List ints = new List { 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);
}
}
}
///
/// 车放回缓存池
///
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();
}
///
/// 路障放回缓存池
///
public void PutRoadblockObjs()
{
for (int i = 0; i < roadblockObjs.Count; i++)
{
CachePoolManager.Instance.Put(roadblockObjs[i].gameObject);
}
roadblockObjs.Clear();
}
///
/// 设置建筑群
///
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);
}
///
/// 设置建筑主题
///
public void SetBuildingTheme(LevelConfig levelConfig)
{
GameObject building;
switch (levelConfig.Theme)
{
case "Country":
building = Instantiate(YooAssetManager.Instance.LoadAssetSync(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(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(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(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(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(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(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(PackagesName.GameData, "RightDesertBuilding"));
building.transform.SetParent(rightBuilding.transform);
building.transform.localEulerAngles = Vector3.zero;
building.transform.localScale = Vector3.one;
building.transform.localPosition = Vector3.zero;
break;
}
}
///
/// 得到当前显示车道数
///
///
public int GetCurrentLaneNumber()
{
int number = 0;
for (int i = 0; i < lane.Count; i++)
{
if (lane[i].activeInHierarchy)
{
number++;
}
}
return number;
}
///
/// 得到出生点
///
///
public (Vector3, int) GetBirthPoint()
{
int randomIndex = Random.Range(minIndex + 1, maxIndex);
return (lane[randomIndex].transform.position + transform.forward * 20, randomIndex);
}
}