장애물 인터페이스 기반 상속 클래스로 설계
class ROTATINGANDMOVING_API IIObstacleInterface
{
GENERATED_BODY()
// Add interface functions to this class. This is the class that will be inherited to implement this interface.
public:
virtual void OnObstcaleOverlap(AActor* OverlapActor) = 0;
virtual void OnObstacalEndOverlap(AActor* OverlapActor) = 0;
virtual FName GetObtacleType() const = 0;
virtual void Move(float MaxRange, float MoveSpeed, FVector StartLocation) = 0;
virtual void Rotate() = 0;
virtual void Spawn() = 0;
}
// Fill out your copyright notice in the Description page of Project Settings.
#include "BaseObstacle.h"
// Sets default values
ABaseObstacle::ABaseObstacle()
{
// Scene Component를 생성하고 루트로 설정
SceneRoot = CreateDefaultSubobject<USceneComponent>(TEXT("SceneRoot"));
SetRootComponent(SceneRoot);
// Static Mesh Component를 생성하고 Scene Component에 Attach
StaticMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));
StaticMeshComp->SetupAttachment(SceneRoot);
}
// Called when the game starts or when spawned
void ABaseObstacle::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void ABaseObstacle::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
void ABaseObstacle::OnObstcaleOverlap(AActor* OverlapActor)
{
}
void ABaseObstacle::OnObstacalEndOverlap(AActor* OverlapActor)
{
}
FName ABaseObstacle::GetObtacleType() const
{
return ObtacleType;
}
void ABaseObstacle::Move(float MaxRange, float MoveSpeed, FVector StartLocation)
{
}
void ABaseObstacle::Rotate()
{
}
void ABaseObstacle::Spawn()
{
}
// 장애물을 파괴(제거)하는 함수
void ABaseObstacle::DestoryObstacle()
{
// AActor에서 제공하는 Destroy() 함수로 객체 제거
Destroy();
}
해당 구조로 설계
1차적으로 구조 설계 이후 내부 기능들 구현 및 나머지 요구사항 구현
Tick(float DeltaTime)에서 AddActorLocalRotation() 사용하여 매 프레임 회전 처리Tick(float DeltaTime)에서 위치를 변경하여 왕복 이동 구현MoveSpeed, MaxRange, StartLocation 등을 고려해 일정 범위를 벗어나면 이동 방향을 반전시키는 로직 구성DeltaTime을 활용하여 하드웨어 성능에 관계없이 일정한 움직임을 보장해야 합니다.UPROPERTY로 선언하여 에디터에서 조정 가능하게 만들어야 합니다.EditAnywhere, BlueprintReadWrite, Category 등을 적절히 활용하여 Details 패널에서 편집 가능하게 만듭니다.FTimerHandle과 GetWorld()->GetTimerManager().SetTimer(...)를 사용해 특정 시간 후 또는 주기적으로 함수를 호출합니다.Tick)보다 효율적인 퍼포먼스를 제공합니다.SpawnActor를 통해 회전 발판/이동 플랫폼을 임의 좌표에 여러 개 배치합니다. (언리얼 공식 문서 SpawnActor)FMath::RandRange로 생성하여 매번 다른 퍼즐 코스를 구성합니다.