Skip to content

Commit f8041d8

Browse files
Merge branch 'dev/5.3' into '5.3'
UE5.3-2023.1-rc2 Closes #644 See merge request vr-vis/VR-Group/unreal-development/plugins/rwth-vr-toolkit!80
2 parents 403a1a2 + c06bd99 commit f8041d8

File tree

167 files changed

+4873
-408
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

167 files changed

+4873
-408
lines changed

.gitlab-ci.yml

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
include:
99
- project: '${UNREAL_CI_PROJECT}'
10-
ref: master
10+
ref: master
1111
file: '/shared_scripts.yml'
1212

1313
# In this file you are able to configure your plugins pipeline.
@@ -36,6 +36,11 @@ include:
3636
#
3737
# You can uncomment the deploy lines to deploy your project to the CAVE/VRDev. This only makes sense, if your plugin works
3838
# with a generated project.
39+
#
40+
# Use the UNREAL_VERSION variable to adjust to your preferred Unreal version.
41+
42+
variables:
43+
UNREAL_VERSION: "5.3"
3944

4045
stages:
4146
- analyze
@@ -58,7 +63,7 @@ clang-format:
5863
allow_failure: false
5964
script:
6065
- clang-format --version
61-
- git fetch origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME --depth 1
66+
- git fetch --depth 1 origin $CI_MERGE_REQUEST_DIFF_BASE_SHA
6267
- echo $CI_MERGE_REQUEST_DIFF_BASE_SHA
6368
- linter_errors=$(unbuffer git-clang-format --commit "$CI_MERGE_REQUEST_DIFF_BASE_SHA" *.h *.cpp -q --diff | grep -v --color=always "no modified files to format" || true)
6469
- echo "$linter_errors"
@@ -68,10 +73,12 @@ Generate_Project:
6873
rules:
6974
- if: $CI_PIPELINE_SOURCE == "web"
7075
- if: $CI_PIPELINE_SOURCE == "schedule"
76+
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
77+
- if: $CI_COMMIT_TAG
78+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
7179
extends: .Generate_Project_
7280
variables:
7381
RUN_SETUP: "false"
74-
GEN_TEMPLATE_BRANCH: "5.3"
7582
GEN_DEPENDENCIES: "(
7683
[master@UnrealDTrackPlugin]='https://github.com/VRGroupRWTH/UnrealDTrackPlugin.git')"
7784

@@ -80,6 +87,9 @@ Build_Windows:
8087
rules:
8188
- if: $CI_PIPELINE_SOURCE == "web"
8289
- if: $CI_PIPELINE_SOURCE == "schedule"
90+
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
91+
- if: $CI_COMMIT_TAG
92+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
8393
extends: .Build_Windows_
8494
tags:
8595
- windows
@@ -97,6 +107,9 @@ Build_Linux:
97107
rules:
98108
- if: $CI_PIPELINE_SOURCE == "web"
99109
- if: $CI_PIPELINE_SOURCE == "schedule"
110+
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
111+
- if: $CI_COMMIT_TAG
112+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
100113
extends: .Build_Linux_
101114
tags:
102115
- linux
@@ -111,6 +124,7 @@ Build_Linux:
111124
- job: "Generate_Project"
112125
artifacts: true
113126

127+
# Deploys to vrdev
114128
Deploy_Windows:
115129
rules:
116130
- if: $CI_PIPELINE_SOURCE == "web"
@@ -120,6 +134,7 @@ Deploy_Windows:
120134
- job: "Build_Windows"
121135
artifacts: true
122136

137+
# Deploys to vrdemo instead of av006de. Use extends: .Deploy_CAVE_ to deploy to legacy av006de
123138
Deploy_CAVE:
124139
rules:
125140
- if: $CI_PIPELINE_SOURCE == "web"

Config/DefaultRWTHVRToolkit.ini

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,18 @@
44
+StructRedirects = (OldName="/Script/RWTHVRToolkit.VRTransformRep",NewName="/Script/RWTHVRToolkit.ReplicatedTransform")
55
+ClassRedirects = (OldName="/Script/RWTHVRToolkit.VRWidgetInteractionComponent",NewName="/Script/RWTHVRToolkit.RWTHVRWidgetInteractionComponent")
66
+PropertyRedirects = (OldName="/Script/RWTHVRToolkit.RWTHVRPawn.PawnMovement",NewName="/Script/RWTHVRToolkit.RWTHVRPawn.CollisionHandlingMovement")
7-
+PropertyRedirects = (OldName="/Script/RWTHVRToolkit.RWTHVRPawn.PawnMovement",NewName="/Script/RWTHVRToolkit.RWTHVRPawn.CollisionHandlingMovement")
7+
+PropertyRedirects = (OldName="/Script/RWTHVRToolkit.RWTHVRPawn.PawnMovement",NewName="/Script/RWTHVRToolkit.RWTHVRPawn.CollisionHandlingMovement")
8+
+ClassRedirects = (OldName="/Script/RWTHVRToolkit.RaycastSelectionComponent",NewName="/Script/RWTHVRToolkit.RaycastInteractionComponent")
9+
+ClassRedirects = (OldName="/Script/RWTHVRToolkit.GrabComponent",NewName="/Script/RWTHVRToolkit.DirectInteractionComponent")
10+
+FunctionRedirects = (OldName="/Script/RWTHVRToolkit.RaycastInteractionComponent.OnBeginSelect",NewName="/Script/RWTHVRToolkit.RaycastInteractionComponent.OnBeginInteraction")
11+
+FunctionRedirects = (OldName="/Script/RWTHVRToolkit.RaycastInteractionComponent.OnEndSelect",NewName="/Script/RWTHVRToolkit.RaycastInteractionComponent.OnEndInteraction")
12+
+PropertyRedirects = (OldName="/Script/RWTHVRToolkit.RaycastInteractionComponent.RayCastSelectInputAction",NewName="/Script/RWTHVRToolkit.RaycastInteractionComponent.RayCastInteractionInputAction")
13+
+PropertyRedirects = (OldName="/Script/RWTHVRToolkit.RaycastInteractionComponent.RayCastInteractionInputAction",NewName="/Script/RWTHVRToolkit.RaycastInteractionComponent.InteractionInputAction")
14+
+PropertyRedirects = (OldName="/Script/RWTHVRToolkit.DirectInteractionComponent.PreviousGrabbablesInRange",NewName="/Script/RWTHVRToolkit.DirectInteractionComponent.PreviousInteractableComponentsInRange")
15+
+PropertyRedirects = (OldName="/Script/RWTHVRToolkit.DirectInteractionComponent.GrabInputAction",NewName="/Script/RWTHVRToolkit.DirectInteractionComponent.InteractionInputAction")
16+
+PropertyRedirects = (OldName="/Script/RWTHVRToolkit.DirectInteractionComponent.GrabSphereRadius",NewName="/Script/RWTHVRToolkit.DirectInteractionComponent.InteractionSphereRadius")
17+
+PropertyRedirects = (OldName="/Script/RWTHVRToolkit.DirectInteractionComponent.bOnlyGrabClosestActor",NewName="/Script/RWTHVRToolkit.DirectInteractionComponent.bOnlyInteractWithClosestActor")
18+
+FunctionRedirects = (OldName="/Script/RWTHVRToolkit.DirectInteractionComponent.OnBeginGrab",NewName="/Script/RWTHVRToolkit.DirectInteractionComponent.OnBeginInteraction")
19+
+FunctionRedirects = (OldName="/Script/RWTHVRToolkit.DirectInteractionComponent.OnEndGrab",NewName="/Script/RWTHVRToolkit.DirectInteractionComponent.OnEndInteraction")
20+
+PropertyRedirects = (OldName="/Script/RWTHVRToolkit.DirectInteractionComponent.PreviousGrabBehavioursInRange",NewName="/Script/RWTHVRToolkit.DirectInteractionComponent.PreviousInteractableComponentsInRange")
21+
+PropertyRedirects = (OldName="/Script/RWTHVRToolkit.DirectInteractionComponent.CurrentGrabBehavioursInRange",NewName="/Script/RWTHVRToolkit.DirectInteractionComponent.CurrentInteractableComponentsInRange")

Content/BP_RWTHVRGameModeBase.uasset

21 Bytes
Binary file not shown.

Content/BP_RWTHVRPawn.uasset

-44.9 KB
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
-1.35 KB
Binary file not shown.
-1.35 KB
Binary file not shown.
-6.23 KB
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
33.5 KB
Binary file not shown.
Binary file not shown.
Binary file not shown.
78.6 KB
Binary file not shown.
102 KB
Binary file not shown.
84.3 KB
Binary file not shown.
1.68 KB
Binary file not shown.
Binary file not shown.
1.36 KB
Binary file not shown.
Binary file not shown.
49.7 KB
Binary file not shown.

Content/IntenSelect/RayMesh.uasset

83.4 KB
Binary file not shown.
Binary file not shown.
81.7 KB
Binary file not shown.
54.2 KB
Binary file not shown.
25 KB
Binary file not shown.

Content/PointingRay/Ray_Mesh.uasset

-66.5 KB
Binary file not shown.
2.8 KB
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Content/TestMap.umap

-75.7 KB
Binary file not shown.

Source/RWTHVRCluster/Private/CAVEOverlay/CAVEOverlayController.cpp

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
#include "CoreMinimal.h"
44
#include "EnhancedInputComponent.h"
5-
#include "EnhancedInputSubsystems.h"
65
#include "IDisplayCluster.h"
76
#include "MotionControllerComponent.h"
87
#include "Camera/CameraComponent.h"
@@ -165,7 +164,7 @@ void ACAVEOverlayController::BeginPlay()
165164
// Input config
166165
if (URWTHVRUtilities::IsPrimaryNode())
167166
{
168-
if (CycleDoorTypeInputAction == nullptr || IMCCaveOverlayInputMapping == nullptr)
167+
if (CycleDoorTypeInputAction == nullptr)
169168
{
170169
UE_LOGFMT(LogCAVEOverlay, Error, "Input action and mapping not set in CaveOverlayController!");
171170
return;
@@ -174,15 +173,6 @@ void ACAVEOverlayController::BeginPlay()
174173
UEnhancedInputComponent* Input = Cast<UEnhancedInputComponent>(PC->InputComponent);
175174
Input->BindAction(CycleDoorTypeInputAction, ETriggerEvent::Triggered, this,
176175
&ACAVEOverlayController::CycleDoorType);
177-
178-
if (const ULocalPlayer* LocalPlayer = PC->GetLocalPlayer())
179-
{
180-
if (UEnhancedInputLocalPlayerSubsystem* InputSystem =
181-
LocalPlayer->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>())
182-
{
183-
InputSystem->AddMappingContext(IMCCaveOverlayInputMapping, 0);
184-
}
185-
}
186176
}
187177

188178
// Bind the cluster events that manage the door state.

Source/RWTHVRCluster/Public/CAVEOverlay/CAVEOverlayController.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,6 @@ class RWTHVRCLUSTER_API ACAVEOverlayController : public AActor
128128
UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "CAVEOverlay")
129129
UInputAction* CycleDoorTypeInputAction;
130130

131-
UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "CAVEOverlay")
132-
UInputMappingContext* IMCCaveOverlayInputMapping;
133-
134131
UPROPERTY()
135132
UDoorOverlayData* Overlay;
136133

Source/RWTHVRToolkit/Private/Interaction/Interactables/GrabBehavior.cpp

Lines changed: 56 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33

44
#include "Interaction/Interactables/GrabBehavior.h"
55
#include "Interaction/Interactables/InteractableComponent.h"
6-
#include "Kismet/GameplayStatics.h"
6+
#include "Logging/StructuredLog.h"
77
#include "Serialization/JsonTypes.h"
8+
#include "Utility/RWTHVRUtilities.h"
89

910
UPrimitiveComponent* UGrabBehavior::GetFirstComponentSimulatingPhysics(const AActor* TargetActor)
1011
{
@@ -29,34 +30,42 @@ UPrimitiveComponent* UGrabBehavior::GetHighestParentSimulatingPhysics(UPrimitive
2930
{
3031
return GetHighestParentSimulatingPhysics(Cast<UPrimitiveComponent>(Comp->GetAttachParent()));
3132
}
32-
else
33-
{
34-
return Comp;
35-
}
33+
34+
return Comp;
3635
}
3736

3837
void UGrabBehavior::OnActionStart(USceneComponent* TriggeredComponent, const UInputAction* InputAction,
3938
const FInputActionValue& Value)
4039
{
41-
const APawn* Player = UGameplayStatics::GetPlayerPawn(GetWorld(), 0);
42-
43-
USceneComponent* Hand = Cast<USceneComponent>(TriggeredComponent->GetAttachParent());
40+
if (bObjectGrabbed)
41+
{
42+
return;
43+
}
4444

45+
USceneComponent* CurrentAttachParent = Cast<USceneComponent>(TriggeredComponent->GetAttachParent());
4546
const FAttachmentTransformRules Rules = FAttachmentTransformRules(EAttachmentRule::KeepWorld, false);
4647

47-
MyPhysicsComponent = GetFirstComponentSimulatingPhysics(GetOwner());
48-
49-
if (MyPhysicsComponent)
48+
if (MyPhysicsComponent = GetFirstComponentSimulatingPhysics(GetOwner()); MyPhysicsComponent != nullptr)
5049
{
50+
bWasSimulatingPhysics = MyPhysicsComponent->IsSimulatingPhysics();
5151
MyPhysicsComponent->SetSimulatePhysics(false);
52-
MyPhysicsComponent->AttachToComponent(Hand, Rules);
52+
bObjectGrabbed = MyPhysicsComponent->AttachToComponent(CurrentAttachParent, Rules);
5353
}
5454
else
5555
{
56-
GetOwner()->GetRootComponent()->AttachToComponent(Hand, Rules);
56+
bObjectGrabbed = GetOwner()->GetRootComponent()->AttachToComponent(CurrentAttachParent, Rules);
5757
}
5858

59+
if (!bObjectGrabbed)
60+
{
61+
UE_LOGFMT(Toolkit, Warning, "Grab failed! Cannot attach grabbed component to attach parent ({Parent})",
62+
CurrentAttachParent->GetName());
63+
return;
64+
}
5965

66+
// If we want to restrict other interactions while this component is grabbed we add the component
67+
// that triggered the interaction to the whitelist of all interactables that are attached to the
68+
// affected actor
6069
if (bBlockOtherInteractionsWhileGrabbed)
6170
{
6271
TArray<UInteractableComponent*> Interactables;
@@ -66,21 +75,28 @@ void UGrabBehavior::OnActionStart(USceneComponent* TriggeredComponent, const UIn
6675
Interactable->RestrictInteractionToComponent(TriggeredComponent);
6776
}
6877
}
78+
79+
OnGrabStartEvent.Broadcast(CurrentAttachParent, MyPhysicsComponent);
6980
}
7081

7182
void UGrabBehavior::OnActionEnd(USceneComponent* TriggeredComponent, const UInputAction* InputAction,
7283
const FInputActionValue& Value)
7384
{
74-
if (MyPhysicsComponent)
75-
{
76-
MyPhysicsComponent->DetachFromComponent(FDetachmentTransformRules::KeepWorldTransform);
77-
MyPhysicsComponent->SetSimulatePhysics(true);
78-
}
79-
else
85+
86+
USceneComponent* CurrentAttachParent = Cast<USceneComponent>(TriggeredComponent->GetAttachParent());
87+
88+
// We try to release the attached component. If it is not succesful we log and return. Otherwise, we continue.
89+
if (!TryRelease())
8090
{
81-
GetOwner()->GetRootComponent()->DetachFromComponent(FDetachmentTransformRules::KeepWorldTransform);
91+
UE_LOGFMT(Toolkit, Display,
92+
"UGrabBehavior::OnActionEnd: TryRelease failed to release with AttachParent {Parent}",
93+
CurrentAttachParent->GetName());
94+
return;
8295
}
8396

97+
OnGrabEndEvent.Broadcast(CurrentAttachParent, MyPhysicsComponent);
98+
99+
// Release the interation restriction on all component
84100
if (bBlockOtherInteractionsWhileGrabbed)
85101
{
86102
TArray<UInteractableComponent*> Interactables;
@@ -91,3 +107,23 @@ void UGrabBehavior::OnActionEnd(USceneComponent* TriggeredComponent, const UInpu
91107
}
92108
}
93109
}
110+
111+
bool UGrabBehavior::TryRelease()
112+
{
113+
if (!bObjectGrabbed)
114+
{
115+
return false;
116+
}
117+
118+
if (MyPhysicsComponent)
119+
{
120+
MyPhysicsComponent->DetachFromComponent(FDetachmentTransformRules::KeepWorldTransform);
121+
MyPhysicsComponent->SetSimulatePhysics(bWasSimulatingPhysics);
122+
}
123+
else
124+
{
125+
GetOwner()->GetRootComponent()->DetachFromComponent(FDetachmentTransformRules::KeepWorldTransform);
126+
}
127+
bObjectGrabbed = false;
128+
return true;
129+
}
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
// Fill out your copyright notice in the Description page of Project Settings.
2+
3+
#include "Interaction/Interactables/IntenSelect/IntenSelectable.h"
4+
5+
#include "Interaction/Interactables/IntenSelect/IntenSelectableScoring.h"
6+
#include "Interaction/Interactables/IntenSelect/IntenSelectableSinglePointScoring.h"
7+
#include "Kismet/KismetSystemLibrary.h"
8+
#include "Misc/MessageDialog.h"
9+
#include "Pawn/IntenSelectComponent.h"
10+
11+
UIntenSelectable::UIntenSelectable() { PrimaryComponentTick.bCanEverTick = true; }
12+
13+
TPair<FHitResult, float> UIntenSelectable::GetBestPointScorePair(const FVector& ConeOrigin,
14+
const FVector& ConeForwardDirection,
15+
const float ConeBackwardShiftDistance,
16+
const float ConeAngle, const float LastValue,
17+
const float DeltaTime) const
18+
{
19+
checkf(ScoringBehaviour, TEXT("%s"), *GetOwner()->GetName()) return ScoringBehaviour->GetBestPointScorePair(
20+
ConeOrigin, ConeForwardDirection, ConeBackwardShiftDistance, ConeAngle, LastValue, DeltaTime);
21+
}
22+
23+
void UIntenSelectable::HandleOnSelectStartEvents(const UIntenSelectComponent* IntenSelect, const FHitResult& HitResult)
24+
{
25+
for (const UHoverBehaviour* b : OnSelectBehaviours)
26+
{
27+
b->OnHoverStartEvent.Broadcast(IntenSelect, HitResult);
28+
}
29+
}
30+
31+
void UIntenSelectable::HandleOnSelectEndEvents(const UIntenSelectComponent* IntenSelect)
32+
{
33+
for (const UHoverBehaviour* b : OnSelectBehaviours)
34+
{
35+
b->OnHoverEndEvent.Broadcast(IntenSelect);
36+
}
37+
}
38+
39+
void UIntenSelectable::HandleOnClickStartEvents(UIntenSelectComponent* IntenSelect)
40+
{
41+
for (const UActionBehaviour* b : OnClickBehaviours)
42+
{
43+
FInputActionValue v{};
44+
const UInputAction* a{};
45+
b->OnActionBeginEvent.Broadcast(IntenSelect, a, v);
46+
}
47+
}
48+
49+
void UIntenSelectable::HandleOnClickEndEvents(UIntenSelectComponent* IntenSelect, FInputActionValue& InputValue)
50+
{
51+
for (const UActionBehaviour* b : OnClickBehaviours)
52+
{
53+
const UInputAction* a{};
54+
b->OnActionEndEvent.Broadcast(IntenSelect, a, InputValue);
55+
}
56+
}
57+
58+
void UIntenSelectable::InitDefaultBehaviourReferences()
59+
{
60+
// Scoring
61+
if (UIntenSelectableScoring* AttachedScoring =
62+
Cast<UIntenSelectableScoring>(GetOwner()->GetComponentByClass(UIntenSelectableScoring::StaticClass())))
63+
{
64+
ScoringBehaviour = AttachedScoring;
65+
}
66+
else
67+
{
68+
ScoringBehaviour = NewObject<UIntenSelectableSinglePointScoring>(
69+
this, UIntenSelectableSinglePointScoring::StaticClass(), "Default Scoring");
70+
ScoringBehaviour->SetWorldLocation(GetOwner()->GetActorLocation());
71+
ScoringBehaviour->AttachToComponent(GetOwner()->GetRootComponent(),
72+
FAttachmentTransformRules::SnapToTargetNotIncludingScale);
73+
}
74+
75+
// Selecting
76+
TInlineComponentArray<UHoverBehaviour*> AttachedSelectionBehaviours;
77+
GetOwner()->GetComponents(AttachedSelectionBehaviours, true);
78+
79+
this->OnSelectBehaviours = AttachedSelectionBehaviours;
80+
81+
// Clicking
82+
TInlineComponentArray<UActionBehaviour*> AttachedClickBehaviours;
83+
GetOwner()->GetComponents(AttachedClickBehaviours, true);
84+
85+
this->OnClickBehaviours = AttachedClickBehaviours;
86+
}
87+
88+
void UIntenSelectable::ShowErrorAndQuit(const FString& Message) const
89+
{
90+
UE_LOG(LogTemp, Error, TEXT("%s"), *Message)
91+
#if WITH_EDITOR
92+
FMessageDialog::Open(EAppMsgType::Ok, FText::FromString(FString("RUNTIME ERROR")));
93+
#endif
94+
UKismetSystemLibrary::QuitGame(this, nullptr, EQuitPreference::Quit, false);
95+
}
96+
97+
void UIntenSelectable::BeginPlay()
98+
{
99+
Super::BeginPlay();
100+
101+
TInlineComponentArray<UIntenSelectable*> AttachedIntenSelectables;
102+
GetOwner()->GetComponents(AttachedIntenSelectables, false);
103+
104+
if (AttachedIntenSelectables.Num() > 1)
105+
{
106+
if (!ScoringBehaviour)
107+
{
108+
ShowErrorAndQuit(
109+
"Please assign the Scoring Behaviour manually when using more than one IntenSelectable Component!");
110+
}
111+
}
112+
else
113+
{
114+
InitDefaultBehaviourReferences();
115+
}
116+
}

0 commit comments

Comments
 (0)