Unreal 개발 본 캠프 33일차

HappyCircle·2026년 1월 14일

Unreal 개발

목록 보기
50/163

오늘 학습 진행 내용

[6번 과제] 회전 발판과 움직이는 장애물

장애물 인터페이스 기반 상속 클래스로 설계

IIObstacleInterface : 장애물 인터페이스

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;
}

BaseObstacle : 장애물 부모 클래스

// 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();
}

AFallingObstacle : 떨어지는 장애물 클래스

APatrolObstacle : 움직이는 장애물 클래스

해당 구조로 설계

1차적으로 구조 설계 이후 내부 기능들 구현 및 나머지 요구사항 구현

필수 과제 1번 - 서로 다른 Actor 클래스 2개 이상 구현

  • 각각 StaticMeshComponent를 가지며, 맵에 배치 가능한 형태여야 합니다.
  • 두 클래스는 서로 다른 동작 로직을 수행해야 합니다.

필수 과제 2번 - Tick 함수 기반 동적 Transform 변경

  • 회전 기능
    • Tick(float DeltaTime)에서 AddActorLocalRotation() 사용하여 매 프레임 회전 처리
  • 이동 기능
    • Tick(float DeltaTime)에서 위치를 변경하여 왕복 이동 구현
    • MoveSpeed, MaxRange, StartLocation 등을 고려해 일정 범위를 벗어나면 이동 방향을 반전시키는 로직 구성
  • 프레임 독립성
    • 이동/회전 시 반드시 DeltaTime을 활용하여 하드웨어 성능에 관계없이 일정한 움직임을 보장해야 합니다.

필수 과제 3번 - 리플렉션 적용

  • 주요 변수 (회전 속도, 이동 속도, 이동 범위 등)를 UPROPERTY로 선언하여 에디터에서 조정 가능하게 만들어야 합니다.
  • EditAnywhere, BlueprintReadWrite, Category 등을 적절히 활용하여 Details 패널에서 편집 가능하게 만듭니다.
  • 플레이 중 Details 패널에서 값 변경 시 즉시 반영되는지 확인합니다.

4️⃣ 도전 과제 (선택 요구 사항) 🦅

도전 과제 1번 - 타이머 시스템 활용 (난이도 중상)

  • 타이머 활용
    • FTimerHandleGetWorld()->GetTimerManager().SetTimer(...)를 사용해 특정 시간 후 또는 주기적으로 함수를 호출합니다.
    • 매 프레임 호출(Tick)보다 효율적인 퍼포먼스를 제공합니다.
  • 시간 기반 로직 구현
    • 일정 시간 후 발판이 사라지거나, 주기적으로 다른 위치로 이동하는 로직을 추가합니다.

도전 과제 2번 - 랜덤 퍼즐 생성 (난이도 상)

  • 동적 스폰
    • 게임 시작 시 SpawnActor를 통해 회전 발판/이동 플랫폼임의 좌표에 여러 개 배치합니다. (언리얼 공식 문서 SpawnActor)
    • 랜덤 스테이지의 기초 개념을 체험할 수 있습니다.
  • 랜덤 속성 부여
    • 회전/이동 속도, 이동 범위, 각도 등을 FMath::RandRange로 생성하여 매번 다른 퍼즐 코스를 구성합니다.
profile
개발합시다!

0개의 댓글