Python으로 UE 에디터에서 Mesh Collision 대량 편집하기

Ryan Ham·2024년 7월 31일
2

Unreal Engine

목록 보기
16/27

개인 프로젝트를 하다가 Mesh의 Collision을 대량 편집해야 하는 상황이 봉착했다. 보통은 원하는 에셋에서 기본 Map을 마련해주지만 이번에 내가 사용하는 Mission to Minerva는 해당 관련 에셋만 제공해주어서 직접 Map을 만들고 있다. 하지만, 에셋 제작자가 최적화를 위해서인지 Mesh의 Collision 세팅을 아주 단순한 polygon으로 세팅을 해 놓았다.

Mesh의 Collision

Mission to Minerva에 존재하는 수많은 prop중 하나. Prop은 더 작은 prop을붙이는 형태로 구성되어 있으며, 각각의 prop들은 blueprint로 되어 있었다.

하나의 prop이 참고하는 mesh 설정으로 이동해보자. Detail panel 창에는 Collision setting을 밑의 빨간색 화살표가 보이는 것처럼 Use Complex Collision as Simple로 설정을 해 두어야 하는 것이 목표이다.


UE 에디터에서 Python Script 돌리기

Python 코드 돌리는 부분

UE 에디터에서 Python Script는 출력 로그에서 python으로 설정하고 돌리면 된다.

import unreal

def simplify_collision_for_selected_mesh():
    # Content Browser 단순 에셋선택만으로 스크립트에서 이해할 수 있다!
    selected_assets = unreal.EditorUtilityLibrary.get_selected_assets()
    
    if not selected_assets:
        unreal.log_error("No asset selected.")
        return

    for asset in selected_assets:
        if isinstance(asset, unreal.StaticMesh):
            static_mesh = asset
            simplify_collision(static_mesh)
        else:
            unreal.log_warning(f"Selected asset {asset.get_name()} is not a StaticMesh.")

def simplify_collision(static_mesh):
    # BodySetup
    body_setup = static_mesh.get_editor_property('body_setup')

    if body_setup:
        # Set complex as simple로 Collision 설정
        body_setup.set_editor_property('collision_trace_flag', unreal.CollisionTraceFlag.CTF_USE_COMPLEX_AS_SIMPLE)
        unreal.log(f"Simplified collision for {static_mesh.get_name()}")
    else:
        unreal.log_error(f"Failed to get BodySetup for {static_mesh.get_name()}")

# 스크립트 실행
simplify_collision_for_selected_mesh()

코드는 다음과 같다.

신기했던 점은 이렇게 Content Browser에서 에셋을 선택하는 것만으로도 unreal python script에서 이 에셋들을 인식한다는 사실이다. 정말 편리한 기능이다.


최종 화면

모든 Static Mesh의 Collision이 Use Complex as Simple로 설정되어서 위 화면과 같이 캐릭터가 Mesh가 없는 부분을 정확히 걸어다니는 것을 확인할 수 있다.

profile
🏦KAIST EE | 🏦SNU AI(빅데이터 핀테크 전문가 과정) | 📙CryptoHipsters 저자

0개의 댓글