效果图
一、实现的功能
道路都是手绘,信号灯也需要手动摆,并设置红绿状态。现在也在考虑用经纬度自动生成道路,然后自动生成交通系统,只是比较复杂,还在筹划中。
这个交通系统,没有用物理系统,一是考虑到性能问题,二是用物理系统可靠性没自己计算高。但是不用物体系统也就有一个问题,转弯不能像正常车辆转弯,会有转弯跳动的感觉。
车辆路线在绘制路线中随机选择路线,不同路线可以合并,同一路线也可拆分。
车辆会自动计算前方车辆,或者阻碍点(红绿灯),然后改变速度,或者停车。
所有车辆在不同道路合并时也不会撞车。
二、实现原理
道路是单向的,所以可以用一条数据链表示一条道路。
public class RoadData
{
public List<string> _roadPoints = new List<string>();
public List<RoadData> _childRoads = new List<RoadData>();
}
一条道路的基本数据就如上面代码所示。
_roadPoints表示当前路段的所有点
_childRoads表示连接当前路段的下一路段(可能有多个)
public class RoadPoint
{
public string guid;
public Vector3 pos;
public bool canMove = true;
public TrafficLight trafficLight;
public List<TrafficMoveObject> trafficMoveObject = new List<TrafficMoveObject>();
}
这是 道路点的信息
唯一的guid、坐标点、当前是否是阻挡状态、受某个红绿灯影响
红绿灯阻挡原理,这里因为很清楚了,红绿灯会在切换状态时候改变点的canMove状态。
汽车移动会检测下一个目标点的状态,因此就可以保证在红灯时候停下。
public class TrafficLight : MonoBehaviour
{
public MeshRenderer LightRender;
public float redLightTime = 15;
public float greenLightTime = 15;
public float yellowLightTime = 2;
public LightType lightType;
public Action<bool> onLightChange;
private Material LightMat;
private float nowTime = 0;
private void Start()
{
if (LightRender != null)
LightMat = LightRender.materials[1];
SetMaterial();
ChangeRoadPoint();
}
private void Update()
{
CheckLightTime();
}
private void CheckLightTime()
{
nowTime += Time.deltaTime;
if (lightType == LightType.red)
{
if (nowTime >= redLightTime)
{
lightType = LightType.green;
if (onLightChange != null)
onLightChange.Invoke(true);
nowTime = 0;
SetMaterial();
}
}
if (lightType == LightType.green)
{
if (nowTi