I’m at the end of the “Dependency Injection” lesson, I pick up the gargoyle, place it in the secret nook and nothing happens. I don’t know how to troubleshoot this, this project has been incredibly difficult and way over my head, sorry in advance. Here’s what I’ve tried and I’ll post relevant info below:
- Refreshing VSC in UE
- Rebuilding in VSC and relaunching UE
- Crying
- Reviewing the lesson resource code and ensuring they match.
My gargoyle and BP_SecretWall Trigger have the Acceptable Actor Tag ‘Unlock1’, I’ve tried removing and re-adding these, not sure how these are supposed to be configured.
Mover.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "Mover.generated.h"
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class CRYPTRAIDER_API UMover : public UActorComponent
{
GENERATED_BODY()
public:
// Sets default values for this component's properties
UMover();
protected:
// Called when the game starts
virtual void BeginPlay() override;
public:
// Called every frame
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
void SetShouldMove(bool ShouldMove);
private:
UPROPERTY(EditAnywhere)
FVector MoveOffset;
UPROPERTY(EditAnywhere)
float MoveTime = 4;
bool ShouldMove = false;
FVector OriginalLocation;
};
Mover.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "Mover.h"
#include "Math/UnrealMathUtility.h"
// Sets default values for this component's properties
UMover::UMover()
{
// Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features
// off to improve performance if you don't need them.
PrimaryComponentTick.bCanEverTick = true;
// ...
}
// Called when the game starts
void UMover::BeginPlay()
{
Super::BeginPlay();
OriginalLocation = GetOwner()->GetActorLocation();
}
// Called every frame
void UMover::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
if (ShouldMove)
{
FVector CurrentLocation = GetOwner()->GetActorLocation();
FVector TargetLocation = OriginalLocation + MoveOffset;
float Speed = FVector::Distance(OriginalLocation, TargetLocation) / MoveTime;
FVector NewLocation = FMath::VInterpConstantTo(CurrentLocation, TargetLocation, DeltaTime, Speed);
GetOwner()->SetActorLocation(NewLocation);
}
}
void UMover::SetShouldMove(bool NewShouldMove)
{
ShouldMove = NewShouldMove;
}
TriggerComponent.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Components/BoxComponent.h"
#include "Mover.h"
#include "TriggerComponent.generated.h"
/**
*
*/
UCLASS(ClassGroup = (Custom), meta = (BlueprintSpawnableComponent))
class CRYPTRAIDER_API UTriggerComponent : public UBoxComponent
{
GENERATED_BODY()
public:
UTriggerComponent();
protected:
// Called when the game starts
virtual void BeginPlay() override;
public:
// Called every frame
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction) override;
UFUNCTION(BlueprintCallable)
void SetMover(UMover* Mover);
private:
UPROPERTY(EditAnywhere)
FName AcceptableActorTag;
UMover* Mover;
AActor* GetAcceptableActor() const;
};
TriggerComponent.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "TriggerComponent.h"
UTriggerComponent::UTriggerComponent()
{
PrimaryComponentTick.bCanEverTick = true;
}
void UTriggerComponent::BeginPlay()
{
Super::BeginPlay();
}
void UTriggerComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
if (Mover == nullptr)
{
return;
}
AActor* Actor = GetAcceptableActor();
if (Actor != nullptr)
{
Mover->SetShouldMove(true);
}
else
{
Mover->SetShouldMove(false);
}
}
void UTriggerComponent::SetMover(UMover* NewMover)
{
Mover = NewMover;
}
AActor* UTriggerComponent::GetAcceptableActor() const
{
TArray<AActor*> Actors;
GetOverlappingActors(Actors);
for (AActor* Actor : Actors)
{
if (Actor->ActorHasTag(AcceptableActorTag))
{
return Actor;
}
}
return nullptr;
}