(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 UCLASS,UENUM, USTRUCT, UPROPERTY 的 常用配置Struct
- (UE4 4.20 )UE4的GC(垃圾回收)程式設計規範GC程式設計
- canvas判斷點是否在路徑內Canvas斷點
- 判斷點是否在多邊形內斷點
- 判斷點是否在多邊形內部斷點
- 如何判斷一個元素是否在可視範圍
- 如何判斷一個元素是否在可視區域中?
- 判斷物件是否在視線內物件
- 如何判斷一個場景是否是物聯網?
- 如何判斷一個元素在億級資料中是否存在?
- 在Oracle中,如何判斷一個字串是否為數字?Oracle字串
- jQuery如何判斷一個元素是否存在jQuery
- 如何判斷一個jquery物件是否存在jQuery物件
- 如何判斷一個元素是否隱藏
- js如何判斷一個物件是否存在JS物件
- UE4 如何在導航體積中設定不可通過的地方
- PHP 判斷一個字元是否在字串中PHP字元字串
- UE4網路模組解析(一)
- 如何判斷一個物件是否在指定物件的原型鏈中物件原型
- 如何判斷一個連結地址是否有效
- 如何判斷一個物件是否為jQuery物件物件jQuery
- js如何判斷一個函式是否存在JS函式
- javascript如何判斷一個變數是否宣告JavaScript變數
- 如何判斷一個值是否等於NaNNaN
- jQuery如何判斷某一個元素是否存在jQuery
- JS 射線法 判斷點是否在多邊形內部JS斷點
- 判斷一個物件是否為空物件,判斷一個物件中是否有空值物件
- python如何判斷一個物件是否是列表Python物件
- js如何判斷一個變數是否具有值JS變數
- js如何判斷一個變數是否是undefinedJS變數Undefined
- javascript如何判斷一個頁面元素是否存在JavaScript
- javascript如何判斷一個變數是否是undefinedJavaScript變數Undefined
- js如何判斷一個變數是否有值JS變數
- UE4 在當前遊戲模組新增一個新的模組遊戲
- 如何判斷一個元素是否位於另一個元素之中
- js如何判斷一個變數是否是一個數字JS變數
- (UE4 4.20)UE4 繼承AnimNotify建立自定義動畫通知事件(結合PoseableMeshComponent實現技能殘影效果)繼承動畫事件