UCLASS(NotBlueprintable, MinimalAPI, meta = (DisplayName = "Check Tag Condition"))
class UInputTriggerTag : public UInputTrigger
{
GENERATED_BODY()
public:
// 다른 Explicit 타입과 조합해서 사용하기 위해, Implicit 으로 설정
virtual ETriggerType GetTriggerType_Implementation() const override { return TriggerType::Implicit; }
virtual ETriggerEventsSupported GetSupportedTriggerEvents() const override { return ETriggerEventsSupported::Instant; }
protected:
virtual ETriggerState UpdateState_Implementation(const UEnhancedPlayerInput* PlayerInput, FInputActionValue ModifiedValue, float DeltaTime) override;
public:
/* 체크 Tag */
UPROPERTY(EditAnywhere, meta = (Categories = "Status"))
FGameplayTagContainer TagContainer;
/**
* 확인 조건
* False : TagContainer의 모든 태그가 있어야 Trigger Fire
* True : TagContainer의 태그 중 하나도 없어야 Trigger Fire
*/
UPROPERTY(EditAnywhere, Config, BlueprintReadWrite, Category = "Trigger Settings")
bool bNegate = false;
};
ETriggerState UInputTriggerTag::UpdateState_Implementation(const UEnhancedPlayerInput* PlayerInput, FInputActionValue ModifiedValue, float DeltaTime)
{
if (PlayerInput->GetOuterAPlayerController() == nullptr || PlayerInput->GetOuterAPlayerController()->GetPawn() == nullptr)
{
return ETriggerState::None;
}
ACharacter* CurrentCharacter = Cast<ACharacter>(PlayerInput->GetOuterAPlayerController()->GetPawn());
if (IsValid(CurrentCharacter))
{
if (bNegate)
{
// negate면 하나도 없는 경우에 트리거 되어야 함
if (FL::HasTagsAny(CurrentCharacter, TagContainer))
{
return ETriggerState::None;
}
return ETriggerState::Triggered;
}
else
{
// negate == false면 전부 있어야 트리거 됨
if (FL::HasTagsAll(CurrentCharacter, TagContainer))
{
return ETriggerState::Triggered;
}
return ETriggerState::None;
}
}
return ETriggerState::None;
}