Unity 交通系统

本文介绍了在Unity中手动创建交通系统的实现过程,包括手绘道路、信号灯控制及车辆智能行驶逻辑。交通系统未使用物理引擎,而是通过自行计算确保车辆行驶和转弯的平滑。车辆能根据路况自动调整速度并避免碰撞。文章还探讨了未来可能的自动化道路生成方案。
摘要由CSDN通过智能技术生成

                                                          效果图

一、实现的功能

道路都是手绘,信号灯也需要手动摆,并设置红绿状态。现在也在考虑用经纬度自动生成道路,然后自动生成交通系统,只是比较复杂,还在筹划中。

这个交通系统,没有用物理系统,一是考虑到性能问题,二是用物理系统可靠性没自己计算高。但是不用物体系统也就有一个问题,转弯不能像正常车辆转弯,会有转弯跳动的感觉。

车辆路线在绘制路线中随机选择路线,不同路线可以合并,同一路线也可拆分。

车辆会自动计算前方车辆,或者阻碍点(红绿灯),然后改变速度,或者停车。

所有车辆在不同道路合并时也不会撞车。

 

二、实现原理

道路是单向的,所以可以用一条数据链表示一条道路。

    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
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值