Files
UnrealEngine/Engine/Plugins/Runtime/StateTree/Source/StateTreeModule/Public/Conditions/StateTreeCommonConditions.h
2025-05-18 13:04:45 +08:00

262 lines
8.6 KiB
C

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "AITypes.h"
#include "StateTreeConditionBase.h"
#include "StateTreeAnyEnum.h"
#include "StateTreeCommonConditions.generated.h"
#define UE_API STATETREEMODULE_API
struct FStateTreeDataView;
USTRUCT()
struct FStateTreeCompareIntConditionInstanceData
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, Category = "Input")
int32 Left = 0;
UPROPERTY(EditAnywhere, Category = "Parameter")
int32 Right = 0;
};
STATETREE_POD_INSTANCEDATA(FStateTreeCompareIntConditionInstanceData);
/**
* Condition comparing two integers.
*/
USTRUCT(DisplayName = "Integer Compare")
struct FStateTreeCompareIntCondition : public FStateTreeConditionCommonBase
{
GENERATED_BODY()
using FInstanceDataType = FStateTreeCompareIntConditionInstanceData;
FStateTreeCompareIntCondition() = default;
explicit FStateTreeCompareIntCondition(const EGenericAICheck InOperator, const EStateTreeCompare InInverts = EStateTreeCompare::Default)
: bInvert(InInverts == EStateTreeCompare::Invert)
, Operator(InOperator)
{}
virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); }
UE_API virtual bool TestCondition(FStateTreeExecutionContext& Context) const override;
#if WITH_EDITOR
UE_API virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override;
#endif
UPROPERTY(EditAnywhere, Category = "Parameter")
bool bInvert = false;
UPROPERTY(EditAnywhere, Category = "Parameter", meta = (InvalidEnumValues = "IsTrue"))
EGenericAICheck Operator = EGenericAICheck::Equal;
};
USTRUCT()
struct FStateTreeCompareFloatConditionInstanceData
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, Category = "Input")
double Left = 0.0;
UPROPERTY(EditAnywhere, Category = "Parameter")
double Right = 0.0;
};
STATETREE_POD_INSTANCEDATA(FStateTreeCompareFloatConditionInstanceData);
/**
* Condition comparing two floats.
*/
USTRUCT(DisplayName = "Float Compare")
struct FStateTreeCompareFloatCondition : public FStateTreeConditionCommonBase
{
GENERATED_BODY()
using FInstanceDataType = FStateTreeCompareFloatConditionInstanceData;
FStateTreeCompareFloatCondition() = default;
explicit FStateTreeCompareFloatCondition(const EGenericAICheck InOperator, const EStateTreeCompare InInverts = EStateTreeCompare::Default)
: bInvert(InInverts == EStateTreeCompare::Invert)
, Operator(InOperator)
{}
virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); }
UE_API virtual bool TestCondition(FStateTreeExecutionContext& Context) const override;
#if WITH_EDITOR
UE_API virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override;
#endif
UPROPERTY(EditAnywhere, Category = "Parameter")
bool bInvert = false;
UPROPERTY(EditAnywhere, Category = "Parameter", meta = (InvalidEnumValues = "IsTrue"))
EGenericAICheck Operator = EGenericAICheck::Equal;
};
USTRUCT()
struct FStateTreeCompareBoolConditionInstanceData
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, Category = "Input")
bool bLeft = false;
UPROPERTY(EditAnywhere, Category = "Parameter")
bool bRight = false;
};
STATETREE_POD_INSTANCEDATA(FStateTreeCompareBoolConditionInstanceData);
/**
* Condition comparing two booleans.
*/
USTRUCT(DisplayName = "Bool Compare")
struct FStateTreeCompareBoolCondition : public FStateTreeConditionCommonBase
{
GENERATED_BODY()
using FInstanceDataType = FStateTreeCompareBoolConditionInstanceData;
FStateTreeCompareBoolCondition() = default;
explicit FStateTreeCompareBoolCondition(const EStateTreeCompare InInverts)
: bInvert(InInverts == EStateTreeCompare::Invert)
{}
FStateTreeCompareBoolCondition(const bool bInInverts)
: bInvert(bInInverts)
{}
virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); }
UE_API virtual bool TestCondition(FStateTreeExecutionContext& Context) const override;
#if WITH_EDITOR
UE_API virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override;
#endif
UPROPERTY(EditAnywhere, Category = "Parameter")
bool bInvert = false;
};
USTRUCT()
struct FStateTreeCompareEnumConditionInstanceData
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, Category = "Input", meta=(AllowAnyBinding))
FStateTreeAnyEnum Left;
UPROPERTY(EditAnywhere, Category = "Parameter")
FStateTreeAnyEnum Right;
};
STATETREE_POD_INSTANCEDATA(FStateTreeCompareEnumConditionInstanceData);
/**
* Condition comparing two enums.
*/
USTRUCT(DisplayName = "Enum Compare")
struct FStateTreeCompareEnumCondition : public FStateTreeConditionCommonBase
{
GENERATED_BODY()
using FInstanceDataType = FStateTreeCompareEnumConditionInstanceData;
FStateTreeCompareEnumCondition() = default;
explicit FStateTreeCompareEnumCondition(const EStateTreeCompare InInverts)
: bInvert(InInverts == EStateTreeCompare::Invert)
{}
FStateTreeCompareEnumCondition(const bool bInInverts)
: bInvert(bInInverts)
{}
virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); }
UE_API virtual bool TestCondition(FStateTreeExecutionContext& Context) const override;
#if WITH_EDITOR
UE_API virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override;
UE_API virtual void OnBindingChanged(const FGuid& ID, FStateTreeDataView InstanceData, const FPropertyBindingPath& SourcePath, const FPropertyBindingPath& TargetPath, const IStateTreeBindingLookup& BindingLookup) override;
#endif
UPROPERTY(EditAnywhere, Category = "Parameter")
bool bInvert = false;
};
USTRUCT()
struct FStateTreeCompareDistanceConditionInstanceData
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, Category = "Input")
FVector Source = FVector(EForceInit::ForceInitToZero);
UPROPERTY(EditAnywhere, Category = "Parameter")
FVector Target = FVector(EForceInit::ForceInitToZero);
UPROPERTY(EditAnywhere, Category = "Parameter")
double Distance = 0.0;
};
STATETREE_POD_INSTANCEDATA(FStateTreeCompareDistanceConditionInstanceData);
/**
* Condition comparing distance between two vectors.
*/
USTRUCT(DisplayName = "Distance Compare")
struct FStateTreeCompareDistanceCondition : public FStateTreeConditionCommonBase
{
GENERATED_BODY()
using FInstanceDataType = FStateTreeCompareDistanceConditionInstanceData;
FStateTreeCompareDistanceCondition() = default;
explicit FStateTreeCompareDistanceCondition(const EGenericAICheck InOperator, const EStateTreeCompare InInverts = EStateTreeCompare::Default)
: bInvert(InInverts == EStateTreeCompare::Invert)
, Operator(InOperator)
{}
virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); }
UE_API virtual bool TestCondition(FStateTreeExecutionContext& Context) const override;
#if WITH_EDITOR
UE_API virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override;
#endif
UPROPERTY(EditAnywhere, Category = "Condition")
bool bInvert = false;
UPROPERTY(EditAnywhere, Category = "Condition", meta = (InvalidEnumValues = "IsTrue"))
EGenericAICheck Operator = EGenericAICheck::Equal;
};
USTRUCT()
struct FStateTreeRandomConditionInstanceData
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, Category = "Parameter", meta = (ClampMin = "0.0", ClampMax = "1.0", UIMin = "0.0", UIMax = "1.0"))
float Threshold = 0.5f;
};
STATETREE_POD_INSTANCEDATA(FStateTreeRandomConditionInstanceData);
/**
* Random condition
*/
USTRUCT(DisplayName = "Random")
struct FStateTreeRandomCondition : public FStateTreeConditionCommonBase
{
GENERATED_BODY()
using FInstanceDataType = FStateTreeRandomConditionInstanceData;
FStateTreeRandomCondition() = default;
virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); }
UE_API virtual bool TestCondition(FStateTreeExecutionContext& Context) const override;
#if WITH_EDITOR
UE_API virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override;
#endif
};
#undef UE_API