321 lines
11 KiB
C#
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);
|
|
}
|
|
} |