생성자

주상돈·2025년 2월 4일

TIL

목록 보기
23/53
#include "MovingScaffolding.h"
#include "Components/BoxComponent.h"


AMovingScaffolding::AMovingScaffolding()
{
	PrimaryActorTick.bCanEverTick = true;

    Scene = CreateDefaultSubobject<USceneComponent>(TEXT("Scene"));
    SetRootComponent(Scene);

    Collision = CreateDefaultSubobject<UBoxComponent>(TEXT("Collision"));
    Collision->SetCollisionProfileName(TEXT("OverlapAllDynamic"));
    Collision->SetupAttachment(Scene);

    StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));
    StaticMesh->SetupAttachment(Collision);

    StartLocation = GetActorLocation();
    bMovingForward = true;

}

void AMovingScaffolding::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

    FVector CurrentLocation = GetActorLocation();
    float DistanceTraveled = (CurrentLocation - StartLocation).Size();
    // 왕복 여부를 판단하는 변수
    if (bMovingForward)
    {
        if (DistanceTraveled >= MaxRange)
        {
            // MaxRange에 도달하면 반대 방향으로 이동
            bMovingForward = false;
        }
    }
    else
    {
        if (DistanceTraveled <= 0.0f)
        {
            // StartLocation으로 돌아오면 다시 정방향으로 이동
            bMovingForward = true;
        }
    }
    // 정방향 또는 반대 방향으로 이동
    FVector MoveDirection = bMovingForward ? FVector(1, 0, 0) : FVector(-1, 0, 0);
    FVector NewLocation = CurrentLocation + MoveDirection * MoveSpeed * DeltaTime;
    SetActorLocation(NewLocation);
}

언리얼 엔진5에서 움직이는 발판을 만들기위해서 이렇게 코드를 짜고 빌드를 하고 실행해보았다..
그랬더니... 이 발판이 MaxRange만큼 움직이기는 하는 것 같은데.. 시작지점에서 멈춰야하는데 멈추지 않는다 그래서 궁금해서 로그를 추가해서 한 번 다시 빌드하고 실행해보았더니..

첨이동한 DistanceTraveled값이 377.094147이 찍히는 것이다. 그래서 생각해봤더니

AMovingScaffolding::AMovingScaffolding()
{
	PrimaryActorTick.bCanEverTick = true;

    Scene = CreateDefaultSubobject<USceneComponent>(TEXT("Scene"));
    SetRootComponent(Scene);

    Collision = CreateDefaultSubobject<UBoxComponent>(TEXT("Collision"));
    Collision->SetCollisionProfileName(TEXT("OverlapAllDynamic"));
    Collision->SetupAttachment(Scene);

    StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));
    StaticMesh->SetupAttachment(Collision);

    StartLocation = GetActorLocation();
    bMovingForward = true;

}

여기 안에있는 StartLocation = GetActorLocation(); 이 친구의 위치가 잘못 된 것이다. 이건 생성자이기 때문에 내가 액터를 처음에 배치한 그러니까. 월드에 생성하기위해 대충 끌어다가 놓은 지점의 좌표를 StartLocation에 저장하기 때문이였다.. 그러니 DistanceTraveled값이 내가 생각했던 예상값이 나오지 않았던 것이다. 그래서 BeginPlay함수를 추가해서 넣어주었다.

void AMovingScaffolding::BeginPlay()
{
    Super::BeginPlay();

    // 게임이 시작될 때 초기 위치를 설정
    StartLocation = GetActorLocation();  // 정확한 시작 위치로 설정
}

그러고나서 실행하니 잘 움직인다

0개의 댓글