#UE4 | @UNREALENGINE
コード 1/2
import unreal
import numpy as np
import sklearn
from sklearn.cluster import KMeans
bp_instance = unreal.EditorAssetLibrary.load_blueprint_class('/Game/BP_Instance.BP_Instance')
list_actors = unreal.EditorLevelLibrary.get_selected_level_actors()
list_static_mesh_actors = unreal.EditorFilterLibrary.by_class(list_actors,unreal.StaticMeshActor)
list_unique = np.array([])
for lsm in list_static_mesh_actors:
static_mesh = lsm.get_component_by_class(unreal.StaticMeshComponent).get_editor_property("StaticMesh")
list_unique = np.append(list_unique,static_mesh)
list_unique = np.unique(list_unique)
for lu in list_unique:
list_transform = np.array([])
list_locations = np.array([[0,0,0]])
#UE4 | @UNREALENGINE
コード 2/2
for lsm in list_static_mesh_actors:
if lsm.get_component_by_class(unreal.StaticMeshComponent).get_editor_property("StaticMesh") == lu:
list_transform = np.append(list_transform,lsm.get_actor_transform())
location = np.array([[lsm.get_actor_location().x,lsm.get_actor_location().y,lsm.get_actor_location().z]])
list_locations = np.append(list_locations,location,axis=0)
list_locations = np.delete(list_locations,0,axis=0)
num_clusters = 3
pred = KMeans(n_clusters=num_clusters).fit_predict(list_locations)
instanced_components = np.array([])
for i in range(num_clusters):
instanced_actor = unreal.EditorLevelLibrary.spawn_actor_from_class(bp_instance,(0,0,0),(0,0,0))
instanced_component = instanced_actor.get_component_by_class(unreal.InstancedStaticMeshComponent)
instanced_components = np.append(instanced_components,instanced_component)
for j, pd in enumerate(pred):
instanced_components[pd].add_instance(list_transform[j])
for k in range(num_clusters):
instanced_components[k].set_editor_property("StaticMesh",lu)
for lsm in list_static_mesh_actors:
lsm.destroy_actor()
#UE4 | @UNREALENGINE
解説 4/5
#コンポーネントのリストを作成
instanced_components = np.array([])
#クラスタ毎にアクタをスポーン、コンポーネントをリストに入れる
for i in range(num_clusters):
instanced_actor = unreal.EditorLevelLibrary.spawn_actor_from_class(bp_instance,(0,0,0),(0,0,0))
instanced_component = instanced_actor.get_component_by_class(unreal.InstancedStaticMeshComponent)
instanced_components = np.append(instanced_components,instanced_component)
#UE4 | @UNREALENGINE
解説 4/5
#コンポーネントのリストを作成
instanced_components = np.array([])
#クラスタ毎にアクタをスポーン、コンポーネントをリストに入れる
for i in range(num_clusters):
instanced_actor = unreal.EditorLevelLibrary.spawn_actor_from_class(bp_instance,(0,0,0),(0,0,0))
instanced_component = instanced_actor.get_component_by_class(unreal.InstancedStaticMeshComponent)
instanced_components = np.append(instanced_components,instanced_component)
#UE4 | @UNREALENGINE
解説 4/5
#コンポーネントのリストを作成
instanced_components = np.array([])
#クラスタ毎にアクタをスポーン、コンポーネントをリストに入れる
for i in range(num_clusters):
instanced_actor = unreal.EditorLevelLibrary.spawn_actor_from_class(bp_instance,(0,0,0),(0,0,0))
instanced_component = instanced_actor.get_component_by_class(unreal.InstancedStaticMeshComponent)
instanced_components = np.append(instanced_components,instanced_component)
#UE4 | @UNREALENGINE
解説 4/5
#コンポーネントのリストを作成
instanced_components = np.array([])
#クラスタ毎にアクタをスポーン、コンポーネントをリストに入れる
for i in range(num_clusters):
instanced_actor = unreal.EditorLevelLibrary.spawn_actor_from_class(bp_instance,(0,0,0),(0,0,0))
instanced_component = instanced_actor.get_component_by_class(unreal.InstancedStaticMeshComponent)
instanced_components = np.append(instanced_components,instanced_component)
スポーンするアクタは
あらかじめ用意しておく
Blueprintを作成し
Instanced Static Meshを追加
#UE4 | @UNREALENGINE
解説 4/5
#コンポーネントのリストを作成
instanced_components = np.array([])
#クラスタ毎にアクタをスポーン、コンポーネントをリストに入れる
for i in range(num_clusters):
instanced_actor = unreal.EditorLevelLibrary.spawn_actor_from_class(bp_instance,(0,0,0),(0,0,0))
instanced_component = instanced_actor.get_component_by_class(unreal.InstancedStaticMeshComponent)
instanced_components = np.append(instanced_components,instanced_component)
#UE4 | @UNREALENGINE
解説 5/5
#クラスタ番号を元に親となるインスタンスを選択し、トランスフォームを追加
for j, pd in enumerate(pred):
instanced_components[pd].add_instance(list_transform[j])
#スタティックメッシュを割り当て
for k in range(num_clusters):
instanced_components[k].set_editor_property("StaticMesh",lu)
#最初に選択していたアクタを削除
for lsm in list_static_mesh_actors:
lsm.destroy_actor()
#UE4 | @UNREALENGINE
解説 5/5
#クラスタ番号を元に親となるインスタンスを選択し、トランスフォームを追加
for j, pd in enumerate(pred):
instanced_components[pd].add_instance(list_transform[j])
#スタティックメッシュを割り当て
for k in range(num_clusters):
instanced_components[k].set_editor_property("StaticMesh",lu)
#最初に選択していたアクタを削除
for lsm in list_static_mesh_actors:
lsm.destroy_actor()
#UE4 | @UNREALENGINE
解説 5/5
#クラスタ番号を元に親となるインスタンスを選択し、トランスフォームを追加
for j, pd in enumerate(pred):
instanced_components[pd].add_instance(list_transform[j])
#スタティックメッシュを割り当て
for k in range(num_clusters):
instanced_components[k].set_editor_property("StaticMesh",lu)
#最初に選択していたアクタを削除
for lsm in list_static_mesh_actors:
lsm.destroy_actor()
空のインスタンス
#UE4 | @UNREALENGINE
解説 5/5
#クラスタ番号を元に親となるインスタンスを選択し、トランスフォームを追加
for j, pd in enumerate(pred):
instanced_components[pd].add_instance(list_transform[j])
#スタティックメッシュを割り当て
for k in range(num_clusters):
instanced_components[k].set_editor_property("StaticMesh",lu)
#最初に選択していたアクタを削除
for lsm in list_static_mesh_actors:
lsm.destroy_actor()
#UE4 | @UNREALENGINE
解説 5/5
#クラスタ番号を元に親となるインスタンスを選択し、トランスフォームを追加
for j, pd in enumerate(pred):
instanced_components[pd].add_instance(list_transform[j])
#スタティックメッシュを割り当て
for k in range(num_clusters):
instanced_components[k].set_editor_property("StaticMesh",lu)
#最初に選択していたアクタを削除
for lsm in list_static_mesh_actors:
lsm.destroy_actor()
#UE4 | @UNREALENGINE
解説 5/5
#クラスタ番号を元に親となるインスタンスを選択し、トランスフォームを追加
for j, pd in enumerate(pred):
instanced_components[pd].add_instance(list_transform[j])
#スタティックメッシュを割り当て
for k in range(num_clusters):
instanced_components[k].set_editor_property("StaticMesh",lu)
#最初に選択していたアクタを削除
for lsm in list_static_mesh_actors:
lsm.destroy_actor()
#UE4 | @UNREALENGINE
コード
import unreal
import numpy as np
selected_actors = unreal.EditorLevelLibrary.get_selected_level_actors()
for sa in selected_actors:
instanced_components = np.array([])
instanced_component = sa.get_components_by_class(unreal.InstancedStaticMeshComponent)
instanced_components = np.append(instanced_components,instanced_component)
for ic in instanced_components:
instance_transform = np.array([])
instance_count = ic.get_instance_count()
for j in range(instance_count):
instance_transform = np.append(instance_transform,ic.get_instance_transform(j,1))
spawned_actor = unreal.EditorLevelLibrary.spawn_actor_from_class(unreal.StaticMeshActor,(0,0,0),(0,0,0))
spawned_actor.set_actor_transform(instance_transform[j],0,0)
smc = spawned_actor.get_component_by_class(unreal.StaticMeshComponent)
smc.set_editor_property("StaticMesh",ic.get_editor_property("StaticMesh"))
for sa in selected_actors:
sa.destroy_actor()
#UE4 | @UNREALENGINE
解説 2/3
#インスタンスコンポーネントを配列に入れる
for sa in selected_actors:
instanced_components = np.array([])
instanced_component = sa.get_components_by_class(unreal.InstancedStaticMeshComponent)
instanced_components = np.append(instanced_components,instanced_component)
#インスタンス数を取得
for ic in instanced_components:
instance_transform = np.array([])
instance_count = ic.get_instance_count()
#UE4 | @UNREALENGINE
解説 2/3
#インスタンスコンポーネントを配列に入れる
for sa in selected_actors:
instanced_components = np.array([])
instanced_component = sa.get_components_by_class(unreal.InstancedStaticMeshComponent)
instanced_components = np.append(instanced_components,instanced_component)
#インスタンス数を取得
for ic in instanced_components:
instance_transform = np.array([])
instance_count = ic.get_instance_count()
#UE4 | @UNREALENGINE
解説 2/3
#インスタンスコンポーネントを配列に入れる
for sa in selected_actors:
instanced_components = np.array([])
instanced_component = sa.get_components_by_class(unreal.InstancedStaticMeshComponent)
instanced_components = np.append(instanced_components,instanced_component)
#インスタンス数を取得
for ic in instanced_components:
instance_transform = np.array([])
instance_count = ic.get_instance_count()
#UE4 | @UNREALENGINE
解説 2/3
#インスタンスコンポーネントを配列に入れる
for sa in selected_actors:
instanced_components = np.array([])
instanced_component = sa.get_components_by_class(unreal.InstancedStaticMeshComponent)
instanced_components = np.append(instanced_components,instanced_component)
#インスタンス数を取得
for ic in instanced_components:
instance_transform = np.array([])
instance_count = ic.get_instance_count()
インスタンスがいくつあるか取得し、
その数分新たにアクタをスポーンしていく
#UE4 | @UNREALENGINE
解説 3/3
#インスタンス数の分だけトランスフォーム値を取得
for j in range(instance_count):
instance_transform = np.append(instance_transform,ic.get_instance_transform(j,1))
#スポーンしてトランスフォームを適用
spawned_actor = unreal.EditorLevelLibrary.spawn_actor_from_class(unreal.StaticMeshActor,(0,0,0),(0,0,0))
spawned_actor.set_actor_transform(instance_transform[j],0,0)
smc = spawned_actor.get_component_by_class(unreal.StaticMeshComponent)
#スタティックメッシュを割り当て
smc.set_editor_property("StaticMesh",ic.get_editor_property("StaticMesh"))
#最初に選択していたアクタを削除
for sa in selected_actors:
sa.destroy_actor()
#UE4 | @UNREALENGINE
解説 3/3
#インスタンス数の分だけトランスフォーム値を取得
for j in range(instance_count):
instance_transform = np.append(instance_transform,ic.get_instance_transform(j,1))
#スポーンしてトランスフォームを適用
spawned_actor = unreal.EditorLevelLibrary.spawn_actor_from_class(unreal.StaticMeshActor,(0,0,0),(0,0,0))
spawned_actor.set_actor_transform(instance_transform[j],0,0)
smc = spawned_actor.get_component_by_class(unreal.StaticMeshComponent)
#スタティックメッシュを割り当て
smc.set_editor_property("StaticMesh",ic.get_editor_property("StaticMesh"))
#最初に選択していたアクタを削除
for sa in selected_actors:
sa.destroy_actor()
#UE4 | @UNREALENGINE
解説 3/3
#インスタンス数の分だけトランスフォーム値を取得
for j in range(instance_count):
instance_transform = np.append(instance_transform,ic.get_instance_transform(j,1))
#スポーンしてトランスフォームを適用
spawned_actor = unreal.EditorLevelLibrary.spawn_actor_from_class(unreal.StaticMeshActor,(0,0,0),(0,0,0))
spawned_actor.set_actor_transform(instance_transform[j],0,0)
#スタティックメッシュを割り当て
smc = spawned_actor.get_component_by_class(unreal.StaticMeshComponent)
smc.set_editor_property("StaticMesh",ic.get_editor_property("StaticMesh"))
#最初に選択していたアクタを削除
for sa in selected_actors:
sa.destroy_actor()
#UE4 | @UNREALENGINE
解説 3/3
#インスタンス数の分だけトランスフォーム値を取得
for j in range(instance_count):
instance_transform = np.append(instance_transform,ic.get_instance_transform(j,1))
#スポーンしてトランスフォームを適用
spawned_actor = unreal.EditorLevelLibrary.spawn_actor_from_class(unreal.StaticMeshActor,(0,0,0),(0,0,0))
spawned_actor.set_actor_transform(instance_transform[j],0,0)
#スタティックメッシュを割り当て
smc = spawned_actor.get_component_by_class(unreal.StaticMeshComponent)
smc.set_editor_property("StaticMesh",ic.get_editor_property("StaticMesh"))
#最初に選択していたアクタを削除
for sa in selected_actors:
sa.destroy_actor()
#UE4 | @UNREALENGINE
解説 3/3
#インスタンス数の分だけトランスフォーム値を取得
for j in range(instance_count):
instance_transform = np.append(instance_transform,ic.get_instance_transform(j,1))
#スポーンしてトランスフォームを適用
spawned_actor = unreal.EditorLevelLibrary.spawn_actor_from_class(unreal.StaticMeshActor,(0,0,0),(0,0,0))
spawned_actor.set_actor_transform(instance_transform[j],0,0)
#スタティックメッシュを割り当て
smc = spawned_actor.get_component_by_class(unreal.StaticMeshComponent)
smc.set_editor_property("StaticMesh",ic.get_editor_property("StaticMesh"))
#最初に選択していたアクタを削除
for sa in selected_actors:
sa.destroy_actor()