본문 바로가기
Engine/Unreal

[UE5] 우당탕탕 데이터 테이블 파싱 플러그인 개발 - 1. 플러그인 생성 + 스프레드 시트 CSV로 파싱

by devOat 2025. 4. 11.

 

겜 개발하다가 데이터 테이블은 필요한데 구조체 노가다를 하기 싫어서

그냥 파싱 툴을 만들기로 생각했다 (?)

 

사실 그게 더 노가다일수도 있는데

기왕 만드는 거 잘 만들어서 앞으로도 개발할 때도 유용하게 써야지~~~ 하고 개발 시작 !!

 

기왕 하는 거 마무리 지어지면 좋겠다는 생각에

플러그인화 시켜서 마켓플레이스에 올리는 것을 목표로 삼았다.

 

1000원에 팔테니 티끌모아 나의 넷플릭스 구독료가 되어줘

 


 

내가 필요로 하는 기능은 아래와 같다. 

오늘은 1~2번에 해당하는 부분을 개발한 것을 정리해보겠지비

 

1. 해당 기능을 사용할 수 있는 커스텀 UI 제작

2. 스프레드 시트 링크를 넣었을 때 알아서 테이블을 읽어와서 csv로 파싱하기
3. csv를 기반으로 USTRUCT 자동 생성
4. 생성된 USTRUCT로 UDataTable 타입의 .uasset 자동 생성

 

 

테이블 로드하는 쪽은 파이썬을 많이 사용하기도 하던데, 나는 C++밖에 쓸 줄 몰라서 C++로 개발 

 

 

 

1. 언리얼 확장하기 - 커스텀 UI 제작

생성

Edit -> Plugins에서 플러그인을 추가한다

 

 

 

현재 설치된 플러그인 목록들을 볼 수 있는데, +Add 버튼 누르면 됩니다.

 

 

여러가지 옵션이 있는데, 나는 에디터 확장을 목적으로 두고 있어서, 기본적으로 UI창까지 띄워주는 Editor Stanalone Window 옵션을 선택했다.

 

 

그렇게 플러그인을 추가하고, 프로젝트 창 다시 확인해보면 지정한 이름대로 Plugins 폴더에 내가 만든 플러그인이 추가 되었을 것이다.

 

 

생성된 파일들에 대해서 알아보자면!

 

{모듈명}.h

- 사용자 생성 클래스를 정의한 것으로,

- 모듈 인터페이스(IModuleInterface) 를 구현 해야 하고,

- 메뉴 등록, 탭 생성, 커맨드 바인딩 등 핵심 로직을 여기다가 구현하면 된다.

 

{모듈명}Commands.cpp

- UI 명령 바인딩 클래스 정의 (버튼 클릭, 단축키 입력 등)

- FUICommandList와 연결 커맨드 초기화(RegisterCommands()) 가 진행되는 부분이다.

 

{모듈명}Sytle.cpp

- 플러그인 UI의 스타일 / Slate 스타일 셋 정의 / 플러그인 아이콘 지정 등 플러그인 UI의 디자인 관련해서 조작하는 곳이다.

 

 

 

 

그렇게 해서 추가한 플러그인을 엔진 내에서 확인해보고자 빌드를 누르면!

 

 error LNK2011: 미리 컴파일된 개체가 링크되지 않았습니다. 이미지가 실행되지 않을 수 있습니다.

와 같은 에러가 뜰 것이다.

 

이유는 .uproject의 Plugins에 우리가 새로 만든 모듈을 추가해 주지 않았기 때문

.uproject파일

 

메모장 켜서 위와 같이 플러그인 정보를 추가하면 된다

 

 

 

근데 저처럼 바로 위 플러그인 중괄호 뒤에 콤마 빼먹지마세요

제너레이트 안되서 순간 당황함;;

 

 

 

 

아니면 build.cs 에 직접 모듈 의존성을 추가해도 되는데, 그냥 uproject에 추가합시다 허헛 

 

 

빌드완료!

 

 

 

빌드에 성공하고 언렬을 다시 키면, 이대로 하면 이렇게 Window창 안에 숨어있는데,

나는 이걸 플러그인으로 제공할 생각이기 때문에 기본의 언리얼 메뉴바를 확장하기로 했다.

 

 

 

참고로 에디터 커스터마이징은 코드는 라이브 코딩으로는 잘 적용이 안되고,

엔진 껐다가 키고 vs에서 빌드하셔야 제대로 동작될 것입니다!

 

엔진 킨 상태에서는 변경 사항이 바로바로 적용 안되더라구여

 

 

 

근데 ㅋㅋㅋㅋ 저거 방법이 상단 메뉴바 중 Help 를 찾아서 그 뒤에 새 메뉴를 추가해 ! 와 같은 방식이라서

생각보다 최첨단 수동이네,,, 싶었다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

현재까지 있는 모든 메뉴바 목록을 긁어와서 가장 뒤에 추가해 같은 건 없었음 (있으면 알려주세오 ㅠ)

 

 

 

DTGenerator 이름 맘에 안드니까 변경

여기다가 개발에 필요한 모듈 야무지게 하나씩 개발해서 Custom밑으로 쫘라락 추가하면 뿌듯하겠다

 

지형 생성 알고리즘도 관심이 좀 생겨서 개발해볼라했는데 걔도 플러그인으로 빼버려야지 

 

 

 

기본 상태는 버튼을 눌렀을 때 슬레이트 창이 자꾸 뜨는데, 그냥 버튼을 누를 시에 동작이 되는게 훨씬 편할 것 같아서

 

 

요런식으로 각각의 기능들이 서브메뉴들이 뜰 수 있게끔 드롭다운의 형식으로 바꿨다

헤헤 재미짐

 

 

 

2. 스프레드 시트 테이블을 CSV로 파싱하기

 

그런데 이게 또 하다보니까 결국 스프레드 시트 URL 기입할 부분이 필요해서 (바본가;;;)

결국 GenerateTable 만들었을 때 생성되는 슬레이트창 + 텍스트 박스 등 UI들을 추가로 만들었다

 

 

기본 Module에 코드 다 넣기에는 뭔가 깔끔하지 않아서,,, ComboundWidget 상속받아서 UI를 따로 만들었음 !

그리고 Http모듈을 이용해서 시트에 접근한 뒤, Name / Type 열을 제외 하고 CSV 데이터를 불러오는부분 까지 개발 끗~~

 

뭔가 예전에 imgui 잠깐 개발했을 때랑 비슷한 느낌 

 

이게 Test시트

 

FieldName / Type은 로그는 찍기가 너무 귀찮아서 그냥 데이터만 주루루룩 찍었다,,,

우선 원하는 기능까지는 만들었는데, 스프레드 시트에 보통 시트가 여러장을 쓰자나효 ?

 

 

근데 이 시트 목록을 전부 조회하려면

 

얘 가입해야한다;;; ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 그래야지 API 키 를 통해서 이름을 가져올 수 있음...

직접 만들기 전엔 몰랐지,,,, ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅠㅠㅠㅠ

 

아니면 시트 네이밍을 일일이 적어서 링크를 수동으로 바꿔줘야하는데,.,.
그랬다간 스프레드 시트 네이밍이랑 맞지 않는 경우에는 로드가 안될 거고,.,. 매우 불편할 것,,,

 

사실 나 혼자 쓸려고 만든거면 상관없는데 그래두 플러그인 올리면 한 명쯤은 쓸 수도 있으니까... ㅠㅅㅠ

이제 CSV 기반으로 UStruct 생성하고, DT까지 만들어주는 것만 제작하면 끗이다!

 

 

 

스프레드 시트 로드 대신 생각한 대안은 시트도 전부 xlsx 확장자로 내보내기가 가능하니까,
.xlsx 파일을 읽어오는 것으로 바꾸자 !! 였다 

 

근데 그럴라면 c++에서 .xlsx 파일 읽어올 때 사용하는 서드파티가 필요해서

아마 해당 서드파티를 제작하고 있는 플러그인에 추가해서 빌드에 포함시켜야 할 것 같다...

+ 해당 서드파티 소스 분석까지,.,.

 

 


 

 

이거 소스코드를 하나씩 첨부하면서 설명하긴 너무 길고 많아서 완성되면

새 프로젝트로 따로 빼서 예제와 함께 깃허브 링크를 드리겠읍니다... 

 

아니 사실 마켓플레이스 링크 걸어둘테니 다운 받아서 직접 보세요!!!!!!!!!!!!!!!!!!!!!!!!!!! ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ