此文将介绍4种实现动态障碍的方法,2种基于navmesh,2种基于astar算法。

1.基于navmesh。

  1.制作场景障碍:

    a.有几个独立的障碍物,就定义几个user area,即,一个场景仅仅支持一个字节数目的独立障碍物

      

    b.建立碰撞盒建立障碍物:

      碰撞盒是可行走区域。

      

    c.设置碰撞盒gameobject的navigation面板的object页签的navigation area属性:

      每个独立障碍物对应一个前面步骤a中定义的area,如果几个障碍一起动态生成或消失,则可以使用同一个area

      

  2.代码控制这些动态障碍物的生成和消失:

    障碍物消失是它的碰撞盒区域加入navmesh寻路mask中,即障碍物区域可行走,生成是不加入mask中,该区域不可行走

开启或关闭第几个door:_door += 2;//因为前面有3个内置area:walkable,not walkable和jump,假如_door=1,即_door+=2后_door=3, 下面的1<<3后1在右起第4个字节,即对于第4个area:door1
if (_flag > 0)//flag>0表示开门,即障碍物消失,该碰撞盒区域可行走,需把该area位  置为1
{navmesh_mask_ |= (1 << _door);
}
else
{navmesh_mask_ &= (~(1 << _door));//该area位  置为0
}

  3.真正用到的地方(上面所有的工作服务的对象,其实也是此动态障碍解决方法的思考起点,我就是想知道CalculatePath的第3个参数的作用才找到此解决方法的):

    所谓障碍物,影响的就是寻路!当障碍物消失时我们需要让此区域可行走,没消失时不可行走,下面是寻路代码:

NavMeshPath nav_path = new NavMeshPath();
if (NavMesh.CalculatePath(src_pos, dis_pos, navmesh_mask_, nav_path))

    即,通过控制calculatepath的第3个参数navmesh_mask实现动态障碍的控制:navmesh_mask每个位对应一个area,当某个area对应的位是0时寻路认为不可行走,1则可行走。

  总结:此方法简单明了,并且navmesh功能是官方提供的,性能方面占优。但这个动态障碍物必须是预先摆好的,不能像lol中亚索的盾牌那样“随意区域”动态,不过一般这种假动态就已经足够项目使用了。

   看来要继续研读navmesh文档,看官方有没有提供解决真动态障碍的方案了。

  更新更新:打脸了,打脸了,用NavMesh Obstacle组件就能轻易让一个gameobject变成障碍物并重新计算寻路网格,这个好啊,是真动态!明天测试一下。

  再次更新再次更新:因为使用navmesh_mask的方式不需要重构寻路网格,所以性能很好,所以把navmesh_mask和navmesh obstacle结合起来使用:

        固定位置的动态障碍物使用navmesh_mask,不固定位置的动态障碍物使用navmesh obstacle,这样也不算打脸了=。=

2.基于astar,动态障碍物状态更新时,都需要重新计算“可行走”网格,即把障碍物所在区域改成可行走,重新设置整个网格的“可行走”区域,让寻路变得正确。这个astar插件已经基本做好了,读者可以查阅其文档即可。

  大致说一下2种解决方法:

    1.astar的动态障碍物实例脚本是这样的:一个带collider的gameobject,每次移动都调用一下:

      AstarPath.active.UpdateGraphs(oldbounds);AstarPath.active.UpdateGraphs(newbounds);//oldbounds表示旧位置的bounds,new表示新位置的包围盒立方体

      其实就是刷新一下网格某个区域,对这个区域的每个网点检测:如果被带collider的物体占,则不可行走,否则可行走。这明显可以解决随意位置动态障碍问题,并且用法简单,可以考虑。

    2.还有另外一种方法,也是我目前项目使用的:不依赖collider,直接输入一个bounds,然后把这个bounds和整个网格相交,得到需要更新的bounds区域,然后直接对整个区域的网点node进行设置是否可行走:

GridGraph mGridGraph=null;
NavGraph[] graphs = AstarPath.active.graphs;
for(...)
{if (graphs[i] is GridGraph){mGridGraph = graphs[i] as GridGraph;break;}
}
...//计算需要设置的网点外壳
mGridGraph.nodes[z * mGridGraph.width+x].Walkable = pWalkAble;

本文总结:本文基于navmesh给出了2种解决方法,实际应用时可以结合起来提高性能,基于astar也提出了2种解决方法。

转载于:https://www.cnblogs.com/Tearix/p/6919439.html

unity 4种实现动态障碍方法相关推荐

  1. Unity三种物体溶解方法

    Unity三种物体溶解方法 @[TOC](Unity三种物体溶解方法 效果展示 1. 利用Noise纹理进行溶解 shader要点 shader代码 2. 屏幕空间棋盘格 shader要点 shade ...

  2. Unity 在代码中 动态改变RectTransform位置及宽高 的方法整理

    原文链接(尊重原著):[100个 Unity实用技能] | Unity 在代码中 动态改变RectTransform位置及宽高 的方法整理_unity 修改recttransform_呆呆敲代码的小Y ...

  3. Android布局动态化,一种基于堆积木思想的卡片式Android动态布局方法与流程

    本发明涉及android界面布局,特别是一种基于堆积木思想的卡片式Android动态布局方法. 背景技术: 在Android流行的今天,android App在生活中使用日益广泛,相对PC,手机由于界 ...

  4. html5 页面回退,一种基于浏览器堆栈管理的H5页面动态回退方法与流程

    本技术应用于在浏览器运行的H5应用中,涉及浏览器的History历史堆栈管理技术,尤其是移动端H5应用在浏览器中的History历史堆栈管理技术. 背景技术: 移动端H5应用作为一款基于浏览器历史堆栈 ...

  5. Unity(游戏)中五种数据存储的方法

    Unity(游戏)中五种数据存储的方法 一.PlayerPrefs unity3d提供了一个用于本地持久化保存与读取的类-------PlayerPrefs.工作原理很简单,以键值对的形式将数据保存在 ...

  6. arcgis android gif,一种基于动态地图符号的移动GIS可视化方法与流程

    本发明具体涉及一种基于动态地图符号的移动GIS可视化方法动态地图符号的技术领域 背景技术: 随着移动设备的高度集成化和处理器的快速发展,终端设备的计算和处理能力不断增强,移动GIS的应用领域越来越广泛 ...

  7. Unity的几种移动和旋转方法

    Unity的几种移动和旋转方法 Unity的移动 基础框架 匀速移动 变速移动 自定义变速运动 最终代码: Unity的几种旋转方法 Unity的移动 在制作一款游戏的时候,经常需要对物体的位置进行移 ...

  8. python代码:基于强化学习的智能电网的动态定价方法 摘要:提出了一种考虑服务提供商(SP)利润和用户(CUs)成本的分级电力市场中能量管理的动态定价DR算法

    python代码:基于强化学习的智能电网的动态定价方法 摘要:提出了一种考虑服务提供商(SP)利润和用户(CUs)成本的分级电力市场中能量管理的动态定价DR算法. 使用强化学习(RL)描述分层决策框架 ...

  9. 航测大数据量处理_一种基于动态航测的图像大数据分析方法与流程

    本发明涉及数据处理技术领域,具体为一种基于动态航测的图像大数据分析方法. 背景技术: 数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的 ...

最新文章

  1. Faster-RCNN 自己的数据训练
  2. 激光IMU融合——LIO-Mapping / LIOM / LINS / LIO-SAM算法解析
  3. boost::mpl::plus相关的测试程序
  4. 使用postman创建Marketing Cloud的Contact
  5. asp.net core系列 71 Web架构分层指南
  6. android jni 结构体_Android应用开发Android JNI-c/c++调用java方法
  7. JavaScript技巧[转载]
  8. oracle是delete可以加并行吗,提高Oracle DELETE性能的策略
  9. Android 数据存储和文件使用案例分析
  10. window安装python报错_win10下Python安装pycrypto报错
  11. 【个人笔记】OpenCV4 C++ 快速入门 04课
  12. Atitit mybatis 3 3.2 3.3  3.4 新特性attilax总结
  13. 类型转换操作符(C++)
  14. html+div+css+jquery+javascript的关系
  15. 虚拟现实中用到的五种定位追踪技术
  16. 生成可编辑的pdf(可java代码动态赋值)
  17. CPU卡电子现金qPBOC交易流程记录
  18. @WebServlet
  19. 高配置服务器组装电脑,小白DIY装机需睁大眼睛!点评几款网购组装电脑主机配置单...
  20. 理解 Joomla 的几个概念 - 读《Aprees.Begging.Joomla.From.Novice.to.Professional》

热门文章

  1. (七) shiro 加密与解密
  2. centos6.5下如何把python2.6.6升级到2.7
  3. pandas常见的时间处理函数
  4. schema约束文档与xml文件详解
  5. 你知道css单位fr吗?
  6. Dojo 如何测试 widget 1
  7. 如何创建一个数据科学项目? 1
  8. Linux下安装scikit-learn
  9. ant 驱动 svnkit 下载代码
  10. jquery.validate.js插件的使用方法