Spline을 Control 할 Actor를 만들어 사용하는 방식으로 제작.
시간을 이용해 Speed를 조절하는 방식으로 "총 소요 시간"을 제어하는 의도로 구현.
Spline을 이용한 캐릭터 이동
Spline Actor 생성자
#include "Components/SplineComponent.h"
// Sets default values
ASplineController::ASplineController()
{
PrimaryActorTick.bCanEverTick = true;
Spline = CreateDefaultSubobject<USplineComponent>(TEXT("Spline"));
Spline->SetupAttachment(Root);
Spline->Duration = 10.f;
Spline->bDrawDebug = true;
TotalPathTime = 10.0f;
}
Spline Actor로 Spline 생성과 Control을 담당한다.
Spline Actor Tick 함수
void ASplineController::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
if (Cur_GameMode->MyCharacter->IsMoving) {
if (Cur_GameMode->bSplineToggle) {
SplineAtoB();
}
else {
SplineBtoA();
}
}
}
캐릭터가 A >> B >> A >> B처럼 왔다 갔다를 반복하게 만들었다.
Spline을 통한 이동 함수
void ASplineController::SplineAtoB() {
if ((Cur_GameMode->MyCharacter != nullptr) && (bCanMove)){
// 현재 (시간, 거리)
TimePercent = (GetWorld()->GetTimeSeconds() - StartTime) / TotalPathTime;
float Distance = Spline->GetSplineLength() * TimePercent;
// Spline Position
FVector Position = Spline->GetLocationAtDistanceAlongSpline(Distance, ESplineCoordinateSpace::World);
Cur_GameMode->MyCharacter->SetActorLocation(Position);
// Spline Rotation
FVector Direction = Spline->GetDirectionAtDistanceAlongSpline(Distance, ESplineCoordinateSpace::World);
// Create rotator given a vector director (normalized)
FRotator Rotator = FRotationMatrix::MakeFromX(Direction).Rotator();
Cur_GameMode->MyCharacter->SetActorRotation(Rotator);
// 도착
if (TimePercent >= 1.0f){
//bCanMove = false;
StartTime = GetWorld()->GetTimeSeconds();
// 토글
Cur_GameMode->bSplineToggle = !Cur_GameMode->bSplineToggle;
}
}
}
가장 중요한 포인트는 "시간을 통해 거리를 계산", "Spline->GetLocationAtDistanceAlongSpline"이다.
Spline->GetLocationAtDistanceAlongSpline(Distance, ESplineCoordinateSpace::World);
이 함수는 매개변수 Distance만큼의 거리를 Spline 위치로 계산해 반환한다.
따라서 Spline의 총 길이를 미리 알고 계산을 직접 해주어야 하는 함수이다.
TimePercent = (GetWorld()->GetTimeSeconds() - StartTime) / TotalPathTime;
float Distance = Spline->GetSplineLength() * TimePercent;
(현재 시간 - 시작 시간) / 총 소요시간 계산식을 통해 현재 시간에 따른 퍼센트% 을 알아내고,
총길이 * 퍼센트% 계산식을 통해 현재 거리를 알아내는 방식이다.
Spline을 통한 이동 함수 (반대로)
// 현재 (시간, 거리)
TimePercent = (GetWorld()->GetTimeSeconds() - StartTime) / TotalPathTime;
// 거꾸로 이동 거리 계산
float Distance = Spline->GetSplineLength() * (1 - TimePercent);
반대로 이동하는 함수는 거리 계산만 바꿔주면 된다.
(1 - 시간 퍼센트) 계산식을 통해 거꾸로 거리 계산
장점과 단점
장점
"총 소요 시간"에 따라 콘텐츠를 조절하는 게 목적이라면 Speed를 직접 조절하는 것보다 편하다.
단점
다른 로직에서 "시간을 조절"을 한다면 복잡해지는 문제가 있다.
예를 들어 캐릭터가 중간에 멈추어야 하거나 시간 흐름에 제어가 있다면 로직이 꽤나 복잡해진다.
'언리얼' 카테고리의 다른 글
[Unreal] EQS Test와 Context (0) | 2023.09.19 |
---|---|
[Unreal] Collision 충돌 C++ (0) | 2023.08.24 |
[Unreal] 내가 겪은 에러 모음 (2) | 2023.07.29 |