環境: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を使って引数を読み込むようにしている。

