Files
UnrealEngine/Engine/Plugins/AI/MassAI/Source/MassNavigation/Public/MassNavigationFragments.h
2025-05-18 13:04:45 +08:00

231 lines
6.1 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#if UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_5
#include "CoreMinimal.h"
#include "MassCommonFragments.h"
#endif
#include "AI/Navigation/NavigationElement.h"
#if UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_6
#include "MassCommonFragments.h"
#endif // UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_6
#include "MassCommonTypes.h"
#include "MassEntityTypes.h"
#include "MassNavigationSubsystem.h"
#include "MassNavigationTypes.h"
#include "MassNavigationFragments.generated.h"
class UWorld;
/** Move target. */
USTRUCT()
struct FMassMoveTargetFragment : public FMassFragment
{
GENERATED_BODY()
FMassMoveTargetFragment() : bNetDirty(false), bOffBoundaries(false), bSteeringFallingBehind(false) {}
/** To setup current action from the authoritative world */
MASSNAVIGATION_API void CreateNewAction(const EMassMovementAction InAction, const UWorld& InWorld);
/** To setup current action from replicated data */
MASSNAVIGATION_API void CreateReplicatedAction(const EMassMovementAction InAction, const uint16 InActionID, const double InWorldStartTime, const double InServerStartTime);
void MarkNetDirty() { bNetDirty = true; }
bool GetNetDirty() const { return bNetDirty; }
void ResetNetDirty() { bNetDirty = false; }
public:
MASSNAVIGATION_API FString ToString() const;
EMassMovementAction GetPreviousAction() const { return PreviousAction; }
EMassMovementAction GetCurrentAction() const { return CurrentAction; }
double GetCurrentActionStartTime() const { return CurrentActionWorldStartTime; }
double GetCurrentActionServerStartTime() const { return CurrentActionServerStartTime; }
uint16 GetCurrentActionID() const { return CurrentActionID; }
static MASSNAVIGATION_API const float UnsetDistance;
/** Center of the move target. */
FVector Center = FVector::ZeroVector;
/** Forward direction of the movement target. */
FVector Forward = FVector::ZeroVector;
/** Distance remaining to the movement goal. */
float DistanceToGoal = 0.0f;
/** Projected progress distance of the entity using the path. */
float EntityDistanceToGoal = UnsetDistance;
/** Allowed deviation around the movement target. */
float SlackRadius = 0.0f;
private:
/** World time in seconds when the action started. */
double CurrentActionWorldStartTime = 0.0;
/** Server time in seconds when the action started. */
double CurrentActionServerStartTime = 0.0;
/** Number incremented each time new action (i.e move, stand, animation) is started. */
uint16 CurrentActionID = 0;
public:
/** Requested movement speed. */
FMassInt16Real DesiredSpeed = FMassInt16Real(0.0f);
/** Intended movement action at the target. */
EMassMovementAction IntentAtGoal = EMassMovementAction::Move;
private:
/** Current movement action. */
EMassMovementAction CurrentAction = EMassMovementAction::Move;
/** Previous movement action. */
EMassMovementAction PreviousAction = EMassMovementAction::Move;
uint8 bNetDirty : 1;
public:
/** True if the movement target is assumed to be outside navigation boundaries. */
uint8 bOffBoundaries : 1;
/** True if the movement target is assumed to be outside navigation boundaries. */
uint8 bSteeringFallingBehind : 1;
};
/** Ghost location used for standing navigation. */
USTRUCT()
struct FMassGhostLocationFragment : public FMassFragment
{
GENERATED_BODY()
bool IsValid(const uint16 CurrentActionID) const
{
return LastSeenActionID == CurrentActionID;
}
/** The action ID the ghost was initialized for */
uint16 LastSeenActionID = 0;
/** Location of the ghost */
FVector Location = FVector::ZeroVector;
/** Velocity of the ghost */
FVector Velocity = FVector::ZeroVector;
};
/** Cell location for dynamic obstacles */
USTRUCT()
struct FMassNavigationObstacleGridCellLocationFragment : public FMassFragment
{
GENERATED_BODY()
FNavigationObstacleHashGrid2D::FCellLocation CellLoc;
};
enum class EMassColliderType : uint8
{
Circle,
Pill,
};
struct FMassCircleCollider
{
FMassCircleCollider() = default;
FMassCircleCollider(const float Radius) : Radius(Radius) {}
float Radius = 0.f;
};
struct FMassPillCollider
{
FMassPillCollider() = default;
FMassPillCollider(const float Radius, const float HalfLength) : Radius(Radius), HalfLength(HalfLength) {}
float Radius = 0.f;
float HalfLength = 0.f;
};
/** Fragment holding data for avoidance colliders */
USTRUCT()
struct FMassAvoidanceColliderFragment : public FMassFragment
{
GENERATED_BODY()
FMassAvoidanceColliderFragment()
{
Type = EMassColliderType::Circle;
Data[0] = 0.f;
Data[1] = 0.f;
}
FMassAvoidanceColliderFragment(const FMassCircleCollider& Circle)
{
Type = EMassColliderType::Circle;
Data[0] = Circle.Radius;
Data[1] = 0.f;
}
FMassAvoidanceColliderFragment(const FMassPillCollider& Pill)
{
Type = EMassColliderType::Pill;
Data[0] = Pill.Radius;
Data[1] = Pill.HalfLength;
}
FMassCircleCollider GetCircleCollider() const
{
check(Type == EMassColliderType::Circle);
return FMassCircleCollider(Data[0]);
}
FMassPillCollider GetPillCollider() const
{
check(Type == EMassColliderType::Pill);
return FMassPillCollider(Data[0], Data[1]);
}
float Data[2];
EMassColliderType Type;
};
/** Tag to tell if the entity is in the navigation obstacle grid */
USTRUCT()
struct FMassInNavigationObstacleGridTag : public FMassTag
{
GENERATED_BODY()
};
/**
* Shared Fragment holding the properties defining how a given entity should affect navigation data
*/
USTRUCT()
struct FNavigationRelevantParameters : public FMassConstSharedFragment
{
GENERATED_BODY()
/** If set, navmesh will not be generated under the surface of the geometry */
UPROPERTY()
bool bFillCollisionUnderneathForNavData = false;
};
/**
* Fragment holding the registration handle to the navigation element created from a Mass entity.
* The fragment is added to indicate that a Mass entity is relevant to the AI navigation system.
*/
USTRUCT()
struct FNavigationRelevantFragment : public FMassFragment
{
GENERATED_BODY()
FNavigationRelevantFragment() = default;
explicit FNavigationRelevantFragment(const FNavigationElementHandle Handle)
: Handle(Handle)
{
}
/** Handle to the Navigation element created and registered for the entity */
FNavigationElementHandle Handle;
};