언리얼에서 C++ 파일 삭제
1. Solution Explorer에서 Remove(Del)를 하고 Save All(ctrl+shift+s)로 저장한다. 이 작업은 솔루션에서만 제거를 하고 아직 디스크의 파일(물리 파일)은 남아있다.
2. 프로젝트 폴더에서 방금 Remove했던 .h, .cpp파일을 직접 삭제를 한다.(물리 파일 삭제)
3. VS로 돌아가서 빌드를 한 후 다시 언리얼 에디터를 실행하면 해당 클래스가 컨텐츠 브라우저에서도 사라진 것을 확인할 수 있다.
만약 이 과정을 무시하고 언리얼 에디터에서만 삭제하거나 솔루션에서 Remove하지 않고 폴더에서 파일을 삭제하면 빌드 에러 또는 클래스 미삭제 같은 문제가 발생한다.
항상 에디터 종료 -> 솔루션 Remove -> 물리 파일 삭제 -> VS 빌드 -> 에디터 재실행 순서로 삭제하면 안전하다.
C++로 액터에 컴포넌트 추가하기
언리얼엔진에서 C++로 액터를 생성하고 뷰포트에 배치를하면 월드에서 보이지도 않고 위치가 중앙으로 고정되어 생성된다.
이는 액터가 루트 컴포넌트와 시각적 컴포넌트(3D 메시)를 설정하지 않았기 때문이다.
루트 컴포넌트는 액터의 트랜스폼(위치, 회전, 크기)을 정의하는 최상위 컴포넌트이며, 모든 하위 컴포넌트가 이를 기준으로 트랜스폼이 계산이 된다. 보통 Scene Component를 루트 컴포넌트로 설정하여 액터의 트랜스폼을 관리하고 그 아래에 다양한 컴포넌트를 계층적으로 붙인다.
스태틱 메시 컴포넌트는 애니메이션이나 스켈레탈 본 없이(움직임이 없고 단순 이동, 회전만 하는) 정적 3D 모델을 그리는 컴포넌트이다. 환경, 아이템, 단순 기믹 오브젝트 등 움직임이 단순하거나 없는 오브젝트에 주로 적합하다.
C++로 액터에 씬 컴포넌트와 스태틱 메시 컴포넌트 연결하기.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Item.generated.h"
UCLASS()
class STUDY5_API AItem : public AActor
{
GENERATED_BODY()
public:
AItem();
protected:
USceneComponent* SceneRoot;
UStaticMeshComponent* StaticComp;
};
씬 컴포넌트와 스태틱 메시 컴포넌트 포인터를 멤버 변수 선언
#include "Item.h"
AItem::AItem()
{
SceneRoot = CreateDefaultSubobject<USceneComponent>(TEXT("SceneRoot"));
SetRootComponent(SceneRoot);
}
생성자에서 씬 컴포넌트(이름은 "SceneRoot")를 생성하고 SceneRoot 변수에 대입 후 Item 액터의 루트 컴포넌트로 설정
StaticMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));
StaticMeshComp->SetupAttachment(SceneRoot);
생성자에서 스태틱 메시 컴포넌트(이름은 "StaticMesh")를 생성하고 StaticMeshComp 변수에 대입 후 StaticMeshComp의 SetupAttachment 함수로 SceneRoot에 붙임.
빌드 후 언리얼 에디터에서 확인해보면 Item 액터에 SceneRoot 이름의 씬 컴포넌트가 생성된 걸 볼 수 있다.
하지만 스태틱 메시 컴포넌트는 아직 보이지 않는데 C++에서 생성한 액터를 에디터에서 설정을 하려면 리플렉션 시스템을 이용해야하는데 이는 나중에 자세히 배울 예정이다. 루트컴포넌트는 무조건 리플렉션 시스템에 등록이 자동으로 되어 보이는것.
이제 스태틱 메시 컴포넌트에 에셋을 적용시켜서 눈에 보이도록 해보자.
넣을 에셋을 우클릭 해서 Copy Reference를 누른다.(ctrl+c)
복사를 해서 C++에 붙여넣기를 하면 / Script / Engine.StaticMesh'/Game/Resources/Props/SM_Chair.SM_Chair' 이렇게 뜨는데 앞 부분은 지우고 따옴표 안의 /Game ~ _chair까지가 이 에셋의 경로다. 머티리얼도 똑같은 방식으로 경로를 찾아준다.
static ConstructorHelpers::FObjectFinder<찾을 에셋 타입> 변수 이름(TEXT("에셋의 경로")); 으로 에셋을 로드하여 변수에 참조를 보관할 수 있다.
// StaticMesh 타입의 에셋을 지정한 경로에서 찾아서 로드해두고 MeshAsset 변수에 참조를 보관한다.
static ConstructorHelpers::FObjectFinder<UStaticMesh> MeshAsset(TEXT("/Game/Resources/Props/SM_Chair.SM_Chair"));
if (MeshAsset.Succeeded()) // MeshAsset에 성공적으로 참조가 됐으면
{
StaticMeshComp->SetStaticMesh(MeshAsset.Object); // StaticMeshComp가 그릴 스태틱 메시를 MeshAsset(Object)로 설정한다.
}
머티리얼도 같은 방식으로 적용시킬수 있는데 하나의 스태틱 메시에 여러 개의 머티리얼 슬롯이 존재할 수 있기 때문에 몇 번째 슬롯에 적용할지 인덱스를 적어줘야 한다.
// 찾을 에셋 타입은 UMaterial
static ConstructorHelpers::FObjectFinder <UMaterial> MaterialAsset(TEXT("/Game/Resources/Materials/M_Metal_Gold.M_Metal_Gold"));
if (MaterialAsset.Succeeded()) // MeshAsset에 성공적으로 참조가 됐으면
{
StaticMeshComp->SetMaterial(0, MaterialAsset.Object); // 0번째 슬롯에 MaterialAsset을 적용하겠다.
}
빌드를 하고 에디터를 켜보면 적용한 스태틱메시와 머티리얼이 변경되어 있는걸 확인할 수 있다.
'언리얼 + cpp' 카테고리의 다른 글
언리얼C++ 3일차(리플렉션 시스템) (0) | 2025.09.16 |
---|---|
언리얼C++ 2일차(트랜스폼) (0) | 2025.09.15 |
언리얼C++ 2일차(UE_LOG, 라이프 사이클 함수) (0) | 2025.09.15 |
언리얼 엔진 C++ 공부 1일차(폴더, 빌드, 라이브코딩, 빌드 문제 복구하기) (0) | 2025.09.12 |
UE_LOG를 활용한 로또 번호 생성기 구현하기 (1) | 2025.08.28 |