UE4.27:获取以玩家为中心、排除小半径的随机导航点
解决UE4.27中AI环形漫游导航点生成问题
核心思路
要实现以玩家为中心、排除内部攻击半径的环形区域内的随机漫游导航点,需先在环形范围内生成均匀分布的随机坐标,再验证坐标的导航可用性,同时结合现有票务系统规避AI间的干扰。
具体实现步骤
1. 生成环形区域内的均匀随机坐标
直接生成线性随机半径会导致点集中在环形外侧,需通过极坐标转换生成均匀分布的点:
- 生成0到2π之间的随机角度
- 生成内半径到外半径之间的随机长度(对0-1的随机数开平方后,乘以内外半径差再加内半径,保证分布均匀)
- 将极坐标转换为基于玩家位置的世界坐标
C++ 代码示例
FVector GetRandomRingPoint(FVector PlayerLocation, float InnerRadius, float OuterRadius) { // 生成0到2π的随机角度 float Angle = FMath::FRandRange(0.f, 2.f * PI); // 生成环形内均匀分布的随机半径 float Radius = InnerRadius + FMath::Sqrt(FMath::FRand()) * (OuterRadius - InnerRadius); // 计算偏移量并转换为世界坐标 FVector Offset = FVector(FMath::Cos(Angle) * Radius, FMath::Sin(Angle) * Radius, 0.f); return PlayerLocation + Offset; }
蓝图实现逻辑
- 用
Random Float in Range生成0到6.28(2π)的随机角度 - 用
Random Float in Range生成0到1的随机数,取平方根后乘以(外半径-内半径),再加内半径得到随机半径 - 通过
Cos/Sin函数计算XY轴偏移量,与玩家位置相加得到目标坐标
2. 验证导航可用性与规避干扰
生成坐标后需做双重校验:
- 调用
Project Point to Navigation将坐标投影到导航网格,判断是否为有效导航点 - 结合现有票务系统,检查该点与当前攻击AI的距离是否大于「攻击半径+AI碰撞半径」,避免干扰攻击流程
3. 优化漫游稳定性
- 增加重试机制:若生成的点无法投影到导航网格,重新生成(设置3-5次重试上限,避免死循环)
- 为漫游AI添加动态避让:当检测到有AI正在攻击时,临时扩大环形外半径,或避开攻击AI的朝向区域
4. 导航查询过滤器方案(替代)
若坐标生成法稳定性不足,可自定义导航过滤规则:
- 创建
UNavigationQueryFilter子类,在过滤逻辑中排除玩家攻击半径内的区域 - 调用
Find Random Point in Navigable Radius时传入该过滤器,直接查询环形区域内的有效导航点
常见问题修正
- 点集中在环形外侧:检查随机半径生成逻辑,必须对随机数开平方保证均匀分布
- 导航点无效:确认导航网格覆盖环形区域,或增加重试次数
内容的提问来源于stack exchange,提问作者Nathan Tilly
相关产品推荐
相关产品推荐

