(UE4 4.20)UE4 如何判斷一個點是否在導航網格(Navigation)內
在遊戲中經常碰到一個需求,就是在整個地圖具備導航網格的位置生成物品。
如下所示:綠色的部分就是具備導航網格的
那麼我們怎麼判斷一個點是否在導航網格內呢?(也就是一個點是否是圖中綠色的那些部分)
UE4提供了UNavigationSystemV1類,可以獲取各種導航網格資訊。這裡我們利用到一個介面:
bool ProjectPointToNavigation(const FVector& Point, FNavLocation& OutLocation, const FVector& Extent = INVALID_NAVEXTENT, const FNavAgentProperties* AgentProperties = NULL, FSharedConstNavQueryFilter QueryFilter = NULL)。
看下面原始碼:
bool ProjectPointToNavigation(const FVector& Point, FNavLocation& OutLocation, const FVector& Extent = INVALID_NAVEXTENT, const FNavAgentProperties* AgentProperties = NULL, FSharedConstNavQueryFilter QueryFilter = NULL)
{
return ProjectPointToNavigation(Point, OutLocation, Extent, AgentProperties != NULL ? GetNavDataForProps(*AgentProperties) : GetDefaultNavDataInstance(FNavigationSystem::DontCreate), QueryFilter);
}
bool UNavigationSystemV1::ProjectPointToNavigation(const FVector& Point, FNavLocation& OutLocation, const FVector& Extent, const ANavigationData* NavData, FSharedConstNavQueryFilter QueryFilter) const
{
SCOPE_CYCLE_COUNTER(STAT_Navigation_QueriesTimeSync);
if (NavData == NULL)
{
NavData = GetDefaultNavDataInstance();
}
return NavData != NULL && NavData->ProjectPoint(Point, OutLocation
, FNavigationSystem::IsValidExtent(Extent) ? Extent : NavData->GetConfig().DefaultQueryExtent
, QueryFilter);
}
我們採用的是第一個ProjectPointToNavigation介面,引數相對來說比較簡單。這裡主要用到前面三個引數:
const FVector& Point:我們要判斷的輸入的位置點
FNavLocation& OutLocation:我們要找到的導航網格點
FVector& Extent = INVALID_NAVEXTENT: 尋找的距離範圍
總體上的意思就是:我們在Point位置,以Extent為範圍的"Box內”, 尋找最近的導航網格點,如果找到則返回true,並且把這個最近的導航網格點存入OutLocation.反之如果找不到,則返回false,並且OutLocation 等於 Point點。
這裡比較注意的是:Extend如果為零向量,則Extend會變為另外一個預設的查詢Extend向量,看下面原始碼。其實這很好理解,因為如果Extend真的為0,那麼輸入的點恰好位於導航網格內才會返回true, 其實這是不科學的,因為很難恰好,座標位置相差0.1都不行。
return NavData != NULL && NavData->ProjectPoint(Point, OutLocation
, FNavigationSystem::IsValidExtent(Extent) ? Extent : NavData->GetConfig().DefaultQueryExtent
, QueryFilter);
namespace FNavigationSystem
{
FORCEINLINE bool IsValidExtent(const FVector& Extent)
{
return Extent != INVALID_NAVEXTENT;
}
}
#define INVALID_NAVEXTENT (FVector::ZeroVector)
USTRUCT(BlueprintType)
struct ENGINE_API FNavDataConfig : public FNavAgentProperties
{
GENERATED_USTRUCT_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Display)
FName Name;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Display)
FColor Color;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Querying)
FVector DefaultQueryExtent;
這個在引擎Setting裡面配置,預設是FVector(50, 50, 250)
下面是我的演示程式碼:
UCLASS()
class MYPROJECT3_API ATestNavMyActor : public AActor
{
GENERATED_BODY()
UPROPERTY(EditAnywhere)
FVector extend;
}
void ATestNavMyActor::BeginPlay()
{
Super::BeginPlay();
UNavigationSystemV1* navigationSys = UNavigationSystemV1::GetCurrent(GetWorld());
if (nullptr == navigationSys)
{
UE_LOG(LogTemp, Warning, TEXT("there is not navigation"));
return;
}
FNavLocation navLocation;
if (navigationSys->ProjectPointToNavigation(GetActorLocation(), navLocation, extend))
{
UE_LOG(LogTemp, Warning, TEXT("YES navigation location %s"), *navLocation.Location.ToString());
}
else
{
UE_LOG(LogTemp, Warning, TEXT("NO navigation location %s"), *navLocation.Location.ToString());
}
}
Actor本身的位置:
Extend向量:
列印的位置,剛好位於與導航網格面的垂直Z軸上,如下所示
總結判斷一個點為導航網格點的辦法(有一點小誤差):
也就是設定一個比較小的Extend,如果ProjectPointToNavigation為true,則其為導航網格點
相關文章
- (UE4 4.20)UE4 TimeLine(UTimelineComponent)
- 如何判斷一個點在地圖上?如何判斷一個點在多邊形內?地圖
- (UE4 4.20)UE4 UCLASS,UENUM, USTRUCT, UPROPERTY 的 常用配置Struct
- canvas判斷點是否在路徑內Canvas斷點
- UE4 如何關閉自動更新導航,手動更新導航
- (UE4 4.20 )UE4的GC(垃圾回收)程式設計規範GC程式設計
- 如何判斷一個玩法是否合格?
- 如何判斷一個元素是否在可視區域中?
- 如何判斷一個元素在億級資料中是否存在?
- 如何判斷一個物件是否為空?物件
- PHP 判斷一個字元是否在字串中PHP字元字串
- 如何判斷一個元素文字是否換行?
- python如何判斷一個物件是否是列表Python物件
- 判斷一個物件是否為空物件,判斷一個物件中是否有空值物件
- JS 射線法 判斷點是否在多邊形內部JS斷點
- UE4 如何在導航體積中設定不可通過的地方
- python如何判斷一個數是否是整數Python
- 如何判斷一個 interface{} 的值是否為 nil ?
- 寫一個方法判斷陣列內元素是否全部相同陣列
- JS如何判斷一個陣列是否為空、是否含有某個值JS陣列
- javascript中如何判斷一個字串是否為JSON格式JavaScript字串JSON
- 如何判斷一個js物件是否存在迴圈引用JS物件
- UE4網路模組解析(一)
- 判斷點是否在三角形內斷點
- 判斷一個陣列是否排好序陣列
- (UE4 4.20)UE4 繼承AnimNotify建立自定義動畫通知事件(結合PoseableMeshComponent實現技能殘影效果)繼承動畫事件
- 如何在億級資料中判斷一個元素是否存在?
- 如何判斷網校原始碼是否值得使用?原始碼
- JavaScript 中,如何判斷兩個物件是否相等?JavaScript物件
- mysql如何判斷是否存在某個欄位MySql
- 如何判斷一個指定的位置點座標(GPS上的經緯度)是否落在一個多邊形區域內?
- UE4點選原始碼分析原始碼
- 判斷字串是否唯一字串
- 判斷一個有向圖是否有環
- PHP判斷一個字串是否包含亂碼PHP字串
- 如何判斷一個網站的質量?網站
- 判斷網路是否連線
- 判斷協議是否出網協議