Unreal Python: アクターの一括選択

環境:Unreal Engine 4.22

選択したアクターから同じレベルにある同じメッシュのアクターを一括選択するスクリプト。今回はインターフェイスを使ってみます。

アセットライブラリ上で右クリックし、メニューからEditor Utility > Editor Widget を選ぶ。ボタンとテキストボックスを配置してUIを作成する。

ボタンを選択して、DetailsのEventの項目からPressedを押すとブループリントの画面に遷移する。

stringの変数を作り、Pythonのファイルのアドレスを入力しておく。

例:D:\UnrealPython\selectSameActorWithDistance.py

stringをつなげて「py D:\UnrealPython\selectSameActorWithDistance.py 1000」という形になるようにする。最後の数字は引数でPythonファイルに読み込ませる。

Pythonファイルのコードは以下。

import unreal
import sys
  
# 同じスタティックメッシュのアクターをフィルタリングする関数
def filterSameMesh(selectedActor, actors):
    staticMesh = selectedActor.get_component_by_class(unreal.StaticMeshComponent)
    staticMeshName = staticMesh.static_mesh.get_name()
    result = []

    for actor in actors:
        mesh = actor.get_component_by_class(unreal.StaticMeshComponent)
        if mesh != None:
            name = mesh.static_mesh.get_name()
        
            if name == staticMeshName:
                result.append(actor)
 
    return result

# 同じレベルにあるアクターをフィルタリングする関数
def filterSameLevel(selectedActor, actors):
    staticMesh = selectedActor.get_component_by_class(unreal.StaticMeshComponent)
    staticMeshPath = selectedActor.get_path_name().split(':')[0]
    result = []

    for actor in actors:
        mesh = actor.get_component_by_class(unreal.StaticMeshComponent)
        if mesh != None:
            path = actor.get_path_name().split(':')[0]
        
            if path == staticMeshPath:
                result.append(actor)
 
    return result

# 選択アクターのアセット名を取得する
selectedActors = unreal.EditorLevelLibrary.get_selected_level_actors()
if len(selectedActors) > 0:

    # 全体のアクターから一致するものを選ぶ
    sameActors = []
    allActors = unreal.EditorLevelLibrary.get_all_level_actors()

    actors = filterSameMesh(selectedActors[0], allActors)
    actors = filterSameLevel(selectedActors[0], actors)

    limit = float(sys.argv[1])
    print limit
    if(limit > 0):
        for actor in actors:
            dist = selectedActors[0].get_distance_to(actor)
            print dist
            if(dist < limit):
                sameActors.append(actor)
    else:
        sameActors = actors
     
    # 一致するアクターを選択する
    unreal.EditorLevelLibrary.set_selected_level_actors(sameActors)
else:
    print "No Actor Selected!"

argvを使って引数を読み込むようにしている。

コメントを残す