- 1-4 Actor 클래스에 컴포넌트 추가하기

먼저 저번 시간에 배운 그대로 Item Actor 을 public class로 다시 생성해준다.

그 다음 비쥬얼 스튜디오에서 Item. header 파일을 다시 확인 해준다
#pragma once
언리얼 엔진에는 header file 상단에 pragma once 라는 것이 있다
C++에서 클래스를 사용하려면 #include로 헤더 파일을 가져와야 한다.
여러 개의 .cpp 파일이 같은 헤더 파일을 포함하면 중복 정의 오류가 발생함.
#pragma once를 쓰면 "이미 가져왔으니까 또 가져오지 마!"라고 해서 오류를 막아줌!
c++에는 #idendif #define #endif 등과 같은 비슷한 기능을 하는 친구들이 있다

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Item.generated.h"
header file
첫번째 애는 로그 찍을때, string같은 기본 타입들을 다 포함하고 있는 헤더파일
두번째 애는 Actor class에 대한 정보를 갖고있는 헤더파일
세번째 애는 리플렉션 시스템 : 코드들을 블루프린트에서 볼 수 있게 해주는 을 포함하는 헤더파일
UCLASS() //리플렉션 시스템과 연관
class SPARTA_API AItem : public AActor // 이 클래스를 모듈 밖으로 추가하는 것
// 빌드랑 관련있는 mechro
{
GENERATED_BODY() // 리플렉션 시스템과 연관, mechro라고 부르기도 함
// 리플렉션 시스템이란 코드들을 블뤁프린트에서 확인할수 있게 하는 것
public:
AItem(); // 생성자
protected:
virtual void BeginPlay() override; // 블루프린트 , actor가 가지고 있는 lifecycle 함수
public:
virtual void Tick(float DeltaTime) override; // 블루프린트 , lifecycle 함수
};
header file
AActor, AIem 인 이유
: 언리얼 엔진 자체에서는 클래스 앞에 접두어를 붙이는 것을 권장함.
오브젝트 - U
구조체 - F
Enum - E
이러한 언리얼 엔진 자체에서 권장하는 코딩 컨벤션이 존재한다.
( 언리얼 교재에 적혀 있음 )
#include "Item.h"
AItem::AItem()
{
PrimaryActorTick.bCanEverTick = true; // tick 함수 관련 선언
}
void AItem::BeginPlay() // begin class 구현부0
{
Super::BeginPlay();
}
void AItem::Tick(float DeltaTime) // tick 구현부, overriding
{
Super::Tick(DeltaTime);
}
c++ file

다시 c++ 로 돌아와서 Item actor 을 배치해준다.

actor가 제대로 인식되지 않기 때문에 원하는 위치에 배치되지 않는다.
그 이유는 actor가 root component가 없어서 제대로 인식되지 않기 때문이다.
root component가 하나라도 있어야 제대로 된 actor의 역할을 수행한다.
root component란 component 의 조상 같은 것이다


학습을 위해서 bluprint actor 클래스를 생성한다.

그다음 얘를 실행해준다.

얘를 자세히 살펴보면 좌측에 SceneRoot로 루트 컴퍼넌트가 이미 만들어져 있다.

root component 가 만들어져있기에
얘는 아무데나 끌어 놓아도 아무데나 위치 한다.
아까 c++ 클래스로 만들 때에는 아무데나 놓아도 중앙에 배치되었었음
component 란 각각 기능이 있는 하나의 부품이라고 생각하면 된다.


여기서 추가를 누른다음에 오디오 컴퍼넌트를 추가해준다.
그럼 오디오 컴퍼넌트가 root 컴퍼넌트 아래에 자손으로 추가된 것을 확인할 수 있다.
이런식으로 여러 컴퍼넌트들을 추가해주면 된다.
그렇다면 어떤 컴퍼넌트를 루트 컴퍼넌트로 놓아야 할까?
그건 사실 오디오 컴퍼넌트 하나만 놓을경우엔 이 오디오 컴퍼넌트를 루트 컴퍼넌트로 설정해주면 된다.
근데 문제는 여러개의 컴퍼넌트를 붙여야 할 상황이 더 많다는 것이다.
그래서 이럴 때에는 전용 루트 컴퍼넌트를 설정해주는 것이 좋다.
그리고 그게 바로 Scene Component 이다.

오디오 컴퍼넌트를 지우고 scene component 를 추가해준다.

scene component의 경우 시각적인 출력은 없지만
좌표 (transform)의 기능을 가지고 있다.
그래서 이 컴퍼넌트가 루트 컴퍼넌트로 최적인 것이다.
그리고 사실 맨 처음에 자동으로 생성되었던 DefaultSceneRoot 컴퍼넌트도
scene 컴퍼넌트이다.

이번에는 root component를 시각적으로 출력해보겠다.
이를 위해선 다시 컴퍼넌트 - 추가 - 스태틱메쉬 컴퍼넌트
를 추가해야 한다.
스태틱 매쉬란 '고정된 모델' 이라는 뜻이다.
우리가 게임에서 건물, 배경 등 고정된 모든 메쉬들을 설정할 때 이 스태틱 메쉬 컴퍼넌트를 사용해준다.
캐릭터같이 움직이는 메쉬들은 스켈레탈 메쉬 컴퍼넌트를 사용해준다.
스태틱 메쉬는 가장 중요한 두가지 요소를 가지고 있다.
원래 하나의 컴퍼넌트들은 하나의 기능을 갖고 있다하지만
그 아래에 더 많은 구성요소들을 갖고있따.

먼저 스태틱 메쉬 컴퍼넌트를 살펴보면 얘는 참 많은 기능을 가지고 있다.
그중 스태틱 메시 라는 컴퍼넌트는 스태틱 매쉬 에셋을 할당해주는 속성이다.
얘를 눌러보면 전에 art resource 에서 다운 받았던 많은 스태틱 매쉬 속성들이 있따.

그 중에서 아무거나 누르면 밑에 머티리얼 이라는 속성이 새로 생긴다.
스태틱 메쉬는 말그대로 외형, 모양을 결정하는 것이다.
머티리얼이란 표면의 질감, 색상같은 텍스처를 말한다.
머티리얼 또한 art resource 에서 다운 받은 아무거나로 설정해주고

다시 비쥬얼 스튜디오 item.h 로 돌아와 파란 부분을 다 삭제해준다.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Item.generated.h"
UCLASS()
class SPARTA_API AItem : public AActor
{
GENERATED_BODY()
public:
AItem();
protected:
USceneComponent* SceneRoot;
UStaticMeshComponent* StaticMeshComp;
};
header file을 이렇게 변경해준다.
#include "Item.h"
AItem::AItem()
{
SceneRoot = CreateDefaultSubobject<USceneComponent>(TEXT("SceneRoot")); // 컴퍼넌트를 생성해주는 함수 <컴퍼넌트 종류> (이름)
SetRootComponent(SceneRoot); //루트 컴퍼넌트로 만들어주는 함수 (이름)
StaticMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh")); //StaticMesh 포인터 만들어 놓은 것에 연결, root component의 자손임
StaticMeshComp->SetupAttachment(SceneRoot); //위에 애를 root component에 포함
}
c++ 코드도 이렇게 변경해줌.


코드를 다 업데이트 하고 언리얼 에디터를 끄고 빌드를 다시 한 후
다시 item 을 화면에 띄우면 이번엔 원하는대로 item 이 배치되는 것을 확인해 볼 수 있다.
그리고 우측에 item의 detail을 살펴보면 root componenet가 잘 붙여져 있는 것을 확인해 볼 수 있다.
근데 아래에 static mesh 추가한건 안보임
얘가 눈에 보이려면 reflation system을 추가해야 함.
ㅣ;/
회고
오늘까지 강의 다 듣기로 했는데 졸려서 제대로 못들음
'언리얼 엔진 부트캠프 > TIL' 카테고리의 다른 글
| [DAY 28] 1-6 (0) | 2025.01.24 |
|---|---|
| [DAY 27] 1-5 (1) | 2025.01.23 |
| [DAY 25] Resource Migrate (0) | 2025.01.21 |
| [DAY 24] Unreal Engine Build (0) | 2025.01.20 |
| [DAY 23] 첫번째 팀 프로젝트 끝, '어떻게든 되겠죠' (0) | 2025.01.17 |