一.综述

赛车游戏源码下载:http://fanshubbs.com/thread-255-1-1.html

赛车游戏的敌人赛车自动寻路一般有两种方式,一种是路点寻路,另外一种就是使用Unity自带组件NavMeshAgent进行寻路了,我介绍的是后者,另外后者在水平面上的汽车寻路导航还不错,但是一旦有Y方向的爬坡、下坡等,汽车就会因为角度依然保持水平显得很不自然,并且轮胎也不会旋转,我对此进行了优化

二.NavMeshAgent

这个和NavMesh是一对,用来设置寻路的游戏对象。关于属性,我不再一一介绍,我就距我的设置来说一下: 
 
1.AgentSize

如下图中,那个圆柱形就是NavMeshAgent了,其中AgentSize调整到更好适合车辆就可以了;

急速赛车:http://fanshubbs.com/thread-262-1-1.html

 
2.Stopping Distance 
我将Stopping Distance设置为0,是因为,我每次都会将寻路目标设置为下一个道路监测点,如果Stopping Distance设置为大于0的话,就会看到车辆会不停地减速加速减速加速,不够连贯; 
3.Speed 
这个我最后查出来的它的尺寸是M/S,所以我设置的它的速度是47km/h,当然我的游戏赛道比较难跑,设置这个值比较合适。 
4.Auto Traverse Off Mesh Link 
这个指的是是否自动通过OffMeshLink,我这里没有什么特殊需求,不需要有些OffMeshLink需要设置才能通过,自然是自动通过最好了。 
5.Obstacle Avoidance Quality 
然后属性Obstacle Avoidance Quality是值的躲避障碍物的质量,对于我的游戏来说,障碍物只有一种,那就是封路用的,如下图中的导流牌,这个导流牌就添加了组件Nav Mesh Obstacle,它的作用就是动态的用作障碍物,如果隐藏掉这个组件或者直接隐藏掉组件所在的对象,障碍物效果就没有了,图中的道路就又通了 

三.NavMesh

NavMesh就是NavMeshAgent就来赖以前行的寻路网格,将自己需要作为寻路路径的那部分游戏对象设置为NavMesh Static,然后再Navigation中进行Bake烘焙即可。 
如下图 
 
我将所有的道路到设置为了NavMesh Static,然后烘焙后蓝色区域就覆盖了整个道路。 
需要注意的是道路有可能有不平整的地方,需要自己将道路检查一遍,如果哪些地方有断裂,需要铺平道路后重新烘焙 
 
上图中也需要设置Agent信息,作用就是用来根据代理进行烘焙,因为代理Radius Height的不同都会导致烘焙结果的不同。 
比如你将Agent Radius设置得较大,路面上的蓝色区域就会越窄,因为NavMesh会考虑给路两边留够距离。 
然后Max Slope的设置就得考虑车辆最高爬坡角度了。 
接下来就是对断裂地带实在没办法连接的地方进行处理了

四.Off Mesh Link

这个是专门对断裂地带进行连接的,如下图 
 
由于坡度过大,无法贯通,于是使用Off Mesh Link。 
1.首先在自动汽车对象上添加组件Off Mesh Link。 
2.然后分别点击左边需要连接的木板和右边需要连接的木板,点击Navigation,选择Object选项卡,会出现Generate OffMeshLinks选项打钩,重新Bake,如下图 
 
3.分别将左右木板对象拖曳到自动汽车的OffMeshLink组件的Start和End属性上,这样在两个木板间就会出现一个弧形的桥,连接两端。这样道路就导通了,车辆会飞跃过去。

5.NavMeshAgent.SetDestination

直接设置自动寻路汽车的寻路目标是终点显然是不合适的。想要寻路汽车可以规规矩矩按照既定的路线前行,需要不断地更新目标点,到前方一个较近的位置。 
我就使用的是当汽车碰到第一个道路监测点后,设置目标为下一个道路监测点,这样汽车就会不断地往前行进了。 
注:我在开发时遇到一个问题,就是汽车到某个点后停止不动了。最后发现原因是,由于汽车身上的NavMeshAgent比较大,导致先接触到下一个道路监测点,这个时候,道路监测点还没有碰撞到汽车,导致没能再去设置下一个寻路目标,解决办法就是把车身上的Agent设置的较小一些,车的碰撞体靠前一些,这样每次都是先检测到碰撞,而还没有到达寻路目的地。

6.修正汽车上下坡时车辆未倾斜的问题

我发现使用NavMeshAgent给汽车做寻路导航,缺点就是汽车只会在水平面上转弯,上坡下坡的时候还是水平的,不会沿着坡道做倾斜,我想原因是因为这个Agent也可以给人用的缘故吧,因为人上下坡时身体不会沿着坡道做倾斜。 
刚开始我试图直接修改汽车游戏对象的Rotation,发现一直受Agent的干扰。最后想到的解决办法就是: 
由于汽车车体/轮胎其实都是汽车对象的子对象,我直接修改子对象的角度就好了。并不会受到Agent的干扰。 
我的做法是每次设置自动寻路汽车的下一个寻路目标时,顺便设置汽车角度,如下:

//设置敌人自动寻路汽车的下一个寻路目标点private void SetEnemyCarDestionation(int index){//假如当前游戏模式是竞赛模式if (ConfigurationManager.Instance.CurrentGameModel == ConfigurationManager.GameModel.RacingModel) {//获取下一个道路监测点Vector3 vec = GetTheEnemyPlayerNextCollider(index).transform.position;//设置敌人的下一个寻路目标           _enemyPlayerMeshAgent[index].SetDestination(vec);//获取敌人的车体(是敌人游戏对象的子对象)的当前TransformTransform currentEnemyTrans = _enemyPlayers[index].transform;//计算车体面向下一个监测点,需要的四元数Quaternion rotation = Quaternion.LookRotation(vec - currentEnemyTrans.position);//设置角度,使车辆面向下一个监测点_enemyPlayersManager[index].TurnCarDirection(rotation);}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

7.修改自动寻路汽车,车轮不转动的问题

由于自动寻路汽车,并不是 物理意义上的汽车,WheelCollider并没有用。我看一个教程上使用的WayPoint方法,是可以实现物理意义上的寻路的。 
所以我想给自动寻路汽车加上一个比较看起来真实的转动轮胎。 
也就是说,随着汽车速度的加快,轮胎转动变快,速度变慢,轮胎转动变慢。 
所以需要从速度转换出当前每秒转多少度: 
设当前汽车速度为N m/s, 
轮胎半径为R m 
则汽车转速为 N / (2 * R * π) 
汽车轮胎每秒转N / (2*R*π) * 360° 
代码如下:

    void FixedUpdate(){_angularSpeed = (_thisCarNavMesh.velocity.magnitude / _wheelCircle) * 360 * 0.2f;for (int i = 0; i < Wheels.Length; i++) {Wheels[i].Rotate(Vector3.right, _angularSpeed * Time.fixedDeltaTime);}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

其中参数0.2f,是我根据效果写的修正参数,不然轮胎转的角度太大,导致效果不好。

使用Unity3D 自主实战开发的赛车游戏实例相关推荐

  1. 使用Unity3D 自主实战开发的赛车游戏实例,关键点记录 (一)之赛车游戏总体介绍

    我之前一直在做C# 的Winform多媒体软件开发.从去年十一月份开始转型自学Unity3D.发现对这个领域.这个方向更为喜爱.在经过两个多月的跟书自学.跟游戏实例教程练习之后,决定自己完成一款游戏, ...

  2. Threejs系列--9游戏开发--沙漠赛车游戏【基础场景渲染】

    Threejs系列--9游戏开发--沙漠赛车游戏[基础场景渲染] 序言 准备工作 目录结构 代码一览 index.js代码 index.css代码 Camera.js代码 Sizes.js代码 App ...

  3. Threejs系列--11游戏开发--沙漠赛车游戏【初步加载地面】

    Threejs系列--11游戏开发--沙漠赛车游戏[初步加载地面] 序言 目录结构 代码一览 world/index.js代码 world/Floor.js代码 materials/Floor.js代 ...

  4. Threejs系列--22游戏开发--沙漠赛车游戏【布置游戏开始场景】

    Threejs系列--22游戏开发--沙漠赛车游戏[布置游戏开始场景] 序言 目录结构 代码一览 index.js代码 Objects.js代码 Materials.js代码 materials/Fl ...

  5. Threejs系列--10游戏开发--沙漠赛车游戏【基础事件处理器】

    Threejs系列--9游戏开发--沙漠赛车游戏[基础事件处理器] 序言 目录结构 代码一览 Time.js代码 EventEmitter.js代码 Sizes.js代码 Application.js ...

  6. Threejs系列--16游戏开发--沙漠赛车游戏【loading与start切换效果】

    Threejs系列--16游戏开发--沙漠赛车游戏[loading与start切换效果] 序言 目录结构 新增依赖 代码一览 world/index.js代码 代码解读 运行结果 序言 本章将使页面中 ...

  7. Threejs系列--14游戏开发--沙漠赛车游戏【纹理贴图之loading加载】

    Threejs系列--14游戏开发--沙漠赛车游戏[纹理贴图之loading加载] 序言 目录结构 代码一览 world/index.js代码 Application.js代码 代码解读 运行结果 序 ...

  8. jpct-ae开发3D赛车游戏

    http://magicbird.iteye.com/blog/1578367 jpct-ae开发3D赛车游戏博客分类: jpct ae jpct-ae游戏引擎的资料比较少,本人是在官网中hellow ...

  9. Threejs系列--18游戏开发--沙漠赛车游戏【loading资源加载进度条】

    Threejs系列--18游戏开发--沙漠赛车游戏[loading资源加载进度条] 序言 目录结构 代码一览 AreaFloorBorderBufferGeometry.js代码 AreaFloorB ...

最新文章

  1. centos7 lvm管理 把/home空间转移给/
  2. git代码回滚的几种方式
  3. 算法练习5---快速排序Java版
  4. python实现实时监控_基于 Python 的交换机实时监控系统的设计与实现
  5. linux批量去掉文件名前缀,linux 批量删除某个前缀文件
  6. ios 在UIView上画图,线条
  7. jboss、weblogic介绍
  8. 软件工程实验报告一软件开发准备及Visio应用
  9. 使用python进行数学建模系列1 读表格 +简单处理+ 画图简单入门 代码可直接运行
  10. 显卡故障软件测试,显卡软硬件故障检查与排除实战
  11. DICOM 开源工具汇总
  12. 周志华 机器学习ppt
  13. 摘录:《晨间日记的奇迹》
  14. python数字式时钟_数字时钟案例学习python函数及时间库
  15. 医保种类及医疗保险待遇
  16. 神奇的Navigator对象
  17. unity应用实例——从头撸一个全新的FPS游戏(1)
  18. 常用汉字的UNICODE和对应的繁体字
  19. 记录一次服务器技术选型
  20. emacs Linux Java编程环境_emacs的工作环境设置

热门文章

  1. CloudComparePCL 点云按网格划分(点云分幅)
  2. 第六届蓝桥杯大赛个人赛决赛(软件类)真题 Java语言B组 答案
  3. 好心情医生建议:精神病人要做好这4点
  4. 【Android】Android Studio 1.5+ 中混合调试Native和Java代码
  5. 使用VSTS进行压力和性能测试(一)——创建基础的URL压力测试
  6. centos7 安装配置ceph
  7. 同等学力申硕你必须知道的三件事!!!
  8. 基于51单片机的酒精浓度检测量仪proteus仿真程序原理图设计数码管液晶LCD1602显示
  9. PeopleSoft开发:创建页面PAGE
  10. 真我GT realme GT root权限 解锁BL 刷ROOT教程 免费 TWRP