Skip to content
Snippets Groups Projects
Commit ba978278 authored by Timon Römer's avatar Timon Römer
Browse files

Adds possibility to have more than one ScoringBehaviour Attached

parent c06bd998
No related branches found
No related tags found
2 merge requests!83Hotfix: Intenselect and InputActions,!82Adds possibility to have more than one ScoringBehaviour attached to IntenSelectable
Pipeline #372994 failed
This commit is part of merge request !83. Comments created here will be created in the context of that merge request.
// Fill out your copyright notice in the Description page of Project Settings.
#include "Interaction/Interactables/IntenSelect/IntenSelectable.h"
#include "Interaction/Interactables/IntenSelect/IntenSelectableScoring.h"
#include "Interaction/Interactables/IntenSelect/IntenSelectableSinglePointScoring.h"
#include "Kismet/KismetSystemLibrary.h"
......@@ -16,8 +15,44 @@ TPair<FHitResult, float> UIntenSelectable::GetBestPointScorePair(const FVector&
const float ConeAngle, const float LastValue,
const float DeltaTime) const
{
checkf(ScoringBehaviour, TEXT("%s"), *GetOwner()->GetName()) return ScoringBehaviour->GetBestPointScorePair(
checkf(ScoringBehaviours.Num() > 0, TEXT("%s"), *GetOwner()->GetName());
float MaxScore = -1;
FHitResult MaxResult;
for (UIntenSelectableScoring* s : ScoringBehaviours)
{
const TPair<FHitResult, float> Score_Pair = s->GetBestPointScorePair(
ConeOrigin, ConeForwardDirection, ConeBackwardShiftDistance, ConeAngle, LastValue, DeltaTime);
if (Score_Pair.Value >= MaxScore)
{
MaxResult = Score_Pair.Key;
MaxScore = Score_Pair.Value;
}
}
return TPair<FHitResult, float>{MaxResult, MaxScore};
}
void UIntenSelectable::BeginPlay()
{
Super::BeginPlay();
TInlineComponentArray<UIntenSelectable*> AttachedIntenSelectables;
GetOwner()->GetComponents(AttachedIntenSelectables, false);
if (AttachedIntenSelectables.Num() > 1)
{
if (!ScoringBehaviours.Num() == 0)
{
ShowErrorAndQuit(
"Please assign the Scoring Behaviour manually when using more than one IntenSelectable Component!");
}
}
else
{
InitDefaultBehaviourReferences();
}
}
void UIntenSelectable::HandleOnSelectStartEvents(const UIntenSelectComponent* IntenSelect, const FHitResult& HitResult)
......@@ -58,18 +93,24 @@ void UIntenSelectable::HandleOnClickEndEvents(UIntenSelectComponent* IntenSelect
void UIntenSelectable::InitDefaultBehaviourReferences()
{
// Scoring
if (UIntenSelectableScoring* AttachedScoring =
Cast<UIntenSelectableScoring>(GetOwner()->GetComponentByClass(UIntenSelectableScoring::StaticClass())))
for (TSet<UActorComponent*> AllComponents = GetOwner()->GetComponents(); UActorComponent * c : AllComponents)
{
ScoringBehaviour = AttachedScoring;
if (UIntenSelectableScoring* TryToGetScoring = Cast<UIntenSelectableScoring>(c))
{
ScoringBehaviours.Add(TryToGetScoring);
}
else
}
if (ScoringBehaviours.Num() == 0)
{
ScoringBehaviour = NewObject<UIntenSelectableSinglePointScoring>(
const auto InitScoringBehaviour = NewObject<UIntenSelectableSinglePointScoring>(
this, UIntenSelectableSinglePointScoring::StaticClass(), "Default Scoring");
ScoringBehaviour->SetWorldLocation(GetOwner()->GetActorLocation());
ScoringBehaviour->AttachToComponent(GetOwner()->GetRootComponent(),
InitScoringBehaviour->SetWorldLocation(GetOwner()->GetActorLocation());
InitScoringBehaviour->AttachToComponent(GetOwner()->GetRootComponent(),
FAttachmentTransformRules::SnapToTargetNotIncludingScale);
ScoringBehaviours.Add(InitScoringBehaviour);
}
// Selecting
......@@ -93,24 +134,3 @@ void UIntenSelectable::ShowErrorAndQuit(const FString& Message) const
#endif
UKismetSystemLibrary::QuitGame(this, nullptr, EQuitPreference::Quit, false);
}
void UIntenSelectable::BeginPlay()
{
Super::BeginPlay();
TInlineComponentArray<UIntenSelectable*> AttachedIntenSelectables;
GetOwner()->GetComponents(AttachedIntenSelectables, false);
if (AttachedIntenSelectables.Num() > 1)
{
if (!ScoringBehaviour)
{
ShowErrorAndQuit(
"Please assign the Scoring Behaviour manually when using more than one IntenSelectable Component!");
}
}
else
{
InitDefaultBehaviourReferences();
}
}
......@@ -5,6 +5,8 @@
#include "CoreMinimal.h"
#include "InputActionValue.h"
#include "Components/ActorComponent.h"
#include "Interaction/Interactables/ActionBehaviour.h"
#include "Interaction/Interactables/HoverBehaviour.h"
#include "IntenSelectable.generated.h"
......@@ -23,7 +25,7 @@ public:
bool IsSelectable = true;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
UIntenSelectableScoring* ScoringBehaviour;
TArray<UIntenSelectableScoring*> ScoringBehaviours;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
TArray<UHoverBehaviour*> OnSelectBehaviours;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment