zoukankan      html  css  js  c++  java
  • UE导航系统详

    配置

    Crowd Manager Class 代理人管理类 可以自定义个

    • Auto Create Navigation Data 导航数据在没有的情况下自动生成并有边界
    • Allow Client Side Navigation 允许客户端单边导航
    • Initial Building Locked 最初构建锁定,如果设置为ture将导致导航系统不重建直到调用ReleaseInitialBuildingLock() 为止
    • Skip Agent Height Check when Picking Nav data 跳过代理人的高度验证在采集导航数据时
    • Data Gathering Mode 数据收集模式,即时、懒惰 。。没其他介绍
    • Dirty Areas Update Freq 脏区域更新频率

    Generate Navigation Only Around Navigation Invokers 生成导航时仅在导航周围调用,如果启用整个界都可导航,导航网格数据将停止使用,使用导航draw就可看出效果
    Active Tiles Update Interval 激活瓦片更新频率

    Agents

    Supported Agents 支持的代理人
    Default Query Extent 导航查询范围:以Actor为中点向外扩展,如果范围内有导航就使用

    Agent的SetupHeight:越高矮的东西越过的越多。
    NavigationMesh AgentSlope:高坡生成的导航会影响,还和Radius相关

    寻路原理

    NavMeshBoundVolume可选择代理(Agents)生成导航网格数据,未选的代理不会生成数据,代理可调颜色,瓦片大小,代理人步高,半径之类的。
    Pawn会自动设置自身代理数据半径,在寻路时依自身代理半径寻找相近的寻航网格数据进行寻路。

    原代码解读寻路

    GameplayTask,AITask,AITask_MoveTo, static AIMoveTo,这是UE的任务架构,那些要一步步完成的逻辑可利用任务架构完成。
    寻路功能就是任务架构完成的。结果存于Task中,和以前夺回颜色写那个寻路的执行类似,这个变成了task形式。

    问题:

    能不能按半径寻路? 能
    不同的代理人有什么作用? 不同的代理人生成不同的导航网格数据。
    代理与寻路组合的使用方式? 不同的导航网格数据可供不同半径角色使用。

    移动组件与导航配合

    UMovementComponent >> UNavMovementComponent
    NavigationSystem 方法 SimpleMoveToLocation 会 GetNavDataForProps(NavAgentProperties)
    UNavMovementComponent 里有 NavAgentProperties
    NavAgentProperties:描述寻路代理人的数据结构
    程序开始后 NavigationSystem 调用 OnWorldInitDone 执行 RegisterNavData 到 AgentToNavDataMap里

    TMap与寻航

    作为TSet的继承,使用Hash来配对,对于一些自定义的数据结构,也会自定义GetTypeHash。
    利用重载,GetTypeHash实现了不同类型的数据结构自定义Hash值被TSet使用。

    inline uint32 GetTypeHash(const FNavAgentProperties& A)
    {
    	return ((int16(A.AgentRadius) << 16) | int16(A.AgentHeight)) ^ int32(A.AgentStepHeight);
    }
    

    Character与寻航

    Character 使用34,88 初始化CapsuleComponent,之后 CharacterMovement->UpdateNavAgent(*CapsuleComponent),NavAgentProperties数据会被设置。
    在下一个TICK
    编辑器赋与capsule的值改变capsule,但UpdateNavAgent不会再执行了,所以会造成导航代理不匹配

    Default Query Extent

    NavAgentProperties里没有这个属性
    Default Query Extent 默认查询范围,和 ProjectPointToNavMesh 有关。投影点到导航网格。因为有时指定的点可能不在导航网格上。

    UPathFollowingComponent 组件

    在移动组件寻找导航代理配置,根据配置值找导航网格数据,根据导航网格数据找路径,将路径送给UPathFollowingComponent 组件。

    Pawn与寻航

    Pawn里有UpdateNavAgent,移动组件的 NavAgentProperties 在 PAWN 里初始设置的值会被覆盖(步高不会被覆盖)。于PostInitializeComponents。
    Pawn的半径会和导航设置的不相同,NavigationSystem GetNavDataForProps会找导航数据,没有就找半径相近导航数据使用。

    可以给不同的导航区域(NavModifierVolume)设置费用。可以在搜索时利用区域费用作为筛选条件(NavigationQueryFilter)。

    https://blog.csdn.net/haisong1991/article/details/80505850

    其他

    引擎配置重启才能更新
    UNavMovementComponent的NavAgentProps会被赋值,哪怕bUpdateNavAgentWithOwnersCollision设为false,这是为什么呢?
    当前的解决方案:在BeginPlay后再赋值于NavAgentProperties

  • 相关阅读:
    Luogu P4071 [SDOI2016]排列计数
    CF 961E Tufurama
    Luogu P2057 [SHOI2007]善意的投票
    Luogu P2756 飞行员配对方案问题
    POJ2151
    POJ 3349&&3274&&2151&&1840&&2002&&2503
    POJ 2388&&2299
    EZ 2018 03 30 NOIP2018 模拟赛(六)
    POJ 1459&&3436
    BZOJ 1001: [BeiJing2006]狼抓兔子
  • 原文地址:https://www.cnblogs.com/mattins/p/8966800.html
Copyright © 2011-2022 走看看