본문 바로가기

GameDevelopmentDiary/UnrealDiary

Unreal Python

에디터에서 리소스를 만지작 거리는 와중에 귀차니즘이 스멀스멀 올라왔다.
본격적으로 파이썬을 다뤄본적 없었지만, 파이썬 플러그인을 사용하면 에디터용 함수를 만들 수 있다고 하여 찾아보았다.

 

Unreal Python 설정

 

1. 플러그인 설치

Scripting 항목에 보이는 세 개의 플러그인을 설치 후 재시작.

< Editor Scripting Utilities, Python Editor Script Plugin, Sequencer Scripting >

2. 플러그인 환경설정

  기본적으로 Contents/Python 폴더에 배치하는 경우는 적을 필요 없지만, 프로젝트 외부에 존재하는 파일의 경우 환경변수를 설정해준다.

  설정 창 위치: ProjectSetting - Plugin - Python

< Startup script - .py 파일경로, Add path - 파일 상위 폴더 경로 >

 

3. unreal.py 준비

  에디터 출력 로그 창의 입력 탭을 변경해주고(Cmd -> Python), 언리얼 명령 모듈을 불러온다. 

  그러면 unreal.py 파일을 볼 수 있다. 프로젝트\Intermediate\PythonStub 경로에 있다. 

< import unreal >
< 프로젝트\Intermediate\PythonStub\unreal.py >

 

4. Hello World(You, Unreal, Space... ETC)

  프로젝트 외부에 .py 파일을 만들고 잘 연동되었는지 확인해본다.

  아래는 인사 후, 준비되어 있는 리소스들을 프로젝트에 추가하는 코드다.

  좀 전에 만들어진 unreal.py 파일을 잘 불러왔는지 확인하자. 해당 파일이 없으면 인사만 보일테니..

 

4-1. .py 파일 준비

#main.py

import unreal

# 테스트에 사용할 이미지, 또는 오디오 등 기타 파일 경로
texture_jpg = 'C:/Users/HARIM/Pictures/selfiesample.JPG'
texture_tga = 'C:/Users/HARIM/Pictures/selfiesample2.TGA'

def importMyAssets():
    texture_task1 = buildImportTask(texture_jpg, '/Game/Textures')
    texture_task2 = buildImportTask(texture_tga, '/Game/Textures')
    executeImportTasks([texture_task1, texture_task2])


def buildImportTask(filename, destination_path):
    task = unreal.AssetImportTask()
    task.set_editor_property('automated', True)
    task.set_editor_property('destination_name', 'Test')
    task.set_editor_property('destination_path', destination_path)
    task.set_editor_property('filename', filename)
    task.set_editor_property('replace_existing', False)
    task.set_editor_property('save', False)
    return task


def executeImportTasks(tasks):
    unreal.AssetToolsHelpers.get_asset_tools().import_asset_tasks(tasks)


if __name__ == '__main__':
    print('Hello my love')

 

4-2. 준비된 main.py 파일이 준비되었다면 언리얼 에디터를 다시 시작한다.

< Startup scripting file 실행을 알리는 인사가 보인다. >

 4-3. importMyAssets 명령으로 준비된 이미지도 잘 불러오는지 확인해본다.

import main as m
m.importMyAssets()

< Textures 폴더(또는 위에서 지정한 경로)가 생겨야 성공이다. >

5. 파일 새로고침

  importMyAssets 명령이 끝났는지 로그도 추가해보겠다.

< imported Task(s) 출력이 추가되었다. >

  그런데 다시 importMyAssets 명령을 내려줘도 완료 메시지가 안 보일 것이다.

  .py 파일을 수정했으면 에디터를 닫았다가 다시 열어보자. 그리고 importMyAssets 명령을 내려주면,

< imported Task(s) 출력 확인 >

  자, 드디어 원하던 로그가 찍혔다.

 

  그런데, 스크립트를 수정하고 확인을 위해 매번 에디터를 다시 시작하다니, 이 또한 매우 귀찮지 아니한가?

  나만 그래?

  당연히 아니었다. 포럼에 같은 질문을 남긴 사람이 있었고, 친절한 답변이 바로 붙어있었다.

import main as m
from importlib import *
reload(m)
m.importMyAssets()

  리로드를 거치는 2 줄의 명령어만 적어주면 에디터는 재시작할 필요가 없었다.

 

  이제 파이썬으로 무슨짓을 하는지 다른 영상도 더 지켜보자.

 

 

  UE4 python tutorial

  https://www.youtube.com/watch?v=M9UlyVtD5Dk&list=PLBLmKCAjA25Br8cOVzUroqi_Nwipg-IdP&index=3 

 

  공식문서에 자동완성 기능을 위한 설명도 있는데, 개인적으로 반응 없었다.

  https://docs.unrealengine.com/4.27/ko/ProductionPipelines/ScriptingAndAutomation/Python/Autocomplete/

 

  파일 새로고침 참고

  https://forums.unrealengine.com/t/must-restart-the-editor-to-use-updated-python-code/125847/3

 

  추가 예제

  https://www.youtube.com/watch?v=YpHJ-P-4C5I&list=PLTfMG1EpxB2ewNOlE1vFNqIGqPzgkqVk6&index=2