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