728x90
이 글은 Inflearn - Rookiss : 언리얼 엔진4 입문 강의를 듣고 정리한 글입니다.

 

목차.

  1. C++ 클래스 생성과 구조
  2. 클래스에서 StaticMeshComponent 추가하기
  3. 클래스에서 Static Mesh Load 하기
  4. 지역변수 외부 노출과 수정

 

 

C++ 클래스 생성과 구조.

콘텐츠 브라우저에서 마우스 우클릭 -> 새로운 C++ 클래스 생성을 클릭

 

 

생성하면 아래 사진과 같이 부모 클래스 선택창이 뜹니다.

 

 

Actor
  • 영화 세트장에있는 배우, 사물 등과 같음 
  • 언리얼에서는 Actor, 유니티의 경우 Game Object
  • Object의 상속을 받고 있다.
Pawn
  • 입력을 통해 물체를 조종할 수 있다.
  • Actor의 상속을 받고 있다. 
Character
  • 입력을 통해 캐릭터를 조종할 수 있다.
  • Pawn과 다른점으로 애니메이션 등의 기능 
  • Pawn의 상속을 받고 있다.

* 생성한 Actor를 삭제하려면?

생성한 Actor는 Delete키를 눌러도 삭제가 되지 않고, 우클릭해 보면 삭제가 비활성화되어있는 것을 볼 수 있다.

 

해당 Actor를 삭제하기위해서는 

  1. 언리얼 엔진을 끈다.
  2. 해당 Actor가 있는 위치를 위치를 열어 직접 파일을 삭제한다 (cpp, h)
  3. 깔끔하게 삭제를 하고 싶다면 Binaries, Intermediate, Saved, DerivedDataCache폴더를 삭제해 준다
  4. 프로젝트이름. uproject 파일을 우클릭 -> Generate VisualStudio Project Files 클릭

유니티에서는 Delete 키를 누르면 바로 삭제가 가능했지만 언리얼에서는 위와 같이 과정이 매우 복잡하기 때문에 상당히 번거로운 것 같다.


 

다시 이어서 cpp파일과 헤더파일이 생성된 것을 볼 수 있다.

 

 

BeginPlay 
  • 처음 한 번만 호출
  • 유니티에서 Start와 같은 역할
Tick
  • 매 프레임마다 호출
  • 유니티에서 Update와 같은 역할

 

*이름을 MyActor로 c++ 클래스 생성하였는데 앞에 A가 붙는 이유는 언리얼 엔진의 네이밍 컨벤션 때문이다.

보통 엑터의 경우 앞에 A를 붙여준다.

 

 

클래스에서 StaticMeshComponent 추가하기.

 

Header 파일에 다음과 같이 선언

 

UPROPERTY() //리플렉션
UStaticMeshComponent *Mesh //일반적으로 언리얼에서는 대문자로 맴버변수 만듦

 

* 만약 UStaticMeshComponent 에러가 난다면 

#include "Components/StaticMeshComponent.h"를 추가

 

Header 파일에 보면 UCLASS 라는 생소한 코드가 있다.

C++은 C#과 달리 리플렉션이 없는데 이를 언리얼 엔진에서 자체적으로 만들어준 것이다.

UPROPERTY()
  • UCLASS와 같은 리플렉션
  • 다양한 정보를 담을 수 있다.
  • 언리얼에서 자동으로 관리하는 메모리라는 정보를 가지고 있다. 

 

*리플렉션 : 컴파일러가 읽을 수 있는 주석, 런타임에 클래스를 살펴보고 기입한 정보를 추출해서 사용이 가능

언리얼에서 빌드할 때 코드를 스캔하고 UCLASS와 같은 코드를 파싱하고 메타데이터와 같은 부가적인 정보를 같이 기입을 해준다.

 

cpp 파일에 다음과 같이 선언

 

Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MESH"));//언리얼에서 자동으로 메모리 관리

 

Mesh의 메모리 관리
  • CreateDefaultSubobject로 인해 언리얼에서 메모리 관리를 해준다. 
  • 일종의 스마트 포인터

 

매개변수로 TEXT("")를 사용하는 이유는?
  • 멀티 플랫폼 개발을 할 때 어떤 환경에서는 에러가 뜰 수 있기 때문에 TEXT를 활용하는 것을 습관화하는 것을 추천한다.

 

 

작성한 코드를 Ctrl+S를 눌러 저장한 뒤 언리얼로 돌아와 컴파일을 누릅니다.

 

그리고 작성한 Actor를 레벨에 배치한 뒤 눌러보면 오른쪽에 보이는 것처럼 Mesh 컴포넌트가 수정불가능한 상태일 것입니다.

 

UPROPERTY(VisibleAnywhere);

 

아까 작성한 프로퍼티에 매개변수로 VisibleAnywhere를 입력한 뒤 컴파일을 하면 이제 수정이 가능한 상태가 되는데

VisibleAnywhere를 입력하면 포인터가 가리키는 모든 멤버변수를 수정할 수 있습니다.

 

Mesh가 활성화된 모습

 

클래스에서 Static Mesh Load 하기.

언리얼 창에서 Staic Mesh를 수정할 수 있지만 다수의 Actor가 있다고 했을 때 하나 수정하더라도 다른 Actor의 Static Mesh에는 영향이 없습니다.

 

그래서 Class에서 원하는 Mesh를 불러오고 적용을 해보겠습니다.

 

RootComponent = Mesh; //컴포넌트를 추가하면 그중 하나를 RootComponent로 설정해줘야한다.
    
static	ConstructorHelpers::FObjectFinder<UStaticMesh> SM(TEXT("StaticMesh'/Game/StarterContent/Props/SM_Couch.SM_Couch'"));

if (SM.Succeeded()) //매쉬 Load에 성공한다면
{
	Mesh->SetStaticMesh(SM.Object);
}

위 코드를 cpp 생성자에 추가합니다. 매쉬는 각자 자유롭게 변경하시면 됩니다.

 

찾으려는 Mesh의 경로를 쉽게 입력하는 방법으로 

 

 

원하는 Mesh를 클릭하고 Ctrl + C를 누른 뒤

 

Class로 돌아가 Ctrl+ V를 하면 선택했던 매쉬의 경로가 바로 불러집니다.

 

이제 언리얼로 돌아와 컴파일을 하면 Mesh가 정상적으로 바뀌는 모습을 볼 수 있습니다.

 

 

지역변수 외부노출

UPROPERTY(VisibleAnywhere);
int32 HP;

UPROPERTY(VisibleAnywhere);
int32 MP;

 

헤더파일에 HP와 MP라는 매개변수를 선언해 주었습니다.

 

만약 UPROPERTY(VisibleAnywhere)를 사용하지 않으면 외부에 노출되지 않아 보이지 않을 것입니다.

 

언리얼로 돌아와서 컴파일을 해보면 

 

다음 사진과 같이 HP와 MP는 수정이 불가능하고 

이름도 My Actor로 클래스 이름과 같이 나타나는 것을 볼 수 있습니다.

 

Mesh와 같은 포인터는 VisibleAnywhere로 수정이 가능했지만

int의 경우는 수정이 불가능합니다.

 

UPROPERTY(EditAnywhere, Category = BattleStat);
int32 HP;

UPROPERTY(EditAnywhere, Category = BattleStat);
int32 MP;

 

VisibleAnywhere 대신 EditAnywhere를 입력하면 이제 HP, MP 모두 활성화가 되고 수정이 가능해집니다.

 

그리고 해당 항목의 이름은 Category = 이름을 통해 수정이 가능합니다.

 

 

 

728x90

+ Recent posts