저는 우선 움직이는 발판의 경우
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Scaffolding|Component")
USceneComponent* Scene;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Scaffolding|Component")
UBoxComponent* Collision;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Scaffolding|Component")
UStaticMeshComponent* StaticMesh;
MovingScaffolding.h
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);
MovingScaffolding.cpp
RootComponent Scene을 달고 그아래에 Box모양의 Collision과 발판의 모양과 재질을 추가해주는 StaticMesh 도 달아주었다
public:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Scaffolding|Component")
USceneComponent* Scene;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Scaffolding|Component")
UBoxComponent* Collision;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Scaffolding|Component")
UStaticMeshComponent* StaticMesh;
virtual void Tick(float DeltaTime) override;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Platform Settings")
float MoveSpeed = 100.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Platform Settings")
float MaxRange = 1000.0f;
private:
FVector StartLocation;
bool bMovingForward;
MovingScaffolding.h
void AMovingScaffolding::BeginPlay()
{
Super::BeginPlay();
// 게임이 시작될 때 초기 위치를 설정
StartLocation = GetActorLocation(); // 정확한 시작 위치로 설정
}
MovingScaffolding.cpp
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);
bMovingForward = true;
}
그 후 생성자에 bMovingForward의 값을 true값을 저장하였습니다. 처음에는 정방향으로 움직여야 하기때문에...
void AMovingScaffolding::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
FVector CurrentLocation = GetActorLocation();
float DistanceTraveled = (CurrentLocation - StartLocation).X;
// 왕복 여부를 판단하는 변수
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);
}

public:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Capsule|Component")
USceneComponent* Scene;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Capsule|Component")
UCapsuleComponent* Collision;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Capsule|Component")
UStaticMeshComponent* StaticMesh;
virtual void Tick(float DeltaTime) override;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Platform Settings")
float RotationSpeed = 10.0f;
RotatorCapsule.h
ARotatorCapsule::ARotatorCapsule()
{
PrimaryActorTick.bCanEverTick = true;
Scene = CreateDefaultSubobject<USceneComponent>(TEXT("Scene"));
SetRootComponent(Scene);
Collision = CreateDefaultSubobject<UCapsuleComponent>(TEXT("Collision"));
Collision->SetCollisionProfileName(TEXT("OverlapAllDynamic"));
Collision->SetupAttachment(Scene);
StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));
StaticMesh->SetupAttachment(Collision);
}
RotatorCapsule.cpp
void ARotatorCapsule::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
// 액터가 로컬 좌표계에서 Yaw 축으로 지정한 스피드만큼 회전
FRotator RotationDelta(0.f, RotationSpeed * DeltaTime, 0.f);
AddActorLocalRotation(RotationDelta);
}
RotatorCapsule.cpp