本文长度为2703,预计阅读7分钟

前言

前阵子用Unity3d做的那个模拟收费的动画,主要是模拟了一个项目中的场景,让人看到更直观一些,最主要的目的还是最近在学习Unity3d,直接以实际项目应用的方式去学 习,这样掌握的会更快,本篇就是来拆解讲一下实现动画中车辆自动行驶的实现方法。

实现效果

上图中三辆汽车会沿着道路一直不停地行驶,实现永动的状态,我们就来看看达到上面的效果是怎么实现的。

实现思路

1.  把道路设置实现自动导航的效果

2.  设置行驶的路线点,生成一个行驶路线

3.  根据车辆当前位置计算初始要到的路线

4.  开始行驶

具体实现方法

微卡智享

01

设置导航路线

我们把道路的预制模型在视口中先摆放起来,完成我们道路的搭建。

新建一个Road的空组件,把所有的道路都一起放到这里,方便管理。

划重点

在Road的检查器右上角的静态的里中,要把Navigation static这个打上勾,只有这个打上勾后 ,导航组件才能进行烘焙,否则是无用的。

然后在window--AI--导航中点开组件,这样就会出来导航的设置界面

然后我们在烘焙项里把代理半径设置好,点击右下角的buke后,整个导航的路径就在左边渲染出来了,看上图左上角的蓝色区域就是,区域可以自己设置参数重新Clear和Buke进行调整,这样整个导航的路径我们就已经设置完成了。

02

车辆导航设置

我们在车的模型Car_21A中添加一个Nav Mesh Agent组件,在此组件中可以设置车辆的行驶速度,角速度等基本的参数,这里设置好后,车辆就可以实现导航的方式了。

但是如果只是这样直接运行,车辆是不会动的,要在代码中加入NavMeshAgent的使用,如下:

private NavMeshAgent nav;void Start(){nav = this.transform.GetComponent<NavMeshAgent>();nav.SetDestination(目录点);}

这样我们的车就会根据导航的线路直接过去了。

03

设置行驶线路

上面介绍的就是Unity3d里导航路线的简单使用,像我们项目中要实现无限循环的行驶,这样我们就要自己写实现方式了。

本身我们建模的道路就是建了一个环形的道理,所以我们想到实现路线,可以考虑在我们的道路上设置行驶的顺序点,生成一个列表,每当达到一个点后我们就再往列表中的下一个点进行行驶,当我们运行到列表点终点后,下一个点就是列表的起点,这个在基础的算法课中应该有讲过。

如上图中,我们把道路上四个直行的道路模型,按照车运行的顺时针方向标出了0-3的顺序记号,并且在右边把这四个模型也改了相应的名称加后面的序号,下面我们就开始在代码中开始实现。

需要注意

设置运行线路的脚本挂载到我们的车辆上,当程序运行时,找到当前的车的坐标离设置的路线中坐标最近的为初始目标点,判断这个初始目标点需要注意的是,首先要判断车辆运行方向内最近的,如果行驶的点在车的后方,我们就不再判断,防止车辆调头后行驶成反方向了。如下图

车离的0点最近,如果只按最近距离计算,会先去0点,再从一点过去,这样开始行驶时会直接调头往0点的方向行驶,当到达时再调头往一的方向行驶,所以我们这里要考虑是按车头方向判断最近距离的点 ,就是直接去找1点的坐标,忽略到背后的点。

新建一个NavCar的C#脚本,然后增加到车的预制件中,我们用VS2019打开脚本后进行编辑。

public class NavCar : MonoBehaviour
{//定义接收导航网络组件private NavMeshAgent nav;//坐标点列表private List<Vector3> destpoints;//导航下一个坐标点private int nextindex;//离导航坐标点的距离 private float calcdist = 5f;private float dist = 0f;void Start(){//将定义的路线加入到List列表中destpoints = new List<Vector3>();destpoints.Add(GameObject.Find("RoadPoint0").transform.position);destpoints.Add(GameObject.Find("RoadPoint1").transform.position);destpoints.Add(GameObject.Find("RoadPoint2").transform.position);destpoints.Add(GameObject.Find("RoadPoint3").transform.position);//获取当前车辆的NavMeshAgentnav = this.transform.GetComponent<NavMeshAgent>();//计算最近的点,获取下一点的序号Vector3 navpoint = this.transform.position;for (int i = 0; i < destpoints.Count; ++i){//首先判断点在当前位置的前方还是后方,如果是后方不做计算Vector3 dir = destpoints[i] - navpoint;float dot = Vector3.Dot(transform.forward, dir);//判断点在前方时才计算最近的点的距离if (dot > 0){float tmpdist = Vector3.Distance(destpoints[i], navpoint);if (dist == 0){dist = tmpdist;nextindex = i;}else if (dist > tmpdist){dist = tmpdist;nextindex = i;}}}}void Update(){//判断距离是否在到达范围内,如果在走到一下个点if (Vector3.Distance(this.transform.position, destpoints[nextindex])< calcdist){if (nextindex == destpoints.Count - 1){nextindex = 0;}else{nextindex++;}}nav.SetDestination(destpoints[nextindex]);}
}

上面的Start函数中我们就是开始计算当前车辆离我们线路中最近的点,然后在update的中判断是否到达目标点了,如果目标点到达则继续行驶到下一个目标点。

这样我们导航的循环行驶就实现了。

扫描二维码

获取更多精彩

微卡智享

「 往期文章 」

学习|C#线程中AutoResetEvent的使用

学习|C#的EventHandler的委托使用

unity3D练习

学习|Unity3d的导航实现循环线路移动相关推荐

  1. 学习|Unity3D使用协程实现减速停车效果

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为4303字,预计阅读11分钟 前言 上一篇<学习|Unity3d的导航实现循环线路移动>讲了一下定制循环行驶路线的方 ...

  2. 学习机器人SLAM导航核心技术(一)

    本章节,我们将学习基于SLAM导航的机器人技术. 学习资料主要参照张虎的<机器人SLAM导航核心技术与实战>和高翔的<视觉SLAM十四讲>. 以机器人SLAM导航核心技术与实战 ...

  3. Python学习笔记__1.5章 循环

    # 这是学习廖雪峰老师python教程的学习笔记 1.for循环遍历 1.遍历名字 names = ['Michael', 'Bob', 'Tracy'] for name in names: pri ...

  4. python学习笔记(15)循环设计

    python学习笔记(15)循环设计 原链:http://www.cnblogs.com/vamei/archive/2012/07/09/2582435.html 注意:zip()在python2 ...

  5. Java学习笔记2.5.2 循环结构 - 计数循环

    文章目录 零.本讲学习目标 一.计数循环概念 二.计数循环使用 (一)语法格式 (二)执行流程 (三)案例演示 任务1.演示死循环(永真循环) 任务2.计算1 + 2 + 3 + -- + 100的值 ...

  6. sql server 循环_学习SQL:SQL Server循环简介

    sql server 循环 Loops are one of the most basic, still very powerful concepts in programming – the sam ...

  7. 制作滚球游戏学习Unity3D

    从创建项目开始 创建一个项目 打开unity,在Projects中可以查看当前的本地项目或者云端项目,点击New project或者右上角的New都可以新建项目. 然后在1处填写创建项目的名称,2处选 ...

  8. 深度学习与计算机视觉教程(11) | 循环神经网络及视觉应用(CV通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/37 本文地址:https://www.showmeai.tech/article-d ...

  9. 【Unity3D基础教程】给初学者看的Unity教程(零):如何学习Unity3D

    转自:https://www.cnblogs.com/neverdie/p/How_To_Learn_Unity3D.html(http://www.cnblogs.com/neverdie/) Un ...

最新文章

  1. linux一键安装包
  2. Nature | 机器学习在药物研发中的应用
  3. 【游记】NOIP 2017
  4. vue mianjs 引用css_vue 学习记录八——webpack中常见的配置项
  5. 文字投影_店铺门口投影灯,引领店铺新潮流
  6. C++编程问题--glibc detected *** ./a.out: munmap_chunk(): invalid pointer: xxxxxx
  7. 大众汽车宣布联手AWS开发汽车工业云
  8. 主机名包含中文导致无法访问MAC虚拟机
  9. 计算机硬盘突然只有一个c盘,win10硬盘消失了只剩下c盘怎么恢复_win10硬盘突然消失只有c盘解决方法-win7之家...
  10. python3.6对MySQL数据恢复
  11. sqlserver数据库得管理及维护
  12. dispatch_once造成的死锁问题
  13. 基于短时时域处理中短时能量和过零率的语音端点检测方法
  14. 新体制SAR——BiDi SAR
  15. su、sudo命令和限制root远程登录
  16. redis分布式锁的安全性及与zookeeper的对比
  17. 给我五分钟,带你彻底掌握 MyBatis 缓存的工作原理
  18. Rockchip 红外遥控开发指南
  19. 使用FreeType实现矢量字体的粗体、斜体、描边、阴影效果
  20. LevalSet水平集分割算法 matlab程序源码

热门文章

  1. 华硕主板如何用u盘启动计算机,华硕主板u盘启动是按f几_华硕主板BIOS设置U盘启动的方法-win7之家...
  2. ValueError: operands could not be broadcast together with shapes (320,320,4) (3,) (320,320,4)
  3. 利用语义分割(FCN)区分两种有文字和无文字区域
  4. onlyoffice 回调传参数_如何安装和配置OnlyOffice
  5. 网易126邮箱服务器设置,网易闪电邮企业邮箱设置教程(POP3)
  6. mysql order by多列_mysql 多列索和order by
  7. React Conf 2018 专题 —— React Today and Tomorrow Part II 视频中英双语字幕
  8. ICASSP2020一些主题演讲
  9. 珠宝VIP客户该怎么管理?
  10. 破2亿!罗永浩的商业价值到底有多深?