unity--城市道路车辆行驶

2023-10-26

目录

1.示意图

 1.1行驶路线与红绿灯

2. 层级面板

2.1红绿灯

 2.2车辆路径点

 3.属性面板

3.1红绿灯

3.2路径点

4.脚本代码

4.1 控制脚本

4.2红绿灯脚本

4.3路径点脚本

4.4车辆控制脚本

5.实现效果


1.示意图

 1.1行驶路线与红绿灯

2. 层级面板

2.1红绿灯

 2.2车辆路径点

除了四个角-其余路口均有4个路径点

 3.属性面板

3.1红绿灯

3.2路径点

 

4.脚本代码

4.1 控制脚本

using UnityEngine;

public class RoadContr : MonoBehaviour
{
    public TrafficLight[] trafficLights; // 红绿灯数组
    public WayPoint[] wayPoints; //路径
    public Transform pare;
    [SerializeField]
    private Map_Car[] fabCar;

    private int carNum = 0;

    private void OnEnable()
    {
        InvokeRepeating("CarCreate", 1, 1);
    }

    private void CarCreate()
    {
        if (carNum < 50)
        {
            carNum++;
            Map_Car car = Instantiate(fabCar[Random.Range(0, 10)], pare);
            WayPoint way = wayPoints[Random.Range(0, wayPoints.Length)];
            car.transform.position = way.transform.position;
            car.Init(way);
        }
        else
        {
            CancelInvoke("CarCreate");
        }
    }
}

4.2红绿灯脚本

using UnityEngine;

public class TrafficLight : MonoBehaviour
{
    private bool isBegin = false;

    private float redTime;
    public bool isRed = false;

    private void OnEnable()
    {
        redTime = Random.Range(3, 15);
        isBegin = true;
    }

    private void Update()
    {
        if (!isBegin)
        {
            return;
        }
        redTime -= Time.deltaTime;
        if (redTime <= 0)
        {
            isRed = !isRed;
            redTime = Random.Range(3, 15);
        }
    }
}

4.3路径点脚本

using System.Collections.Generic;
using UnityEngine;

public class WayPoint : MonoBehaviour
{
    [Header("0上1下2左3右")]
    [SerializeField]
    private List<int> Direction = new();

    [Header("下一路径点")]
    public List<WayPoint> nextWayPoints_1;
    public List<WayPoint> nextWayPoints_2;
    [Header("当前路径点所属红绿灯")]
    public TrafficLight trafficLight;

    /// <summary>
    /// 0上1下2左3右
    /// </summary>
    [HideInInspector]
    public int directionSelect = -1;


    private int randomNum = -1;
    /// <summary>
    /// 获取下一路径点
    /// </summary>
    /// <returns></returns>
    public WayPoint GetNextWayPoint()
    {
        if (Direction.Count == 1)
        {
            directionSelect = Direction[0];
            if (nextWayPoints_1.Count == 1)
            {
                return nextWayPoints_1[0];
            }
            else
            {
                return nextWayPoints_1[Random.value < 0.5 ? 0 : 1];
            }
        }
        else
        {
            randomNum = Random.value < 0.5 ? 0 : 1;
            directionSelect = Direction[randomNum];
            if (randomNum == 0)
            {
                if (nextWayPoints_1.Count == 1)
                {
                    return nextWayPoints_1[0];
                }
                else
                {
                    return nextWayPoints_1[Random.value < 0.5 ? 0 : 1];
                }
            }
            else
            {
                if (nextWayPoints_2.Count == 1)
                {
                    return nextWayPoints_2[0];
                }
                else
                {
                    return nextWayPoints_2[Random.value < 0.5 ? 0 : 1];
                }
            }
        }
    }

}

4.4车辆控制脚本

using UnityEngine;

public class Map_Car : MonoBehaviour
{
    private WayPoint curWay;       // 当前路径点
    private WayPoint nextWay;       // 下一路径点
    private TrafficLight trafficLight;
    public float moveSpeed = 3f;        // 车辆移动速度
    public float minDistance = 2f;      // 最小车距

    private bool canMove = true;

    private bool isBegin = false;

    private Vector3 nextWaypointPos;
    private Quaternion currentWaypointRot;
    private Vector3 targetDirection;

    [SerializeField]
    private int direction = -1;

    public void Init(WayPoint cur_way)
    {
        curWay = cur_way;
        nextWay = curWay.GetNextWayPoint();
        trafficLight = curWay.trafficLight;

        nextWaypointPos = nextWay.transform.position;
        direction = curWay.directionSelect;
        switch (direction)
        {
            case 0:
                currentWaypointRot = Quaternion.Euler(0, 180, 0);
                break;
            case 1:
                currentWaypointRot = Quaternion.Euler(0, 0, 0);
                break;
            case 2:
                currentWaypointRot = Quaternion.Euler(0, 90, 0);
                break;
            case 3:
                currentWaypointRot = Quaternion.Euler(0, 270, 0);
                break;
        }
        // 计算车辆朝向下一个路径点的方向
        targetDirection = nextWaypointPos - transform.position;
        targetDirection.y = 0f; // 将方向的y轴分量设为0,使车辆在平面上移动
        targetDirection.Normalize(); // 归一化方向向量

        isBegin = true;
    }

    private void Update()
    {
        if (!isBegin) { return; }

        // 如果车辆离当前路径点很近,则停下来等待红灯
        if (Vector3.Distance(transform.position, nextWaypointPos) <= 2.5f)
        {
            // 获取当前路口的红绿灯状态
            if (trafficLight.isRed)
            {
                switch (direction)
                {
                    case 0:
                    case 1:
                        canMove = false;
                        break;
                    case 2:
                    case 3:
                        canMove = true;
                        break;
                }
            }
            else
            {
                switch (direction)
                {
                    case 0:
                    case 1:
                        canMove = true;
                        break;
                    case 2:
                    case 3:
                        canMove = false;
                        break;
                }
            }
            if (Vector3.Distance(transform.position, nextWaypointPos) <= 0.1f)
            {
                Init(nextWay);
            }
        }

        if (canMove)
        {
            // 否则,根据车辆移动速度向前移动
            transform.Translate(targetDirection * moveSpeed * Time.deltaTime, Space.World);
            transform.rotation = Quaternion.Lerp(transform.rotation, currentWaypointRot, 0.1f); // 平滑旋转到目标方向

            // 检查前方是否有其他车辆,并保持车距
            RaycastHit hit;
            if (Physics.Raycast(transform.position, -transform.forward, out hit, minDistance))
            {
                moveSpeed = 0f;
                //Debug.DrawRay(transform.position, -transform.forward * minDistance, Color.red);
            }
            else
            {
                // 否则,继续移动
                moveSpeed = 3f; // 恢复车辆移动速度
                //Debug.DrawRay(transform.position, -transform.forward * minDistance, Color.green);
            }
        }
    }
}

5.实现效果

城市道路

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unity--城市道路车辆行驶 的相关文章

  • halfShader 模型切割

    Shader Unlit halfShader Properties Diffuse Diffuse Color 1 1 1 1 MainTex Texture 2D white StartCutoff StartCutoff Range
  • unity粒子特效附上贴图后播放动画

    转自 http jingyan baidu com article f96699bbb1a0d6894f3c1b77 html 参考 http www unitymanual com thread 2993 1 1 html dsign a
  • UnityLuaMvvM Lua 带通知的Mode类

    实现数据更新UI自动刷新的核心代码 欢迎关注https gitee com xiongks UnityMVVM mode function modeType local obj obj modeType modeType obj filds
  • unity game界面按下play会不断闪烁,按下暂停键(pause)或者中止/下一步(step),game界面的画面会接连变化

    没找到答案 改了两个下午的程序 改完还是这样 后来发现是FixedUpdate Update与OnDrawGizmos的问题 OnDrawGizmos是每帧都会绘制 用FixedUpdate理所当然就那啥了 分析的时候 就突然想到是不是这俩
  • Unity 资源加载卸载过程

    什么时候才是UnusedAssets 看一个例子 Object obj Resources Load MyPrefab GameObject instance Instantiate obj as GameObject Destroy in
  • 【Unity&C#&随机数】随机数

    一个简单的随机数获得 0或1 使用了这样的代码 想要获得0或者1 if Input anyKeyDown float i 1 if i 1 i Random Range 0 Rang i i lt 0 5 0 1 Debug Log Cou
  • unity网络资源导入

    1 找到需要导入的文件 这里导入fbx格式 2 打开unity界面 在Asset目录下创建文件夹FBX 将需要导入的fbx预制体或整个文件夹拖入创建的FBX文件夹下 3 选中需要的fbx预制体并拖至场景中 4 双击定位到当前物体 5 找到需
  • FBX导入Unity中模型没有材质的处理

    一 3dMax导出FBX时的注意事项 导出时 确保maps文件存在 里面放着fbx用到的image 二 在Unity中的设置 1 文件拖入Unity的Assets文件夹中 2 查看模型的材质是否存在 如下所示 材质为None 此时拖入sce
  • Unity动画控制器animator.CrossFade

    需要特别注意 1 CrossFade虽然可以不用任何逻辑来链接而直接跳转 但是CrossFade只能覆盖其他动画 当当前动画播放完毕而没有跳出这个动画时再次调用CrossFade将会失败 造成动画依旧停在原位 参数animator Cros
  • Unity中按钮检测鼠标状态

    改方法主要是用于按钮检测鼠标的进入 滑出 点击 抬起 长按 长按停止 1 先将下面这个脚本挂载到需要检测鼠标状态的按钮上 using System Collections using System Collections Generic u
  • Unity3d 插件 系列——DoTweenPro介绍(图文详细+案例)

    Unity3d 插件 系列 DoTweenPro介绍 图文详细 案例 前言 一 DoTweenPro简介 二 DoTweenPro安装 三 DoTweenPro主要组件 1 DoTweenAnimation 2 DoTweenPath 3
  • Unity与Android的Back键冲突解决

    Unity与Android的Back键冲突解决 上一篇的最后留下了两个问题 Unity视图下横屏闪退 Unity视图下Android无法响应back返回上一activity 对于第一个问题 应该是Unity横屏下视图的某些设置跟Androi
  • Unity 键盘控制人物移动——之输入方式代码的编写

    键盘输入 控制人物移动 在我们制作游戏中最常见的需求之一就是使用键盘移动游戏角色 那么我们首先需要获取键盘输入 以下提供两种方法获取键盘 这里尽量通过截图解释让大家理解代码的含义 GetInput void FixedUpdate Move
  • unity实现鼠标右键控制视角

    主要实现的功能是相机跟随主角 鼠标右击移动后 相机的视角会旋转 思路 在主角里创建空的子物体 把相机绑在空物体上 通过旋转空物体来实现视角的旋转 要把相机调整到适当位置 代码如下 public float rotateSpeed 100 设
  • Unity万向节死锁解决方案(2023/12/4)

    1 万向节死锁无法解决 这是因为它的特性就是如此 就像玻璃杯就是玻璃 这不可否认 别钻牛角尖昂 2 大多数情况下欧拉角足够用 例如 CF 摄像机不可能绕z轴旋转 x轴旋转也不会超过九十度 因为那样人物的腰子会被扭断 塔防游戏 保卫萝卜 吃鸡
  • unity3d image组件不显示

    需要将UI组件放到画布下面
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • 游戏开发常见操作梳理之NPC药品商店系统(NGUI版)

    后续会出UGUI Json的版本 敬请期待 游戏开发中经常会出现药品商店 实际操作与武器商店类似 甚至根据实际情况可以简化设置 废话不多说 直接上代码 药品商店的源码 using System Collections using Syste
  • 游戏开发之常见操作梳理——武器装备商店系统(NGUI版)

    游戏开发中经常出现武器商店 接下来为你们带来武器装备商店系统的具体解决办法 后续出UGUI Json版本 敬请期待 武器道具的具体逻辑 using System Collections using System Collections Ge
  • 游戏开发中常见系统梳理之背包系统的实现一

    游戏中几乎都存在大大小小的背包系统 接下来我将讲述背包系统具体是如何实现的 完整源码 以下是使用unity NGUI实现 使用txt配置的方法 后续更新UGUI Json实现的背包系统敬请期待 背包中的物品我们常常将其制作成预设体 通过改变

随机推荐

  • 暴力密码原理与防御

    一 密码概述 密码的作用 加密 一些机密文件 需要加密防止被其他人查看 一般用base64加密 MD5加密 完整性 加密的内容 要防止被其他人修改 就要用哈希算法等进行验证 身份认证 用户身份鉴别 我们QQ 支付宝 微信等账户就要密码登录
  • uniapp创建Vue3项目总结

    一 创建项目 选择新建uni app项目 输入项目名称 选择项目文件存放的位置 选择项目需要的模板 选择Vue 3 版本 点击创建 即可创建V3项目 二 vue3 main js配置引用示例 import App from App impo
  • 使用拼写检查提高Tesseract OCR准确性

    使用拼写检查提高Tesseract OCR准确性 上一篇博客介绍了如何使用textblob库和Tesseract自动进行OCR文本 然后将其翻译为其他语言 这篇博客还将通过textblob应用自动拼写检查OCR文本来提高OCR准确性 能够使
  • jar包扫描工具: gamma

    1 简介 本项目是一个jar包扫描工具 可以支持插件化订制不同的扫描逻辑 支持以下功能 插件化订制扫描逻辑 让扩展更加容易 将扫描到的文件加载到jvm中以class的形式返回给处理插件 让扫描逻辑写起来更加的容易 支持springBoot
  • 位运算(按位与 、按位或、按位异或、取反、左移右移)

    位运算 与 0 0 0 0 1 0 1 0 0 1 1 1 或 0 0 0 0 1 1 1 0 1 1 1 1 异或 0 0 0 0 1 1 1 0 1 1 1 0 1 按位与运算 双目运算符 其功能是参与运算的两数对应的二进位相与 只有对
  • UE4 像素流的一些使用技巧

    一 测试像素流的三种方法 前提是熟悉官网像素流送那套流程 这里只是讲如何不用打包就能测试的方法 1 第一种方法是vs安装unrealvs扩展 因为安装这个拓展后加可以加命令行参数启动项目https docs unrealengine com
  • 2W薪资必备技能 —— Python接口自动化测试

    目录 一 基础准备 1 环境搭建 2 接口基础知识 2 1 接口分类 2 2 接口请求类型 二 Requests 快速上手 1 requests基础 1 1 发送请求 1 2 参数传递 1 3 接口响应 1 4 接口其他处理 2 reque
  • 理解GC日志

    33 125 GC DefNew 8003K gt 570K 9216K 0 0085326 secs 8003K gt 6714K 19456K 0 0087219 secs Times user 0 00 sys 0 00 real 0
  • 文件洞的处理

    存储引擎经常要面对的一个问题 就是洞的处理 一些思路 1 如果可以 重用现有空间 而不是增加文件大小 比如在hash store中 新value比旧value的长度小 2 使用Segment File 而不是一个抽象的大文件 3 现有seg
  • 【OpenCV-Python】32.OpenCV的人脸检测和识别——人脸检测

    32 OpenCV的人脸检测和识别 人脸检测 文章目录 前言 一 基于Haar的人脸检测 1 使用Haar级联分类器检测人脸 2 使用Haar级联分类器检测猫脸 3 使用Haar级联分类器检测人脸的框架式程序 4 使用Haar级联分类器检测
  • Mybatis之 ${}和#{}区别及动态传入表名

    和 区别 能防止sql注入 不能 方 式 一 般 用 于 传 入 数
  • 系统架构设计师之用例之间的关系:包含、扩展、泛化

    系统架构设计师之用例之间的关系 包含 扩展 泛化
  • Spring session 浏览器sessionId与服务器不一致解决方案

    项目情况 spring boot 和spring session 版本都是 2 0 2 RELEASE 问题描述 请求项目接口后浏览器保存的sessionId与服务器不一致 拿Postman测试如下图 网上找了很久都没发现有人发过这个问题
  • iOS编程基础-Swift(三)-变量与简单类型

    Swift入门指南 iOS9 Programming Fundamentals With swift 第三章 变量与简单类型 深入介绍变量的声明和初始化 介绍所有主要的Swift內建简单类型 这里的简单是相对 集合 说的 第四章会介绍主要的
  • 你所担心的公共Wi-Fi安全问题,痛客们正在想办法

    你是否看过这样的新闻 在公共场所连接免费Wi Fi 然后手机里的个人信息 和银行账号中的钱 瞬间就被 取走 了 而这也造成了如今很多人虽然走到哪儿都会问Wi Fi密码 但一听是公共Wi Fi就摇头的结果 贵州高科控股集团有限公司的主管易延飞
  • ssh用户密码正确但是登录时却报被拒绝

    问题 有时候 在使用SSH登录到服务器时 明明密码正确 但是登录时候却报被拒绝 这是什么原因呢 解决思路 1 此时我们可以查看Linux服务器的安全日志文件 var log secure 若无异常可以看到如下类似报错异常 Oct 6 21
  • 微信小程序开发

    微信小程序开发2023 7 14 7 19 黑马程序员官方文档 https pan baidu com s 1crZTQdIZ7OSDkZIpIWkhYw pwd 1234 vant Weapp 类似element ui的组件库 https
  • 《Graph Learning专栏》 : 高密子图挖掘

    本周我们介绍另一图上的 聚类 算法 高密子图挖掘 Dense Subgraph Mining 这类算法与社群检测不同的是处理的数据对象是异构图 节点的类型不是单一的 同类型节点之间一般没有边 社群检测需要对整张图的节点进行社区划分 而高密子
  • 医学图像——《Difficulty-aware Meta-learning for Rare Disease Diagnosis》

    Lequan Yu Difficulty aware Meta learning for Rare Disease Diagnosis 摘要 这篇文章提出元学习方法解决罕见疾病分类问题 使用 ISIC 2018 skin lesion 分类
  • unity--城市道路车辆行驶

    目录 1 示意图 1 1行驶路线与红绿灯 2 层级面板 2 1红绿灯 2 2车辆路径点 3 属性面板 3 1红绿灯 3 2路径点 4 脚本代码 4 1 控制脚本 4 2红绿灯脚本 4 3路径点脚本 4 4车辆控制脚本 5 实现效果 1 示意