Today I was playing around with supporting 2 ways of following a path.
- By distance - Given a path it moves to a point every
x
distance. - By points - Given a path it moves to each point the Spline has configured.
https://blueprintue.com/blueprint/zmunmar-/
And my full path-following code looks like this:
#pragma once
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "Components/SplineComponent.h"
#include "DrawDebugHelpers.h"
#include "SplineFollowerBase.generated.h"
UENUM(BlueprintType)
enum class EFollowingType : uint8
{
ByDistance UMETA(DisplayName = "By Distance"),
ByPoints UMETA(DisplayName="By Points")
};
UCLASS(BlueprintType, Blueprintable)
class SKY_PATROL_API USplineFollowerBase : public UActorComponent
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Spline")
USplineComponent* TargetSpline;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Spline")
float DistanceToMove = 200.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Spline")
EFollowingType FollowingType = EFollowingType::ByDistance;
protected:
UFUNCTION(BlueprintCallable)
UPARAM(DisplayName="NextTargetDistance") float CalculateNextTargetDistanceBase();
UFUNCTION(BlueprintCallable)
UPARAM(DisplayName="NextPointIndex") int CalculateNextPointIndexBase();
private:
float NextTargetDistance = -1.0f;
int NextPointIndex = -1;
};
#include "SplineFollowerBase.h"
#include "Utils/MyStringUtils.h"
float USplineFollowerBase::CalculateNextTargetDistanceBase()
{
check(TargetSpline != nullptr);
const auto TargetSplineTotalLength = TargetSpline->GetSplineLength();
// staring the movement
if (NextTargetDistance < 0.0f)
{
NextTargetDistance = 0.0f;
}
// looping
else if (NextTargetDistance >= TargetSplineTotalLength)
{
NextTargetDistance = 0.0f;
}
else
{
NextTargetDistance = FMath::Clamp(NextTargetDistance + DistanceToMove, 0.0f, TargetSplineTotalLength);
}
PrintString(FString::Printf(TEXT("NextTargetDistance: %f"), NextTargetDistance));
return NextTargetDistance;
}
int USplineFollowerBase::CalculateNextPointIndexBase()
{
check(TargetSpline != nullptr);
const auto TargetSplineTotalPoints = TargetSpline->GetNumberOfSplinePoints();
NextPointIndex = (NextPointIndex + 1) % TargetSplineTotalPoints;
PrintString(FString::Printf(TEXT("NextPointIndex: %d"), NextPointIndex));
return NextPointIndex;
}
Top comments (0)