Unreal 개발 본 캠프 29일차

HappyCircle·2026년 1월 8일

Unreal 개발

목록 보기
46/163

오늘 학습 진행 내용

C++와 Unreal Engine으로 3D 개발

언리얼 C++ 프로젝트에서 Visual Studio 2022에서 디버그 할 시 옵션 선택으로 빌드 구성 선택할 수 있다.

  • DebugGame
    • 게임 로직만 디버그 정보를 포함하고, 엔진은 최적화된 상태로 빌드합니다.
    • 언리얼 에디터 없이, 독립된 실행 파일 환경에서 게임 로직을 디버깅할 때 사용됩니다. 엔진 코드는 디버깅이 제한적이며, 게임 로직만 효과적으로 디버깅 가능합니다.
  • DebugGame Editor
    • 에디터 환경에서 게임 로직을 디버그하기 편한 설정입니다.
    • 에디터 플레이 중에 C++ 로직을 추적하거나 브레이크포인트를 걸어볼 수 있습니다.
  • Development
    • 디버그 정보를 최소화해 실행 속도를 높인 개발용 빌드입니다.
    • 독립 실행 파일 환경 테스트·개발 단계에서 주로 쓰입니다.
  • Development Editor
    • 에디터에서도 개발·테스트를 원활히 할 수 있도록 구성된 빌드 모드입니다.
    • Live Coding 사용 시나리오와 궁합이 좋고, 초·중급자들이 자주 사용합니다.
    • 본 강의에서도 기본 모드로 활용합니다.
  • Shipping
    - 최종 사용자에게 배포할 때 사용하는 릴리스 빌드입니다.
    - 디버그 정보를 제거하고, 성능 최적화가 극대화됩니다.
    전체 솔루션 빌드를 할 수도 있고 부분적으로 특정 프로젝트 선택해서 따로 빌드 가능하다.
    빌드 시 Visual Studio에서 F5로 빌드 후 언리얼 에디터 재연결로 결과 확인 가능
    라이브 코딩 시 즉시 반영해서 하는 것도 가능하지만 제대로 반영안되는 케이스들 존재해서 잘 안쓰임
  • 적용이 안 되는 경우
    • UCLASS, USTRUCT, UENUM 매크로의 추가·삭제·수정
    • 새로운 C++ 클래스 (.h/.cpp) 생성
    • 엔진 소스 코드 (Engine 폴더 내 코드) 변경
    • 함수 시그니처 (인자, 반환값)나 클래스 상속 구조 변경

빌드 문제 해결 가이드
1. 언리얼 에디터와 Visual Studio 종료
- 실행 중인 프로세스들이 빌드 파일을 잠글 수 있으므로, 모두 끄고 새로 시작하는 것이 좋습니다.
2. 프로젝트 폴더에서 Intermediate, DerivedDataCache, Saved 폴더 삭제
- 이 폴더들은 빌드 캐시임시 데이터를 담고 있습니다.
- 삭제 후 다시 빌드하면 새로 생성되어, 잘못된 캐시로 인한 오류를 해결할 수 있습니다.
3. .uproject 파일을 우클릭 → “Generate Visual Studio project files”
- 솔루션(.sln) 파일과 프로젝트 설정을 재생성하여, 누락되었거나 꼬인 구성을 복구합니다.
4. Visual Studio에서 클린 빌드 수행
- 새로 생성된 솔루션 (.sln 파일)을 Visual Studio에서 열고 다음을 수행
- Build → Clean Solution으로 기존 빌드 산출물을 정리
- Build → Build Solution으로 프로젝트 재빌드
- 에러가 난다면 Output 창Error List를 확인해 원인을 파악하고 수정합니다.
5. 언리얼 에디터 다시 실행
- 에디터를 다시 실행해 코드 변경 사항이 반영되었는지 확인합니다.
- 여전히 문제가 해결되지 않는다면, 프로젝트 내 Saved/Logs 폴더에 있는 로그 파일을 열어 구체적인 에러 메시지를 확인하거나, 엔진 버전 및 프로젝트 설정을 점검해보세요.

C++활용해서 캐릭터 회전, 이동, 크기 설정

void AHomework1_6::BeginPlay()
{
	Super::BeginPlay();
	SetActorLocation(FVector(0.0f));
	SetActorRotation(FRotator(45.0f));
	SetActorScale3D(FVector(2.0f));
	SpeedZ = 200.0f;
	RotationSpeed = 90.0f;
}

// Called every frame
void AHomework1_6::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
	if (!FMath::IsNearlyZero(RotationSpeed)) {
		AddActorLocalRotation(FRotator(RotationSpeed*DeltaTime));
	}

	if (!FMath::IsNearlyZero(SpeedZ)) {
		SetActorLocation(GetActorLocation() + FVector(0, 0, SpeedZ * DeltaTime));
	}

	RunningTime += DeltaTime;
	
	// K = 2π / 원하는_주기(초)
	 
	// 2초 주기 → sin은 기본적으로 2π가 한 주기
	float TimeFactor = RunningTime * PI; // PI → 2초 주기

	// -1 ~ 1
	float SinValue = FMath::Sin(TimeFactor);

	// 0 ~ 1로 변환
	float Alpha = (SinValue + 1.f) * 0.5f;

	// 스케일 보간
	float CurrentScale = FMath::Lerp(MinScale, MaxScale, Alpha);

	SetActorScale3D(FVector(CurrentScale));

}

생성자 통해서 스태틱 메시, 머테리얼 할당

AItem::AItem()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	// 
	// Component 설정
	//Scence Component를 생성하고 루트로 설정

	SceneRoot = CreateDefaultSubobject<USceneComponent>(TEXT("SceneRoot"));
	SetRootComponent(SceneRoot);
	
	//Static MEsh Componenet를 생성하고 Scence Component에 Attatch
	StaticMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMeshComp"));
	StaticMeshComp->SetupAttachment(SceneRoot);

	static ConstructorHelpers::FObjectFinder<UStaticMesh> MeshAsset(TEXT("/Game/Resources/Props/SM_Chair.SM_Chair"));
	if (MeshAsset.Succeeded()) {
		StaticMeshComp->SetStaticMesh(MeshAsset.Object);
	}

	static ConstructorHelpers::FObjectFinder<UMaterial> MaterialAsset(TEXT("/Game/Resources/Materials/M_Metal_Gold.M_Metal_Gold"));
	if (MaterialAsset.Succeeded()) {
		StaticMeshComp->SetMaterial(0,MaterialAsset.Object);
	}
	UE_LOG(LogSparta, Warning, TEXT("%s Constructor"), *GetName());

	PrimaryActorTick.bCanEverTick = true;
	RotationSpeed = 90.0f;
}

###라이플사이클 함수 정의

	//라이프 사이클 함수들
	virtual void PostInitializeComponents() override;
	virtual void BeginPlay() override;
	virtual void Tick(float DeltaTime) override;
	virtual void Destroyed() override;
	virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
profile
개발합시다!

0개의 댓글