游戏的navmesh 与rvo动态避障算法(1)

本文探讨了手游中navmesh在复杂地形寻路的应用,对比了AstarPathfinding和Unity官方navmesh系统的优缺点。作者在实际使用中发现AstarPathfinding的RVO系统在某些情况下不符合需求,转而采用RVO2进行测试,发现其性能和行为表现更优。因此,作者计划基于RVO2构建自己的定点数navmesh系统,允许使用外部美术调整的navmesh网格。后续可能分享更多实现细节和遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    目前很多手游中如果需要寻路,很多时候复杂地形都是需要用到navmesh,而比较常用的navmesh 系统 :1.astarpathfinding :一个老外开发的寻路插件,内置有很多寻路模块,recast动态namvesh,navmesh(使用插件自己导出的静态navmesh网格),rvo模块,并且拥有自己的一套定点数系统,稍微修正下,便能用于在帧同步游戏上,并且拥有源码,非常方便。2,unity官方的navmesh 系统,在github上推送了自己的navmeshcomponent之后,运行时动态生成navmesh也变成可能,相比astarpathfinding更简单的界面和使用,一个NavMeshAgent基本就能达到需求,但是因为其封闭性,各方面api的使用和某些隐形规则,会成为精通其的障碍之一。虽然其bake的navmesh可动态保存在prefab和场景中,但是如果要手动调整navmesh,则变成不可能,不能满足某些特定的需求。如果单从这些方面来说,或许astarpathfing可能是一个更好的选择。

       但是本人在使用中发现astarpathfinding的rvo系统在某些情况下的预期并不符合我的需求(unity的符合需求,但是封闭,所以不做考虑),遂用rvo2系统和astarpathfing的rvo系统进行了demo测试,在性能上rvo2的性能略优于其的rvo,行为表现上也更符合我的预期。因此,选择基于rvo2,做一套自己的定点数navmesh系统,并且可以使用外部美术调整过的namvesh网格。

    具体实现细节和想法还有问题如果后续有时间会进行补充。在此先放上图片。(因

### 使用RVO实现Unity中物体间的碰撞避免 为了实现在Unity中利用RVO(Reciprocal Velocity Obstacles)算法进行有效的碰撞避免,可以采用一种混合方案。具体来说,在遇到原生插件无法满足需求的情况下——即当多个单位密集时会出现重叠现象[^1],可以通过引入`NavMeshAgent`组件作为补充措施。 对于希望仅依赖于RVO来进行局部避障的情况,则可以根据描述创建自定义的RVO代理类并将其附加到目标对象上。该过程涉及几个关键步骤: #### 创建RVO Agent脚本 编写一个名为`RVOAgent.cs`的新C#脚本来表示每一个参者的属性以及行为逻辑。此脚本负责初始化参者的位置信息至RVO模拟环境中,并定期更新其速度向量以反映当前意图方向。 ```csharp using UnityEngine; public class RVOAgent : MonoBehaviour { private int agentId; void Start() { // 将当前位置注册进RVO仿真环境内,并获取唯一标识符agentId agentId = RVOSimulator.AddAgent(transform.position); } void Update() { Vector3 desiredVelocity = CalculateDesiredVelocity(); // 更新RVOSimulator中的对应实体的速度参数 RVOSimulator.SetAgentPrefVelocity(agentId, desiredVelocity); // 获取由RVO计算得出的安全移动距离 Vector3 newPosition = RVOSimulator.DoStep(agentId); transform.position = newPosition; // 应用新的坐标值给游戏物件本身 } } ``` 这里假设存在一个静态类`RVOSimulator`提供了必要的接口函数用于操作内部维护的一组活动个体及其交互规则。上述代码片段展示了如何在每一帧刷新周期里调整角色位置的同时确保不会其他临近者发生冲突。 #### 配置导航网格代理 考虑到单纯依靠第三方库可能难以获得理想的结果,因此建议同时部署一套完整的路径寻找机制配合即时反应式的障碍物规避策略共同作用。为此可以在场景底部铺设一张覆盖整个可通行区域却不设限任何阻碍物的特殊类型的`NavMeshSurface`资源;此同时为所有潜在会发生接触的对象实例化关联有`NavMeshAgent`的行为控制器,不过需要注意关闭自动寻径选项以便专注于处理近距离内的相对位移变化。 这种方法不仅能够充分利用引擎内置的功能优势,而且还能灵活应对复杂的动态状况下的安全间距保持问题。
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值