UE5でのPython Editor Scripting
Python APIでエディター要素を操作できる
5.3あたりからベータ展開
ドキュメントが乏しい(というか不親切)のでAIのアシストでギリ書ける
Python Editor Script Pluginを有効化し、 tool > Run Puthon Scriptなどでファイル実行できる
エディターコンソールからも実行でききる
例)
SequencerのトラックをCSVの値から1フレームずつキーフレーム入力する
関数による値出力を柔軟にできるようにする
エグいタイムライン編集をなるべく効率化する目的
code:python
import unreal
# シーケンサーアセットをロード
sequence_path = "/Game/SEQ_Test"
sequence = unreal.load_asset(sequence_path)
# ポイントライトのバインディングを見つける
# ここではポイントライトのオブジェクト名を指定する必要があります
light_name = "PointLight" # 実際のライト名に変更してください
light_binding = None
# シーケンス内のすべてのバインディングをチェック
for binding in sequence.get_bindings():
bound_object = binding.get_possessed_object_class()
if bound_object and light_name in str(binding.get_display_name()):
light_binding = binding
break
if not light_binding:
print(f"ライト '{light_name}' が見つかりませんでした")
# 別の方法: シーンのポイントライトを取得して手動でバインディングを検索
else:
# インテンシティトラックを探す
intensity_track = None
# 親バインディングの直接のトラックをチェック
for track in light_binding.get_tracks():
track_name = str(track.get_display_name())
print(f" トラック見つかりました: {track_name} ({track.__class__.__name__})")
if "Intensity" in track_name:
intensity_track = track
print(f" インテンシティトラックが見つかりました!")
break
# チャイルドバインディングをチェック
if not intensity_track:
print("子バインディングをチェックします...")
for child_binding in light_binding.get_child_possessables():
child_name = str(child_binding.get_display_name())
print(f"子バインディング: {child_name}")
# この子バインディングが「LightComponent」を含むかチェック
if "LightComponent" in child_name:
print(f" ライトコンポーネントのバインディングが見つかりました: {child_name}")
# この子バインディングのトラックをチェック
for track in child_binding.get_tracks():
track_name = str(track.get_display_name())
print(f" トラック: {track_name} ({track.__class__.__name__})")
if "Intensity" in track_name:
intensity_track = track
print(f" インテンシティトラックが見つかりました!")
break
if intensity_track:
break
if intensity_track and len(intensity_track.get_sections()) > 0:
section = intensity_track.get_sections()0 # CSVデータを読み込む
csv_file_path = "/path/to/data.csv"
with open(csv_file_path, 'r') as file:
import csv
csv_reader = csv.reader(file)
next(csv_reader) # ヘッダーをスキップ(必要な場合)
# チャンネルを取得
channels = section.get_all_channels()
if len(channels) > 0:
float_channel = channels0 for row in csv_reader:
frame = int(row0) # フレーム番号 # キーを追加
frame_number = unreal.FrameNumber(frame)
float_channel.add_key(frame_number, value)
print("キーフレームの追加が完了しました")
else:
print("チャンネルが見つかりませんでした")
パッと見、トラックの指定までがあまりに力技の検索、冗長。
IDやパス指定などができると早い
Trackが見つかったあとにもtrack > section > channelとたどる必要がある
World Outlinerへのプロシージャルな配置
やりたい