프로그래밍/언리얼엔진

[언리얼엔진] 플러그인 제작 및 사용법 - 2. C++ 클래스 추가

LeePorter 2022. 1. 27. 19:39

저번 포스팅을 통해 언리얼 프로젝트에서 플러그인을 생성하였고, 이제 해당 플러그인, 정확히는 플러그인 안에 있는 모듈에 C++ 클래스를 추가하는 방법에 대해서 설명하겠습니다.

 

[이전 포스팅]

[언리얼엔진] 플러그인 제작 및 사용법 - 생성 및 준비단계


C++ 언리얼 프로젝트의 경우 콘텐츠 브라우저를 보면 'C++ 클래스' 폴더가 있습니다. 해당 폴더 안에 C++ 클래스를 생성합니다. 

 

C++ 클래스 생성. 좌측 상단의 '추가/임포트'를 통해서도 C++ 클래스 생성 가능.(C++ 클래스 폴더 혹은 하위 폴더 선택)

 

새로 만들 C++ 클래스의 부모 클래스는 'Actor'로 선택했습니다. 다음으로 이동하면 이름 입력 및 어느 모듈에 추가할지를 선택할 수 있습니다.

 

이름 옆에 플러그인 모듈을 선택하게 되면 해당 이름으로 Actor 클래스가 생성됩니다. 이때 옆에 '퍼블릭'은 플러그인 모듈 선택 시 자동으로 체크됩니다. 이 상태로 클래스 생성 버튼을 클릭합니다. 그러면 경고와 함께 로그 출력 여부를 물어보는 창이 나타납니다.

 

플러그인 모듈에 액터 클래스 추가

 

해당 내용을 보면 클래스는 생성하는데 성공했지만 모듈 자동 컴파일에 실패해서 콘텐츠 브라우저를 통해 확인할 수 없다는 내용입니다. 그에 관해 로그를 확인할지 묻는 메시지 창입니다. 굳이 로그를 확인할 필요는 없으니 '아니오'를 클릭하시면 됩니다. 그리고 언리얼 프로젝트를 종료합니다.

 

이제 컴파일에 실패했으니 다시 컴파일을 수행하기 위해 Visual Studio를 열어서 다시 프로젝트를 빌드해 줍니다. 빌드가 끝나면 다시 언리얼 프로젝트를 실행합니다. 그러면 콘텐츠 브라우저에 방금 추가한 C++ 클래스를 확인할 수 있습니다.

 

※ 만약 해당 메시지 창이 나타나지 않았고, 콘텐츠 브라우저에서 새로 만든 클래스를 확인할 수 없는 경우, 그냥 언리얼 프로젝트를 껐다가 다시 실행하시면 됩니다.

 

좌측 : 컴파일 전 콘텐츠 브라우저 / 우측 : 컴파일 후 콘텐츠 브라우저

 

 

플러그인의 C++ 클래스 폴더가 콘텐츠 브라우저를 통해 확인할 수 있고, 하위 폴더 중 'Public'에 방금 만든 클래스가 있는 것을 확인할 수 있습니다.

 

이제부터 해당 플러그인에 C++ 클래스를 추가할 때 아까와 같은 메시지 창은 나타나지 않습니다. 다시 Visual Studio 화면으로 이동하여 TestActor.cpp를 엽니다. (콘텐츠 브라우저에 있는 TestActor를 더블 클릭해도 됩니다.)

 

※ 언리얼 에디터는 종료합니다. 언리얼 에디터를 실행한 상태에서 C++ 코드 작업을 수행한 뒤 빌드하면 빌드는 되지만 에디터에 적용이 되지 않습니다. 플러그인 모듈은 프로젝트 모듈과 달리 별도의 파이프라인을 통해서 빌드되므로 에디터가 실시간으로 로드하지 않고, 에디터가 실행될 때 최신버전으로 플러그인 모듈을 불러옵니다.

 

TestActor.cpp의 BeginPlay() 함수 안에 아래 코드처럼 로그 출력 코드를 추가하고 프로젝트를 빌드합니다.

 

void ATestActor::BeginPlay()
{
	Super::BeginPlay();

	// 로그 출력
	UE_LOG(LogTemp, Log, TEXT("Plugin C++ Class Test"));

	// 화면 출력
	GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Red, TEXT("Plugin C++ Class Test"));
}
 

처음 UE_LOG() 매크로 함수는 언리얼 엔진의 로그 출력창에 로그를 출력하는 함수로, 해당 내용은 화면에 출력되지는 않습니다. 

 

GEngine->AddOnScreenDebugMessage() 함수는 보고 있는 Viewport 화면 좌측 상단에 메시지를 출력하는 함수로, 로그에는 출력되지 않습니다.

 

블루프린트에서 사용하는 'PrintString' 함수아래 ▼를 누르면 나타나는 고급 옵션들 중 'Print to ~' Bool 값들이 이에 해당하는 코드입니다.

 

빌드에 성공하였다면 다시 언리얼 프로젝트를 실행하고, 레벨에 TestActor를 드래그&드랍하여 배치합니다. 그리고 Play 버튼을 눌러 실행하면 아래의 사진처럼 로그가 출력된 것을 확인할 수 있습니다.

 

해당 플러그인 C++ 코드를 블루프린트로 해당 언리얼 프로젝트에서 하위 클래스로 만들어 사용할 수 있습니다. TestActor를 우클릭하면 나타나는 팝업 메뉴에서 '파생 클래스 생성'을 눌러서 콘텐츠 아래에 생성하면 해당 플러그인 모듈의 C++ 액터 클래스를 상속받는 블루프린트 클래스가 만들어집니다.

 

 
 

여기까지가 초간단하게 플러그인을 만들고 C++ 클래스를 추가하는 방법에 대한 설명이었습니다. 이런식으로 플러그인을 만들면 사실 문제가 많습니다 ^^;; 단지 만드는 방법에 대해서만 글을 적은 것이기 때문에 절대로 이런 식으로 플러그인을 만들면 안 됩니다.

 

플러그인은 이전 포스팅에서도 설명한 것처럼 모듈을 감싸고 있는 껍데기입니다. 즉, 핵심은 모듈입니다. 플러그인의 용도는 외부에서 해당 모듈을 언리얼 프로젝트에서 사용할 수 있게 해주는 인터페이스 역할을 해주는 것입니다. 

 

그렇기 때문에 위와 같은 방식으로 플러그인 생성 및 사용할 경우 가장 큰 문제가 제작시 '수정이 까다롭습니다.' 아마 위와 같이 Viewport에 찍히는 빨간색 로그 출력부분을 에디터가 실행 중인 상태에서 수정 및 빌드한 뒤 언리얼 프로젝트에서 테스트하면 적용이 안 된 것을 확인할 수 있습니다. (에디터 실행된 상태에서 FColor::Red를 Blue로 변경한 뒤 빌드하여 실행 테스트해보시길 바랍니다)

 

하지만 프로젝트를 아까처럼 껐다가 키면 적용이 된 것을 확인할 수 있습니다. 즉, 컴파일 단계에서 모듈의 변경 사항이 언리얼 엔진에 로드가 되지 않은 것입니다. 플러그인의 모듈과 내가 현재 작업하고 있는 언리얼 프로젝트 모듈이 따로따로 로드가 되기 때문입니다. 

 

프로젝트 모듈이 내 집이고, 플러그인 모듈이 잘 아는 친한 이웃집으로 생각하시면 됩니다. 내 집의 물건은 내 맘대로 위치를 바꾸고 바로 확인할 수 있지만, 이웃집의 물건 변화를 내가 알 수 있는 방법은 직접 방문하는 방법 밖에 없습니다. 즉, 실시간으로 확인하기가 어렵습니다.

 

이와 같은 문제를 해결하기 위해서는 사실, 플러그인용 모듈을 먼저 제작하고, 플러그인 껍데기는 마지막에 포장하는 용도로 생성합니다. 자세한 것은 아래 그림을 참고해주시길 바랍니다. 언리얼 프로젝트를 통해서 먼저 플러그인에 추가할 모듈을 우선 작업하고, 모든 작업이 끝난 상태에서 플러그인 Source 폴더에 넣고 플러그인에 연동시키는 코드 작업을 수행한 뒤 빌드하여 플러그인 패키지를 만들어 외부에서 사용합니다.

 

플러그인 제작 및 배포 로드맵

 

이번 포스팅과 이전 포스팅은 이런 모듈 제작과정을 건너띄고 위 이미지의 제작 로드맵의 Exporter 과정부터 수행한 것입니다. 다음 포스팅을 통해서 우선 모듈을 만드는 방법에 대해서 작성하고 마지막 포스팅에서 해당 모듈을 플러그인에 이식하고 패키징하여 외부 프로젝트에서 바로 사용하는 방법을 알려드리겠습니다.