SlideShare a Scribd company logo
1 of 133
Download to read offline
Python / Blueprintによる
Unreal Engineの自動化
Epic Games Japan / Technical Artist
小林浩之
#UE4 | @UNREALENGINE
自己紹介
小林 浩之
Epic Games Japan / Technical Artist
スクウェア・エニックス大阪で背景TAを2年ほど
今年2月からEGJのエンタープライズ分野のサポートとして入社
#UE4 | @UNREALENGINE
目次
• 大規模開発における作業効率化・自動化の需要
• Unreal Engine 4の作業効率化・自動化ツール紹介
• 実装例
• Datasmithインポートの効率化 Blueprint
• 命名規則に応じたアセットリネーム Editor Utility Widget & Blueprint
• Pythonによるインスタンシング Python
• インスタンスを個別のStatic Meshに変換 Python
#UE4 | @UNREALENGINE
目次
• 大規模開発における作業効率化・自動化の需要
• Unreal Engine 4の作業効率化・自動化ツール紹介
• 実装例
• Datasmithインポートの効率化 Blueprint
• 命名規則に応じたアセットリネーム Editor Utility Widget & Blueprint
• Pythonによるインスタンシング Python
• インスタンスを個別のStatic Meshに変換 Python
#UE4 | @UNREALENGINE
大規模開発における作業効率化・自動化の需要
大量に配置されたオブジェクトの整理、膨大なアセットの管理など、
手作業でやっているとコストがかかるりすぎる・・・
時間が足りない・・・
クオリティアップにコストを割けない・・・
#UE4 | @UNREALENGINE
大規模開発における作業効率化・自動化の需要
オブジェクト整理作業
アセット管理作業
などなど
自動化
#UE4 | @UNREALENGINE
McLarenによる事例
Unreal Engineへの
CADデータインポートの自動化
#UE4 | @UNREALENGINE
McLarenによる事例
インポートフローの改善
#UE4 | @UNREALENGINE
目次
• 大規模開発における作業効率化・自動化の需要
• Unreal Engine 4の作業効率化・自動化ツール紹介
• 実装例
• Datasmithインポートの効率化 Blueprint
• 命名規則に応じたアセットリネーム Editor Utility Widget & Blueprint
• Pythonによるインスタンシング Python
• インスタンスを個別のStatic Meshに変換 Python
#UE4 | @UNREALENGINE
Bluetility (Blueprint Utility)
Blueprintを使ったスクリプティング
#UE4 | @UNREALENGINE
Bluetility
プラグイン > Editor Scripting Utilities
#UE4 | @UNREALENGINE
Unreal Python
Pythonによるエディタスクリプティング
#UE4 | @UNREALENGINE
Unreal Python
プラグイン > Python Editor Script Pluginにチェックで有効化
#UE4 | @UNREALENGINE
Unreal Python
アウトプットログから直接入力
実行方法
#UE4 | @UNREALENGINE
Unreal Python
.pyファイルのパス指定で実行
実行方法
#UE4 | @UNREALENGINE
Unreal Python
エディタ起動時に実行
#UE4 | @UNREALENGINE
Editor Utility Widget
UMG&Blueprintでエディタ拡張
#UE4 | @UNREALENGINE
Editor Utility Widget
コンテンツブラウザで右クリック>Editor Utilities>Editor Widgetから作成
#UE4 | @UNREALENGINE
Editor Utility Widget
#UE4 | @UNREALENGINE
Editor Utility Widget
UIに必要な機能(ボタンやテキストなど)をD&Dで置く
#UE4 | @UNREALENGINE
Editor Utility Widget
UIからの処理をBlueprintで作成
#UE4 | @UNREALENGINE
Editor Utility Widget
アセット右クリック>Run Editor Utility WidgetでWindow立ち上げ、実行
#UE4 | @UNREALENGINE
Editor Utility Widget
EGJ 岡田による解説記事
[UE4]エディタ上で動作するツール・エディタ拡張をUMGで簡単に作れる
Editor Utility Widget について
https://qiita.com/EGJ-Kaz_Okada/items/9f530db3b53d0fde3f20
[UE4]Editor Utility Widgetでツール・エディタ拡張を作る際のUndo/Redo
の実装方法について
https://qiita.com/EGJ-Kaz_Okada/items/985b98fb934d751f4f69
#UE4 | @UNREALENGINE
目次
• 大規模開発における作業効率化・自動化の需要
• Unreal Engine 4の作業効率化・自動化ツール紹介
• 実装例
• Datasmithインポートの効率化 Blueprint
• 命名規則に応じたアセットリネーム Editor Utility Widget & Blueprint
• Pythonによるインスタンシング Python
• インスタンスを個別のStatic Meshに変換 Python
#UE4 | @UNREALENGINE
実装例:Datasmithインポートの効率化
#UE4 | @UNREALENGINE
Datasmithとは
CADソフトなどのデータをUE4用に変換してインポートする機能 (Unreal Studioのみ)
Datasmith
#UE4 | @UNREALENGINE
Datasmithによって大幅に効率化されるが・・・
CADデータの場合細かいネジなどのパーツまで含んだデータになっている場合が多い
環境によっては処理負荷が高くなってしまう可能性も
#UE4 | @UNREALENGINE
Datasmithによって大幅に効率化されるが・・・
リアルタイムエンジンでスムーズに描画するためには
ほとんど描画されないような小さいパーツは削除したり、一つにまとめる必要がある
#UE4 | @UNREALENGINE
普通にインポートして後から削除しようとするとする場合
パーツ数が膨大だと作業コストが高くなってしまう
インポート 小さいパーツを探す 削除
数百パーツを手作業でとか・・・
#UE4 | @UNREALENGINE
BlueprintやPythonを使うことでこれらの作業を自動化できる
インポート 小さいパーツを探す 削除
自動化
#UE4 | @UNREALENGINE
小さいパーツを除外してインポート
#UE4 | @UNREALENGINE
小さいパーツを除外してインポート
#UE4 | @UNREALENGINE
Blueprint
※拡大して解説していきます
#UE4 | @UNREALENGINE
解説
インポートするデータからDatasmith Sceneを構築
#UE4 | @UNREALENGINE
Datasmith Scene
Datasmithでは、実際にデータをインポートする前に
メモリ上で一度シーン構築を行う
インポート
Datasmith Scene in Memory
メモリ上でシーンを構築
CADデータ
#UE4 | @UNREALENGINE
Datasmith Scene
Datasmithでは、実際にデータをインポートする前に
メモリ上で一度シーン構築を行う
インポート
Datasmith Scene in Memory
メモリ上でシーンを構築
CADデータ
#UE4 | @UNREALENGINE
解説
Datasmith Scene内のアクタを取得
#UE4 | @UNREALENGINE
解説
バウンディングボックスの大きさを評価
#UE4 | @UNREALENGINE
解説
バウンディングボックス
オブジェクトを囲む最小の立方体
この立方体の幅、奥行き、高さから
オブジェクトの大体の大きさを測る
#UE4 | @UNREALENGINE
解説
条件に当てはまればアクタを削除
#UE4 | @UNREALENGINE
解説
インポートオプションを設定
#UE4 | @UNREALENGINE
解説
実際にインポートし、最後にDatasmith Sceneを削除
#UE4 | @UNREALENGINE
実装例:命名規則に応じたアセットリネーム
#UE4 | @UNREALENGINE
命名規則について
アセットの種類や用途に応じて名前の前後に付ける文字列
#UE4 | @UNREALENGINE
命名規則について
アセットの種類や用途に応じて名前の前後に付ける文字列
例えば・・・
Static Mesh アセット「Table」があるとしたら
Static Meshの省略 SM を付け 「SM_Table」
バリエーションがある場合は
番号やアルファベットを付け「 SM_Table _A」にする
#UE4 | @UNREALENGINE
命名規則について
参考
Unreal Engine Assets Naming Convention
https://wiki.unrealengine.com/Assets_Naming_Convention_JP
#UE4 | @UNREALENGINE
命名規則について
プロジェクトが大規模化するにつれ、命名規則はより重要に
#UE4 | @UNREALENGINE
命名規則について
プロジェクトが大規模化するにつれ、命名規則はより重要に
作業者が自由に名前を付けていると・・・
● 他の作業者から見たとき用途や種類が判別しにくい
● 特定のアセットを探しずらい
#UE4 | @UNREALENGINE
実装例:命名規則に応じたアセットリネーム
#UE4 | @UNREALENGINE
解説 UI
エディットできるText BoxやButtonなどを置いただけ
シンプルな構成
#UE4 | @UNREALENGINE
解説 UI
エディットできるText BoxやButtonなどを置いただけ
シンプルな構成
#UE4 | @UNREALENGINE
解説 Blueprint
#UE4 | @UNREALENGINE
解説 Blueprint
ボタンが押されたら選択しているアセットを取得
#UE4 | @UNREALENGINE
解説 Blueprint
アセットの種類毎にリネーム処理
#UE4 | @UNREALENGINE
解説 Blueprint
関数Asset Renameの中身
#UE4 | @UNREALENGINE
解説 Blueprint
処理するクラスを設定
#UE4 | @UNREALENGINE
解説 Blueprint
リネーム処理
#UE4 | @UNREALENGINE
実装例:Pythonによるインスタンシング
#UE4 | @UNREALENGINE
インスタンシング
大量のオブジェクトを描画する際に有効な手法
ドローコールを削減し、描画コストを下げる
ドローコール
現在の画面を描画するために必要な情報を呼び出す命令のこと
回数が多いほど処理負荷につながる可能性がある
#UE4 | @UNREALENGINE
インスタンス化によるドローコールの削減
非インスタンス インスタンス
9回分のドローコール 1回分のドローコール
#UE4 | @UNREALENGINE
Instanced Static Mesh
Unreal Engineでのインスタンス化メッシュ
#UE4 | @UNREALENGINE
Instanced Static Mesh
#UE4 | @UNREALENGINE
Instanced Static Mesh
• Static Mesh
#UE4 | @UNREALENGINE
Instanced Static Mesh
• Static Mesh
• インスタンス数分の位置、回転、スケール
#UE4 | @UNREALENGINE
Static Meshをインスタンス化
ツールやスクリプトを使わずに
手作業で変換しようとすると・・・
アクタ一つ一つの位置、回転、
スケールをコピーして・・・
#UE4 | @UNREALENGINE
Static Meshをインスタンス化
ツールやスクリプトを使わずに
手作業で変換しようとすると・・・
インスタンスに追加
#UE4 | @UNREALENGINE
Static Meshをインスタンス化
Merge Actors
選択アクタを一つのインスタンスに変換
#UE4 | @UNREALENGINE
Static Meshをインスタンス化
Merge Actors
選択アクタを一つのインスタンスに変換
複数インスタンスを一度に生成はできない
#UE4 | @UNREALENGINE
Static Meshをインスタンス化
Merge Actors
多数のアクタがあるとして・・・
#UE4 | @UNREALENGINE
Static Meshをインスタンス化
Merge Actors
複数グループに分けてインスタンス化したい場合
インスタンス化したいグループ毎に
選択して変換する作業が必要
#UE4 | @UNREALENGINE
インスタンス化によるドローコールの削減
大量のアクタを複数インスタンス化していくのは高コスト
なるべく自動で、いい感じのグループに分けてインスタンス化したい・・・
#UE4 | @UNREALENGINE
インスタンス化によるドローコールの削減
大量のアクタを複数インスタンス化していくのは高コスト
なるべく自動で、いい感じのグループに分けてインスタンス化したい・・・
Python外部ライブラリからK-means法を使ってインスタンシング!
#UE4 | @UNREALENGINE
K-means法とは ざっくり解説
クラスタ分析を行う手法の一つ
Pythonの外部ライブラリScikit Learnに含まれている
#UE4 | @UNREALENGINE
K-means法とは ざっくり解説
バラバラな座標のリストがあるとして・・・
#UE4 | @UNREALENGINE
K-means法とは ざっくり解説
クラスタ数=5
設定したクラスタ数に応じて、近い属性同士のグループを作る
#UE4 | @UNREALENGINE
Unreal Pythonで外部ライブラリを使う
ライブラリインストール後、Python¥Lib¥site-packagesを
Engine¥Binaries¥ThirdParty¥Python¥Win64¥Lib以下に丸ごとコピー
import 〇〇でインポート出来るようになる
#UE4 | @UNREALENGINE
K-means法によるインスタンシング
#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
解説 1/5
#ライブラリをインポート
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)
#UE4 | @UNREALENGINE
解説 1/5
#ライブラリをインポート
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)
#UE4 | @UNREALENGINE
解説 1/5
#ライブラリをインポート
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)
#UE4 | @UNREALENGINE
解説 1/5
#ライブラリをインポート
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)
後で選択アクタから
位置、回転、メッシュ情報などを取得
#UE4 | @UNREALENGINE
解説 2/5
#メッシュの種類毎にクラスタリングするため、アクタのリストからメッシュの種類がいくつあるかを求める
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
複数種類のメッシュがあった場合
Instanced Static Meshが
持てるメッシュは一種類のみ
#UE4 | @UNREALENGINE
複数種類のメッシュがあった場合
クラスタ数=3
#UE4 | @UNREALENGINE
複数種類のメッシュがあった場合
種類ごとにクラスタリング
クラスタ数=3
#UE4 | @UNREALENGINE
複数種類のメッシュがあった場合
クラスタ数=3
種類ごとにクラスタリング
#UE4 | @UNREALENGINE
解説 3/5
#インスタンスに追加するトランスフォームリストと、クラスタリングに使うための位置リストを作成
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)
#UE4 | @UNREALENGINE
解説 3/5
#インスタンスに追加するトランスフォームリストと、クラスタリングに使うための位置リストを作成
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)
#UE4 | @UNREALENGINE
解説 3/5
#インスタンスに追加するトランスフォームリストと、クラスタリングに使うための位置リストを作成
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)
Get_actor_location() ・・・Unreal Vector型を返す
#UE4 | @UNREALENGINE
Unreal Vector型
Unreal Engine上でVector型をやり取りするための型
Kmeansでも使えるように
#UE4 | @UNREALENGINE
解説 3/5
#インスタンスに追加するトランスフォームリストと、クラスタリングに使うための位置リストを作成
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)
#UE4 | @UNREALENGINE
解説 3/5
#インスタンスに追加するトランスフォームリストと、クラスタリングに使うための位置リストを作成
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 = 5
pred = KMeans(n_clusters=num_clusters).fit_predict(list_locations)
n_clusters = 5
#UE4 | @UNREALENGINE
解説 3/5
#インスタンスに追加するトランスフォームリストと、クラスタリングに使うための位置リストを作成
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 = 5
pred = KMeans(n_clusters=num_clusters).fit_predict(list_locations)
0
1
2
3
4
0
0
0
1
1
1
2
2
2
2
3
3
3
4
4
4
fit_predict
#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
これでインスタンス化できたが・・・
再調整したい場合は元のバラバラな状態に戻す必要がある
#UE4 | @UNREALENGINE
実装例:インスタンスを個別のStaticMeshに変換
#UE4 | @UNREALENGINE
インスタンスを個別のStaticMeshに変換
#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
解説 1/3
#ライブラリをインポート
import unreal
import numpy as np
#選択したアクタを取得
selected_actors = unreal.EditorLevelLibrary.get_selected_level_actors()
#UE4 | @UNREALENGINE
解説 1/3
#ライブラリをインポート
import unreal
import numpy as np
#選択したアクタを取得
selected_actors = unreal.EditorLevelLibrary.get_selected_level_actors()
#UE4 | @UNREALENGINE
解説 1/3
#ライブラリをインポート
import unreal
import numpy as np
#選択したアクタを取得
selected_actors = unreal.EditorLevelLibrary.get_selected_level_actors()
#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()
#UE4 | @UNREALENGINE
おまけ:UIを作る
#UE4 | @UNREALENGINE
おまけ:UIを作る
#UE4 | @UNREALENGINE
おまけ:UIを作る
特定のアクタを選択
#UE4 | @UNREALENGINE
おまけ:UIを作る
特定のアクタを選択
#UE4 | @UNREALENGINE
おまけ:UIを作る
#UE4 | @UNREALENGINE
実装例は後日Qiitaで公開予定
※あくまで一例として作ったものなので、より実用的にするには改良が必要
※公開した実装例の保守、サポートは致しません
#UE4 | @UNREALENGINE
参考
Unreal Python API リファレンス
https://api.unrealengine.com/INT/PythonAPI/
#UE4 | @UNREALENGINE
参考
Mclarenによる事例:ホワイトペーパー
Unreal Studio を使用した CAD データの準備および
リアルタイム ビジュアライゼーションでの自動化
https://cdn2.unrealengine.com/Unreal+Engine%2Fresources%2FMcLaren+W
hitepaper%2FADCaV-Whitepaper-JPN-V2-
f4fd0b09e8b279171149eef9220370e1b7495092.pdf
#UE4 | @UNREALENGINE
#UE4 | @UNREALENGINE
ご清聴ありがとうございました

More Related Content

What's hot

Editor Utility Widgetで色々便利にしてみた。
Editor Utility Widgetで色々便利にしてみた。Editor Utility Widgetで色々便利にしてみた。
Editor Utility Widgetで色々便利にしてみた。IndieusGames
 
第2回UE4勉強会 in 大阪 - マテリアル基礎・初級
第2回UE4勉強会 in 大阪 - マテリアル基礎・初級第2回UE4勉強会 in 大阪 - マテリアル基礎・初級
第2回UE4勉強会 in 大阪 - マテリアル基礎・初級com044
 
UE4におけるキャラクタークラス設計
UE4におけるキャラクタークラス設計UE4におけるキャラクタークラス設計
UE4におけるキャラクタークラス設計Masahiko Nakamura
 
UE4 コリジョン検証 -HitとOverlapイベントが発生する条件について-
UE4 コリジョン検証 -HitとOverlapイベントが発生する条件について-UE4 コリジョン検証 -HitとOverlapイベントが発生する条件について-
UE4 コリジョン検証 -HitとOverlapイベントが発生する条件について-Tatsuya Iwama
 
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!エピック・ゲームズ・ジャパン Epic Games Japan
 
UE4でTranslucencyやUnlitに影を落としたい!
UE4でTranslucencyやUnlitに影を落としたい!UE4でTranslucencyやUnlitに影を落としたい!
UE4でTranslucencyやUnlitに影を落としたい!com044
 
UE4 アセットロード周り-アセット参照調査-
UE4 アセットロード周り-アセット参照調査-UE4 アセットロード周り-アセット参照調査-
UE4 アセットロード周り-アセット参照調査-com044
 
C++コードはいらない!UE4で作るお手軽マルチプレイ ネットワークゲームについて
C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについてC++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて
C++コードはいらない!UE4で作るお手軽マルチプレイ ネットワークゲームについてMasahiko Nakamura
 
[UE4]自動テストでもっと楽したい!
[UE4]自動テストでもっと楽したい![UE4]自動テストでもっと楽したい!
[UE4]自動テストでもっと楽したい!com044
 

What's hot (20)

UE4をレンダラとした趣味的スピード背景ルックデブ(UE4 Environment Art Dive)
UE4をレンダラとした趣味的スピード背景ルックデブ(UE4 Environment Art Dive)UE4をレンダラとした趣味的スピード背景ルックデブ(UE4 Environment Art Dive)
UE4をレンダラとした趣味的スピード背景ルックデブ(UE4 Environment Art Dive)
 
UE4の色について v1.1
 UE4の色について v1.1 UE4の色について v1.1
UE4の色について v1.1
 
Editor Utility Widgetで色々便利にしてみた。
Editor Utility Widgetで色々便利にしてみた。Editor Utility Widgetで色々便利にしてみた。
Editor Utility Widgetで色々便利にしてみた。
 
猫でも分かるUE4.22から入ったSubsystem
猫でも分かるUE4.22から入ったSubsystem 猫でも分かるUE4.22から入ったSubsystem
猫でも分かるUE4.22から入ったSubsystem
 
UE4で作成するUIと最適化手法
UE4で作成するUIと最適化手法UE4で作成するUIと最適化手法
UE4で作成するUIと最適化手法
 
UE4におけるレベル制作事例
UE4におけるレベル制作事例  UE4におけるレベル制作事例
UE4におけるレベル制作事例
 
第2回UE4勉強会 in 大阪 - マテリアル基礎・初級
第2回UE4勉強会 in 大阪 - マテリアル基礎・初級第2回UE4勉強会 in 大阪 - マテリアル基礎・初級
第2回UE4勉強会 in 大阪 - マテリアル基礎・初級
 
UE4のローカライズ機能紹介 (UE4 Localization Deep Dive)
UE4のローカライズ機能紹介 (UE4 Localization Deep Dive)UE4のローカライズ機能紹介 (UE4 Localization Deep Dive)
UE4のローカライズ機能紹介 (UE4 Localization Deep Dive)
 
UE4を使った映像制作 (UE4 Character Art Dive Online)
UE4を使った映像制作 (UE4 Character Art Dive Online)UE4を使った映像制作 (UE4 Character Art Dive Online)
UE4を使った映像制作 (UE4 Character Art Dive Online)
 
なぜなにFProperty - 対応方法と改善点 -
なぜなにFProperty - 対応方法と改善点 -なぜなにFProperty - 対応方法と改善点 -
なぜなにFProperty - 対応方法と改善点 -
 
Nintendo Switch『OCTOPATH TRAVELER』はこうして作られた
Nintendo Switch『OCTOPATH TRAVELER』はこうして作られたNintendo Switch『OCTOPATH TRAVELER』はこうして作られた
Nintendo Switch『OCTOPATH TRAVELER』はこうして作られた
 
UE4におけるキャラクタークラス設計
UE4におけるキャラクタークラス設計UE4におけるキャラクタークラス設計
UE4におけるキャラクタークラス設計
 
CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらいCEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
 
UE4 コリジョン検証 -HitとOverlapイベントが発生する条件について-
UE4 コリジョン検証 -HitとOverlapイベントが発生する条件について-UE4 コリジョン検証 -HitとOverlapイベントが発生する条件について-
UE4 コリジョン検証 -HitとOverlapイベントが発生する条件について-
 
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
 
UE4でTranslucencyやUnlitに影を落としたい!
UE4でTranslucencyやUnlitに影を落としたい!UE4でTranslucencyやUnlitに影を落としたい!
UE4でTranslucencyやUnlitに影を落としたい!
 
猫でも分かるUMG
猫でも分かるUMG猫でも分かるUMG
猫でも分かるUMG
 
UE4 アセットロード周り-アセット参照調査-
UE4 アセットロード周り-アセット参照調査-UE4 アセットロード周り-アセット参照調査-
UE4 アセットロード周り-アセット参照調査-
 
C++コードはいらない!UE4で作るお手軽マルチプレイ ネットワークゲームについて
C++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについてC++コードはいらない!UE4で作るお手軽マルチプレイネットワークゲームについて
C++コードはいらない!UE4で作るお手軽マルチプレイ ネットワークゲームについて
 
[UE4]自動テストでもっと楽したい!
[UE4]自動テストでもっと楽したい![UE4]自動テストでもっと楽したい!
[UE4]自動テストでもっと楽したい!
 

Similar to [GTMF2019] Python / BlueprintによるUnreal Engineの自動化

「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビューTakafumi ONAKA
 
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術Unity Technologies Japan K.K.
 
GTMF 2015: UE4で開発環境は次なるステージへ~才能のコラボーレーションでクリエイティビティはさらなる高みへ~ | エピック・ゲームズ・ジャパ...
GTMF 2015: UE4で開発環境は次なるステージへ~才能のコラボーレーションでクリエイティビティはさらなる高みへ~ |  エピック・ゲームズ・ジャパ...GTMF 2015: UE4で開発環境は次なるステージへ~才能のコラボーレーションでクリエイティビティはさらなる高みへ~ |  エピック・ゲームズ・ジャパ...
GTMF 2015: UE4で開発環境は次なるステージへ~才能のコラボーレーションでクリエイティビティはさらなる高みへ~ | エピック・ゲームズ・ジャパ...Game Tools & Middleware Forum
 
Devとopsをつなぐchat ops
Devとopsをつなぐchat opsDevとopsをつなぐchat ops
Devとopsをつなぐchat opsikikko
 
第4回UE4勉強会 in 大阪 UE4でのチーム製作
第4回UE4勉強会 in 大阪   UE4でのチーム製作第4回UE4勉強会 in 大阪   UE4でのチーム製作
第4回UE4勉強会 in 大阪 UE4でのチーム製作com044
 
An Agile Way As an SET at LINE
An Agile Way As an SET at LINEAn Agile Way As an SET at LINE
An Agile Way As an SET at LINELINE Corporation
 
Intalio japan special cloud workshop
Intalio japan special cloud workshopIntalio japan special cloud workshop
Intalio japan special cloud workshopDaisuke Sugai
 
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜Preferred Networks
 
Google Developer Day 2010 Japan: Google エンジニアの日常 (山内 知昭)
Google Developer Day 2010 Japan: Google エンジニアの日常 (山内 知昭)Google Developer Day 2010 Japan: Google エンジニアの日常 (山内 知昭)
Google Developer Day 2010 Japan: Google エンジニアの日常 (山内 知昭)Google Developer Relations Team
 
Azure Machine Learning Build 2020
Azure Machine Learning Build 2020Azure Machine Learning Build 2020
Azure Machine Learning Build 2020Keita Onabuta
 
[CEDEC2017] 最新モバイルゲームの実例からみるUE4のモバイル向け機能・Tipsを全部まるっとご紹介!
[CEDEC2017] 最新モバイルゲームの実例からみるUE4のモバイル向け機能・Tipsを全部まるっとご紹介![CEDEC2017] 最新モバイルゲームの実例からみるUE4のモバイル向け機能・Tipsを全部まるっとご紹介!
[CEDEC2017] 最新モバイルゲームの実例からみるUE4のモバイル向け機能・Tipsを全部まるっとご紹介!エピック・ゲームズ・ジャパン Epic Games Japan
 
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜Ryo Sasaki
 
Pivotal Trackerでアジャイルなプロジェクト管理
Pivotal Trackerでアジャイルなプロジェクト管理Pivotal Trackerでアジャイルなプロジェクト管理
Pivotal Trackerでアジャイルなプロジェクト管理You&I
 
An Agile Way As an SET at LINE ~プロダクトオーナーシップ編~
An Agile Way As an SET at LINE ~プロダクトオーナーシップ編~An Agile Way As an SET at LINE ~プロダクトオーナーシップ編~
An Agile Way As an SET at LINE ~プロダクトオーナーシップ編~LINE Corporation
 

Similar to [GTMF2019] Python / BlueprintによるUnreal Engineの自動化 (20)

「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
 
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
 
GTMF 2015: UE4で開発環境は次なるステージへ~才能のコラボーレーションでクリエイティビティはさらなる高みへ~ | エピック・ゲームズ・ジャパ...
GTMF 2015: UE4で開発環境は次なるステージへ~才能のコラボーレーションでクリエイティビティはさらなる高みへ~ |  エピック・ゲームズ・ジャパ...GTMF 2015: UE4で開発環境は次なるステージへ~才能のコラボーレーションでクリエイティビティはさらなる高みへ~ |  エピック・ゲームズ・ジャパ...
GTMF 2015: UE4で開発環境は次なるステージへ~才能のコラボーレーションでクリエイティビティはさらなる高みへ~ | エピック・ゲームズ・ジャパ...
 
UE4でマルチプレイヤーゲームを作ろう
UE4でマルチプレイヤーゲームを作ろうUE4でマルチプレイヤーゲームを作ろう
UE4でマルチプレイヤーゲームを作ろう
 
UE4のモバイル向け機能や最新情報などを改めて紹介!2019
UE4のモバイル向け機能や最新情報などを改めて紹介!2019UE4のモバイル向け機能や最新情報などを改めて紹介!2019
UE4のモバイル向け機能や最新情報などを改めて紹介!2019
 
Devとopsをつなぐchat ops
Devとopsをつなぐchat opsDevとopsをつなぐchat ops
Devとopsをつなぐchat ops
 
第4回UE4勉強会 in 大阪 UE4でのチーム製作
第4回UE4勉強会 in 大阪   UE4でのチーム製作第4回UE4勉強会 in 大阪   UE4でのチーム製作
第4回UE4勉強会 in 大阪 UE4でのチーム製作
 
An Agile Way As an SET at LINE
An Agile Way As an SET at LINEAn Agile Way As an SET at LINE
An Agile Way As an SET at LINE
 
Intalio japan special cloud workshop
Intalio japan special cloud workshopIntalio japan special cloud workshop
Intalio japan special cloud workshop
 
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
 
Google Developer Day 2010 Japan: Google エンジニアの日常 (山内 知昭)
Google Developer Day 2010 Japan: Google エンジニアの日常 (山内 知昭)Google Developer Day 2010 Japan: Google エンジニアの日常 (山内 知昭)
Google Developer Day 2010 Japan: Google エンジニアの日常 (山内 知昭)
 
エンタープライズ分野向けUE4最新機能のご紹介
エンタープライズ分野向けUE4最新機能のご紹介エンタープライズ分野向けUE4最新機能のご紹介
エンタープライズ分野向けUE4最新機能のご紹介
 
Azure Machine Learning Build 2020
Azure Machine Learning Build 2020Azure Machine Learning Build 2020
Azure Machine Learning Build 2020
 
Twitter4Jとテスト
Twitter4JとテストTwitter4Jとテスト
Twitter4Jとテスト
 
[CEDEC2017] 最新モバイルゲームの実例からみるUE4のモバイル向け機能・Tipsを全部まるっとご紹介!
[CEDEC2017] 最新モバイルゲームの実例からみるUE4のモバイル向け機能・Tipsを全部まるっとご紹介![CEDEC2017] 最新モバイルゲームの実例からみるUE4のモバイル向け機能・Tipsを全部まるっとご紹介!
[CEDEC2017] 最新モバイルゲームの実例からみるUE4のモバイル向け機能・Tipsを全部まるっとご紹介!
 
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
 
今さら聞けない人のためのDevOps超入門 ODC2023編
今さら聞けない人のためのDevOps超入門 ODC2023編今さら聞けない人のためのDevOps超入門 ODC2023編
今さら聞けない人のためのDevOps超入門 ODC2023編
 
今さら聞けない人のためのDevOps超入門
今さら聞けない人のためのDevOps超入門今さら聞けない人のためのDevOps超入門
今さら聞けない人のためのDevOps超入門
 
Pivotal Trackerでアジャイルなプロジェクト管理
Pivotal Trackerでアジャイルなプロジェクト管理Pivotal Trackerでアジャイルなプロジェクト管理
Pivotal Trackerでアジャイルなプロジェクト管理
 
An Agile Way As an SET at LINE ~プロダクトオーナーシップ編~
An Agile Way As an SET at LINE ~プロダクトオーナーシップ編~An Agile Way As an SET at LINE ~プロダクトオーナーシップ編~
An Agile Way As an SET at LINE ~プロダクトオーナーシップ編~
 

More from エピック・ゲームズ・ジャパン Epic Games Japan

『バランワンダーワールド』でのマルチプラットフォーム対応について UNREAL FEST EXTREME 2021 SUMMER
『バランワンダーワールド』でのマルチプラットフォーム対応について  UNREAL FEST EXTREME 2021 SUMMER『バランワンダーワールド』でのマルチプラットフォーム対応について  UNREAL FEST EXTREME 2021 SUMMER
『バランワンダーワールド』でのマルチプラットフォーム対応について UNREAL FEST EXTREME 2021 SUMMERエピック・ゲームズ・ジャパン Epic Games Japan
 
『FINAL FANTASY VII REMAKE』におけるプロファイリングと最適化事例 UNREAL FEST EXTREME 2021 SUMMER
『FINAL FANTASY VII REMAKE』におけるプロファイリングと最適化事例 UNREAL FEST EXTREME 2021 SUMMER『FINAL FANTASY VII REMAKE』におけるプロファイリングと最適化事例 UNREAL FEST EXTREME 2021 SUMMER
『FINAL FANTASY VII REMAKE』におけるプロファイリングと最適化事例 UNREAL FEST EXTREME 2021 SUMMERエピック・ゲームズ・ジャパン Epic Games Japan
 
SAMURAI JACK開発事例:海外むけアクションゲームをオーソドックスに作ってみた UNREAL FEST EXTREME 2021 SUMMER
SAMURAI JACK開発事例:海外むけアクションゲームをオーソドックスに作ってみた UNREAL FEST EXTREME 2021 SUMMERSAMURAI JACK開発事例:海外むけアクションゲームをオーソドックスに作ってみた UNREAL FEST EXTREME 2021 SUMMER
SAMURAI JACK開発事例:海外むけアクションゲームをオーソドックスに作ってみた UNREAL FEST EXTREME 2021 SUMMERエピック・ゲームズ・ジャパン Epic Games Japan
 
『ガールズ&パンツァー 最終章』第3話 アニメとゲームエンジンの融合(ジャングル完結編) UNREAL FEST EXTREME 2021 SUMMER
『ガールズ&パンツァー 最終章』第3話 アニメとゲームエンジンの融合(ジャングル完結編)  UNREAL FEST EXTREME 2021 SUMMER『ガールズ&パンツァー 最終章』第3話 アニメとゲームエンジンの融合(ジャングル完結編)  UNREAL FEST EXTREME 2021 SUMMER
『ガールズ&パンツァー 最終章』第3話 アニメとゲームエンジンの融合(ジャングル完結編) UNREAL FEST EXTREME 2021 SUMMERエピック・ゲームズ・ジャパン Epic Games Japan
 

More from エピック・ゲームズ・ジャパン Epic Games Japan (20)

初心者向け UE4 映像制作での シーケンサー と Movie Render Queue の使い方
初心者向け UE4 映像制作での シーケンサー と Movie Render Queue の使い方初心者向け UE4 映像制作での シーケンサー と Movie Render Queue の使い方
初心者向け UE4 映像制作での シーケンサー と Movie Render Queue の使い方
 
猫でも分かるUE4を使った VRコンテンツ開発 超入門編 2021
猫でも分かるUE4を使った VRコンテンツ開発 超入門編 2021猫でも分かるUE4を使った VRコンテンツ開発 超入門編 2021
猫でも分かるUE4を使った VRコンテンツ開発 超入門編 2021
 
Unreal Engine 5 早期アクセスの注目機能総おさらい Part 2
Unreal Engine 5 早期アクセスの注目機能総おさらい Part 2Unreal Engine 5 早期アクセスの注目機能総おさらい Part 2
Unreal Engine 5 早期アクセスの注目機能総おさらい Part 2
 
Unreal Engine 4.27 ノンゲーム向け新機能まとめ
Unreal Engine 4.27 ノンゲーム向け新機能まとめUnreal Engine 4.27 ノンゲーム向け新機能まとめ
Unreal Engine 4.27 ノンゲーム向け新機能まとめ
 
Unreal Engine 5 早期アクセスの注目機能総おさらい Part 1
Unreal Engine 5 早期アクセスの注目機能総おさらい Part 1Unreal Engine 5 早期アクセスの注目機能総おさらい Part 1
Unreal Engine 5 早期アクセスの注目機能総おさらい Part 1
 
UE4 Hair & Groomでのリアルタイムファーレンダリング (UE4 Character Art Dive Online)
UE4 Hair & Groomでのリアルタイムファーレンダリング (UE4 Character Art Dive Online)UE4 Hair & Groomでのリアルタイムファーレンダリング (UE4 Character Art Dive Online)
UE4 Hair & Groomでのリアルタイムファーレンダリング (UE4 Character Art Dive Online)
 
Hair Groom入門 (UE4 Character Art Dive Online)
Hair Groom入門 (UE4 Character Art Dive Online)Hair Groom入門 (UE4 Character Art Dive Online)
Hair Groom入門 (UE4 Character Art Dive Online)
 
UE4で”MetaHumanを使わずに”耳なし芳一になる10の方法 | UE4 Character Art Dive Online
UE4で”MetaHumanを使わずに”耳なし芳一になる10の方法 | UE4 Character Art Dive OnlineUE4で”MetaHumanを使わずに”耳なし芳一になる10の方法 | UE4 Character Art Dive Online
UE4で”MetaHumanを使わずに”耳なし芳一になる10の方法 | UE4 Character Art Dive Online
 
『バランワンダーワールド』でのマルチプラットフォーム対応について UNREAL FEST EXTREME 2021 SUMMER
『バランワンダーワールド』でのマルチプラットフォーム対応について  UNREAL FEST EXTREME 2021 SUMMER『バランワンダーワールド』でのマルチプラットフォーム対応について  UNREAL FEST EXTREME 2021 SUMMER
『バランワンダーワールド』でのマルチプラットフォーム対応について UNREAL FEST EXTREME 2021 SUMMER
 
Visual Dataprepで建築データを美味しく下ごしらえ UNREAL FEST EXTREME 2021 SUMMER
Visual Dataprepで建築データを美味しく下ごしらえ UNREAL FEST EXTREME 2021 SUMMERVisual Dataprepで建築データを美味しく下ごしらえ UNREAL FEST EXTREME 2021 SUMMER
Visual Dataprepで建築データを美味しく下ごしらえ UNREAL FEST EXTREME 2021 SUMMER
 
Unreal Engineでのコンフィギュレーター制作と映像制作 UNREAL FEST EXTREME 2021 SUMMER
Unreal Engineでのコンフィギュレーター制作と映像制作  UNREAL FEST EXTREME 2021 SUMMERUnreal Engineでのコンフィギュレーター制作と映像制作  UNREAL FEST EXTREME 2021 SUMMER
Unreal Engineでのコンフィギュレーター制作と映像制作 UNREAL FEST EXTREME 2021 SUMMER
 
バレンシアガ『Afterworld: The Age of Tomorrow』の舞台裏 UNREAL FEST EXTREME 2021 SUMMER
バレンシアガ『Afterworld: The Age of Tomorrow』の舞台裏  UNREAL FEST EXTREME 2021 SUMMERバレンシアガ『Afterworld: The Age of Tomorrow』の舞台裏  UNREAL FEST EXTREME 2021 SUMMER
バレンシアガ『Afterworld: The Age of Tomorrow』の舞台裏 UNREAL FEST EXTREME 2021 SUMMER
 
『FINAL FANTASY VII REMAKE』におけるプロファイリングと最適化事例 UNREAL FEST EXTREME 2021 SUMMER
『FINAL FANTASY VII REMAKE』におけるプロファイリングと最適化事例 UNREAL FEST EXTREME 2021 SUMMER『FINAL FANTASY VII REMAKE』におけるプロファイリングと最適化事例 UNREAL FEST EXTREME 2021 SUMMER
『FINAL FANTASY VII REMAKE』におけるプロファイリングと最適化事例 UNREAL FEST EXTREME 2021 SUMMER
 
SAMURAI JACK開発事例:海外むけアクションゲームをオーソドックスに作ってみた UNREAL FEST EXTREME 2021 SUMMER
SAMURAI JACK開発事例:海外むけアクションゲームをオーソドックスに作ってみた UNREAL FEST EXTREME 2021 SUMMERSAMURAI JACK開発事例:海外むけアクションゲームをオーソドックスに作ってみた UNREAL FEST EXTREME 2021 SUMMER
SAMURAI JACK開発事例:海外むけアクションゲームをオーソドックスに作ってみた UNREAL FEST EXTREME 2021 SUMMER
 
『ガールズ&パンツァー 最終章』第3話 アニメとゲームエンジンの融合(ジャングル完結編) UNREAL FEST EXTREME 2021 SUMMER
『ガールズ&パンツァー 最終章』第3話 アニメとゲームエンジンの融合(ジャングル完結編)  UNREAL FEST EXTREME 2021 SUMMER『ガールズ&パンツァー 最終章』第3話 アニメとゲームエンジンの融合(ジャングル完結編)  UNREAL FEST EXTREME 2021 SUMMER
『ガールズ&パンツァー 最終章』第3話 アニメとゲームエンジンの融合(ジャングル完結編) UNREAL FEST EXTREME 2021 SUMMER
 
UE4を使用したバーチャルヒューマンの映像制作 UNREAL FEST EXTREME 2021 SUMMER
UE4を使用したバーチャルヒューマンの映像制作  UNREAL FEST EXTREME 2021 SUMMERUE4を使用したバーチャルヒューマンの映像制作  UNREAL FEST EXTREME 2021 SUMMER
UE4を使用したバーチャルヒューマンの映像制作 UNREAL FEST EXTREME 2021 SUMMER
 
オンラインで同期した100体の巨大生物から地球を衛る方法 UNREAL FEST EXTREME 2021 SUMMER
オンラインで同期した100体の巨大生物から地球を衛る方法  UNREAL FEST EXTREME 2021 SUMMERオンラインで同期した100体の巨大生物から地球を衛る方法  UNREAL FEST EXTREME 2021 SUMMER
オンラインで同期した100体の巨大生物から地球を衛る方法 UNREAL FEST EXTREME 2021 SUMMER
 
MetaHumanサンプル解体新書 UNREAL FEST EXTREME 2021 SUMMER
MetaHumanサンプル解体新書  UNREAL FEST EXTREME 2021 SUMMERMetaHumanサンプル解体新書  UNREAL FEST EXTREME 2021 SUMMER
MetaHumanサンプル解体新書 UNREAL FEST EXTREME 2021 SUMMER
 
Twinmotion 2021とAEC分野向けソリューションのご紹介
Twinmotion 2021とAEC分野向けソリューションのご紹介Twinmotion 2021とAEC分野向けソリューションのご紹介
Twinmotion 2021とAEC分野向けソリューションのご紹介
 
UE4.26 レンダリング新機能(CEDEC+KYUSHU 2020)
UE4.26 レンダリング新機能(CEDEC+KYUSHU 2020)UE4.26 レンダリング新機能(CEDEC+KYUSHU 2020)
UE4.26 レンダリング新機能(CEDEC+KYUSHU 2020)
 

[GTMF2019] Python / BlueprintによるUnreal Engineの自動化