예전에 다니던 회사에서 외부로 노출된 엑셀 파일에 파이썬 스크립트를 붙여서 "에디터를 실행하지 않고 Data Table을 업데이트" 하는 방법을 구현한것을 사용한적이 있었다.
회사 나오고 개인 작업 하다가 문득 "그거 어떻게 만들더라?" 하고 찾아봤는데, 생각보다 좀 난해한것이 많아서... 한 2~3시간정도 머리 싸매서 겨우 성공한걸 정리해서 올려보고자 한다.
선행 작업
우선, 언리얼에서 파이썬 스크립트 플러그인을 추가해야 한다.
플러그인 -> python으로 검색하면 해당 플러그인이 나오는데, 체크를 눌러서 추가해주자.
그리고 프로젝트 세팅 -> 플러그인 -> Python에서 일부 설정 체크
개발자 모드를 켜주면 된다.
추가 패스 (Additional Path)에는 Python 파일을 집어넣을 경로를 넣어주면 되는데, [...] 버튼을 눌러서 경로를 지정해주면 알아서 상대경로로 지정해주니까 걱정안해도 된다.
정상적으로 세팅되면, Intermediate\PythonStub 에 unreal.py 파일이 생길것이다.
메인 작업
기본적으로 파이썬이 설치되어있다는 전제하에 시작한다.
파이썬 세팅이 끝났다면, 출력로그에서 파이썬 cmd를 열 수 있게 된다.
정상적으로 세팅 되었다면, 이제 파이썬에서 코드 작업을 하자.
우리 목표는
1. xlxs 파일에서
2. 매치되어있는 unreal DataTable로 파일을 import 할 수 있는 python 스크립트를 만들고
3. 이를 xlxs 파일에서 실행 할 수 있도록 하는것이다.
우선, 선행 작업으로 "csv 파일을 DataTable로 자동으로 import 해주는 로직"을 작성하기로 하자.
import unreal
import os
import sys
import csv
project_dir = unreal.SystemLibrary.get_project_directory()
file_name = r"Content/GameDataTable/CLGameplayTags.csv"
dpath = r"/Game/GameBase/DataSet"
class TagStruct(unreal.StructBase):
def __init__ (self):
self.tag = ""
self.DevComment = ""
def reimport():
task = unreal.AssetImportTask()
task.filename = project_dir + file_name
task.destination_path = dpath
task.destination_name = "DT_CLGameplayTags"
task.replace_existing = True
task.automated = True
task.save = False
struct_name = "GameplayTags.GameplayTagTableRow" #기 구현된 Struct 사용
row_struct = unreal.DataTableFactory()
row_struct.struct = unreal.load_object(None, struct_name)
if not row_struct.struct:
raise ValueError(f"Failed to find row struct: {struct_name}")
csv_factory = unreal.CSVImportFactory()
if row_struct.struct :
csv_factory.automated_import_settings.import_row_struct = row_struct.struct
task.factory = csv_factory
asset_tools = unreal.AssetToolsHelpers.get_asset_tools()
asset_tools.import_asset_tasks([task])
reimport()
오랫만에 작성해서 좀 엉망진창인데, 천천히 정리를 해보도록 하자.
우선, 예시에는 조건이 3가지가 있다.
1. CLGameplayTags.csv라는 데이터테이블 원본 파일이 있다.
2. 해당 파일과 연동되어있는 DT_CLGameplayTags 라는 파일이 있다.
3. 해당 DataTable은 GameplayTagTableRow 라는 "GameplayAbilitySystem 에서 제공하는 기본 Tag Struct" 를 이용한다.
의외로 3번이 제일 문제였는데, 사용하는 언리얼 버전이 5.3이라서 그런가, 5.4 이후에 추가되어있는 각종 python 함수들을 대부분 못쓴다는게 문제였다...
정리를 하자.
1. Task를 만들어야 한다.
unreal.AssetImportTask() 에는 다양한 변수들이 있는데, 다음과 같은 의미를 가지고 있다.
변수 명 | 기능 | 사용예시 및 기타 | |
async_ | 비동기화가 가능한 경우 활성화. | (boolean Type) | |
automated | 기능 수행시 대화상자 여부 | (boolean Type) | |
destination_name | 파일 쓰기 시 사용할 이름 | ||
destination_path | 파일 쓰기 시 경로 | ||
factory | 파일 가져오기 시 사용할 factory | task.factory = unreal.CSVImportFactory() CSV 팩토리, 텍스쳐 팩토리 등 다양한 팩토리 존재 |
|
filename | 가져올 파일 이름 (및 경로) | ||
imported_object_paths | 임포트 된 자산들의 경로들을 저장한 변수. | for path in task.imported_object_paths: print(f"Imported object path: {path}") |
|
options | 가져오기 옵션 | ||
replace_existing | 기존 파일을 덮어쓸지 여부 | ||
replace_existing_settings | 기존 파일을 덮어쓸지 설정 변경 여부 | ||
save | 가져온 후 저장할지 여부 | (boolean Type) |
여기서, 파일 입출력시 필요한 설정은 다음과 같다.
task = unreal.AssetImportTask() #Task 생성
task.filename = project_dir + file_name #파일 경로 지정
task.destination_path = dpath #저장할 파일 경로 지정
task.destination_name = "DT_CLGameplayTags" #저장할 파일 명칭 지정 (선택)
task.replace_existing = True #이름 변경
task.automated = True #대화상자 제거 (선택)
해당 방식을 통해 AssetImportTask를 설정해주면 된다.
2. 사용할 Struct 정보를 불러와야 한다.
해당 부분에서 가장 애를 먹었는데, 의외로 해답은 간단한 곳에 있었다.
여기에 있는 Row Structure가 바로 struct_name이 된다. 이걸 입력하면 된다.
struct_name = "GameplayTags.GameplayTagTableRow" #기 구현된 Struct 사용
row_struct = unreal.DataTableFactory()
row_struct.struct = unreal.load_object(None, struct_name)
그 외의 임의로 만들어진 BP Struct를 사용하고 싶다면,
struct_name = "/Game/GameBase/DataSet/TagDataTableRow"
와 같은 식으로 사용하면 된다.
3. CSV를 읽고 쓰기
csv_factory = unreal.CSVImportFactory()
if row_struct.struct :
csv_factory.automated_import_settings.import_row_struct = row_struct.struct
task.factory = csv_factory
asset_tools = unreal.AssetToolsHelpers.get_asset_tools()
asset_tools.import_asset_tasks([task])
우선 csv factory를 생성한다.
그리고, 위에서 만든 row_struct 정보를 csv factory에 정보로 넘기고, import하면 된다.
정상적으로 읽어들이기에 성공하면, 다음과 같이 메시지가 뜰 것이다.
이후, 정상적으로 수정되었는지 확인하면 끝.
이렇게 csv를 dataTable로 읽어들이는 python script를 작성해보았고, 이제 엑셀파일에서 해당 파일을 매크로로 호출하여 엑셀파일에서 바로 수행할 수 있도록 해보겠다.
참고 자료 :
https://forums.unrealengine.com/t/reimport-datatable-csv-with-python/567768/3
Reimport DataTable(csv) with python
I’m doing something similar, but with JSON instead of CSV, but it works pretty much the same. Just make sure to first load the assets from the content browser, then you’ll be able to write it. Here is the code I’m using to update a DataTable from a J
forums.unrealengine.com
https://wildgoosechase.tistory.com/103
[언리얼5] Data Table 로더 만들기 *3부* (CSV) with Python / 에셋 생성하기
Data Table Asset 1. 전체 코드 2부에서 했던 것처럼 asset_generator.py 파일을 생성하고 아래 코드를 작성한다. import unreal import os import csv import sys # 프로젝트 명 project_name = "RottenPotato" # 데이터 테이블 클
wildgoosechase.tistory.com