게임학원, 게임프로그래머 취업 전문 교육기관 DirectX11/12 자체엔진 게임개발과정,서버프로그래밍,자료구조,알고리즘,유니티,언리얼 게임학원, 언리얼학원 언리얼엔진4 Component, StaticMesh 에셋 설정과 UPROPERTY매크로 활용
본문 바로가기

언리얼엔진4 Component, StaticMesh 에셋 설정과 UPROPERTY매크로 활용

안녕하세요. 어소트락 게임아카데미 입니다. 

어제 오늘 날씨가 많이 쌀쌀해졌네요. 모두 감기 조심하세요.^^

오늘 알아볼 내용은 지난 글에서 마켓플레이스에서 받아온 에셋을 Actor에 지정해서 화면에 출력을 하는 방법에 대해 알아보도록 하겠습니다.

지난글에서 InfinityBladeGrassLands 에셋을 다운로드 받고 프로젝트에 추가까지 해두셨다면 콘텐츠 브라우저에 해당 에셋 폴더가 담겨 있을 것입니다.

InfinityBladeGrassLands 폴더를 보시면 Effects폴더, Environments폴더, Maps폴더 3개의 폴더가 있을 것입니다.

오늘 사용할 폴더는 Environments 입니다. Environments 폴더를 열어보면 Materials, StaticMesh, Textures 3개의 폴더가 있고 StaticMesh폴더를 열어보면 Box, Objects 2개의 폴더가 있습니다. 이 2개의 폴더에 StaticMesh 에셋들이 저장되어 있는데 원하는 에셋을 아무거나 사용하셔도 됩니다. 저희는 Box폴더를 열어서 4개중 하나의 에셋을 이용하여 화면에 배치를 해보도록 하겠습니다.

위의 그림에서 빨간색 부분의 사각형 안을 보시면 어떤 폴더를 이용해서 현재 폴더까지 들어왔는지에 대한 경로가 나오게 됩니다.

파란 박스 부분은 현재 폴더에 있는 에셋정보들을 보여주는데 Mesh 정보들은 미리보기로 실제 메쉬의 형태를 보고 선택할 수 있게 되어 있습니다.

초록색 박스는 현재 폴더의 경로를 트리컨트롤의 형태로 보여주고 있습니다.

이중에서 저희는 가장 첫번째 에셋은 SM_Env_Breakables_Box1 에셋을 사용하도록 하겠습니다.

SM_Env_Breakables_Box1은 단순한 상자 메쉬입니다. 이 메쉬를 레벨에 가장 빨리 배치하는 방법은 바로 메쉬 자체를 드래그를 이용해서 레벨에 놓는 방법입니다. 이렇게 하면 언리얼엔진은 자동으로 Actor를 하나 생성하고 StaticMeshComponent라는 것을 생성하여 이 Component에 StaticMesh를 지정해주어서 화면에 출력을 해주는 방법으로 출력이 됩니다.


우리는 Actor를 직접 만들고 원하는 StaticMesh를 직접 설정하여 사용할 것이기 때문에 위의 방법으로는 하지 않고 C++클래스를 직접 만들어서 활용을 해보도록 할 것입니다.


지난 글에서 MyActor라는 C++ 클래스를 만들어둔 것을 기억하고 있을 것입니다.

Mesh 하나하나마다 클래스를 다 만들어서 사용하게 되면 낭비입니다. 왜냐하면 맵을 구성하는 많은 오브젝트들을 하나하나 클래스로 다 만들기 보다는 맵을 꾸며주는 오브젝트들은 단순 미관용 오브젝트들도 많이 있으므로 다 만들어 주기 보단 통합해서 하나의 클래스를 이용하여 단순히 Mesh만 교체해 가면서 사용하는것이 더 효율적일 것입니다.


그렇기 때문에 저희는 이 오브젝트들을 통합할 클래스를 하나 만들어서 사용을 하도록 할것입니다.

클래스 이름을 MapObject로 하여 새로운 클래스를 하나 만들어보도록 하겠습니다.


컨텐츠브라우저에서  C++클래스, 프로젝트명 폴더를 누른 후에 우클릭을 하고 C++클래스 생성을 이용하여 생성해보겠습니다.

상속은 Actor를 상속받아 사용할 것입니다.


정상적으로 만들어졌다면 Visual Studio가 열리고 MapObject 클래스가 보일 것입니다.

Actor에서 StaticMesh를 이용하여 화면에 Mesh를 출력하기 위해서는 StaticMeshComponent라는 것이 필요합니다. 


언리얼엔진에서는 Actor의 기능추가를 위해 다양한 Component를 제공해주고 있습니다.

이러한 Component는 크게 2가지로 나뉘게 됩니다.

1. SceneComponent

2. ActorComponent

위의 2가지 종류로 나뉘게 되는데 SceneComponent는 StaticMesh와 같이 Transform정보를 가지고 있는 Component를 말합니다.

ActorComponent는 Transform정보가 없는 기능 구현을 위한 Component들을 말합니다.

StaticMesh를 출력하기 위해서는 SceneComponent에 해당하는 StaticMeshComponent가 필요하고 이를 Actor에 추가해주어야 합니다.

Actor는 RootComponent라는 것을 가지고 있습니다. Component들은 계층구조로 Actor에 추가를 해줄 수가 있고 RootComponent를 하나 잡아준 후에 다른 Component의 Child개념으로 Component를 추가시켜줄 수 있는 구조입니다.


저희는 StaticMesh를 출력하기 위해 StaticMeshComponent를 하나 생성한 후에 해당 Component에 출력할 StaticMesh를 지정하고 레벨에 Actor를 배치하여 출력을 해보도록 하겠습니다.

먼저 위의 코드처럼 생성한 MapObject의 클래스 헤더파일에 UStaticMeshComponent의 포인터 타입으로 변수를 생성합니다.

UStaticMeshComponent를 사용하기 위해서 #include "CoreMinimal.h" 로 되어 있는 부분을 #include "EngineMinimal.h"로 변경하도록 합니다.

UPROPERTY 매크로는 다양한 기능을 제공해주는 기능으로 VisibleAnywhere를 지정해주게 되면 모든 프로퍼티 창에 보이지만 편집할 수 없음을 나타냅니다. 그 외에 EditAnywhere등 많은 기능이 있고 자세한 내용은 언리얼엔진4 문서를 참고하여 작성하시면 됩니다.

아래 링크는 UPROPERTY에 사용할 수 있는 프로퍼티 지정자 목록입니다.

http://api.unrealengine.com/KOR/Programming/UnrealArchitecture/Reference/Properties/Specifiers/index.html

이렇게 코드를 작성한 후에 cpp에 아래와 같은 코드를 작성합니다.

위의 그림에 있는 코드는 우리가 만든 MapObject 클래스의 생성자 부분입니다.

이 생성자 부분에서 헤더파일에 선언한 m_pMeshCom을 CreateDefaultSubobject라는 함수를 이용하여 생성해주고 있는것을 볼 수 있습니다.

언리얼엔진에서는 유니코드 문자열을 활용하기 때문에 문자열을 사용할때 TEXT 매크로를 이용하여 유니코드 문자열을 사용할 수도 있고 L"" 의 형태로 큰따옴표 앞에 대문자 L을 붙여주어서 유니코드 문자열로 사용할 수도 있습니다.


생성한 StaticMeshComponent를 RootComponent에 대입해줍니다.

RootComponent는 Actor클래스에 선언되어 있는 변수로 USceneComponent의 포인터타입 변수로 RootComponent를 지정하고 SceneComponent들을 Child 구조로 추가해줄 수 있는 구조입니다.


이렇게 한 후에 Ctrl + Shift + b를 이용하여 코드를 컴파일하고 빌드를 하거나 언리얼엔진 에디터로 돌아가서 컴파일 버튼을 이용하여 컴파일을 해주시면 작성한 코드가 에디터에 연동이 됩니다.


이렇게 만들어준 C++ 클래스를 레벨에 배치를 합니다. C++ 클래스를 레벨로 드래그 하게 되면 배치가 되는데 아무것도 출력이 안될 것입니다.

이는 StaticMeshComponent를 가지고 있지만 아직 StaticMesh가 지정된것은 아니기 때문에 출력할 Mesh가 없기 때문입니다. 아래와 같은 화면을 볼 수 있습니다.

액터를 배치하면 위와 같은 화면을 볼 수 있습니다.

빨간 박스 안은 Actor의 이름과 m_pMeshCom을 볼 수 있는데 m_pMeshCom은 우리가 만든 StaticMeshComponent입니다.

RootComponent로 지정을 해주었기 때문에 가장 위에 나오고 이후 추가되는 SceneComponent종류들은 모두 RootComponent의 아래에 추가될 것입니다.

파란 박스 부분의 트랜스폼은 레벨에서의 위치, 크기, 회전 정보를 담고 있습니다. 스태틱은 움직이지 않는 오브젝트에 주로 사용하고 무버블은 이동 가능한 오브젝트들에 사용을 하게 됩니다.

StaticMesh 탭이 보이고 있습니다. 그 부분에 사용하고자 하는 Mesh를 지정해주면 되는데 아래 그림처럼 없음으로 되어 있는 곳의 화살표 부분을 눌러서 메쉬를 직접 검색하거나 찾아서 선택을 하여 추가할 수도 있습니다.

아니면 콘텐츠 브라우저에서 원하는 메쉬를 찾습니다.

그런 후에 아래 그림처럼 <= 모양을 눌러서 콘텐츠브라우저에서 선택한 메쉬를 추가하는 방법입니다.

모두 완료하면 해당 메쉬가 화면에 출력된 모습을 보실 수 있고 메쉬 출력이 마무리 됩니다.

다음 글에서는 StaticMesh 에셋을 코드로 불러와서 출력하는 작업을 작성해보도록 하겠습니다.

이상으로 StaticMeshComponent를 추가하여 Actor를 레벨에 배치하고 화면에 원하는 메쉬를 출력하는 글을 마치도록 하겠습니다.


감사합니다.


문의전화

02. 598. 9457


카카오톡 오픈채팅 무료상담

https://open.kakao.com/o/sVEspGE


유튜브 무료강의

http://bit.ly/2zNkCEm