Python スクリプティング を使用して、シーケンサー のさまざまな部分を自動化して制御できます。このドキュメントでは、シーケンサーで Python を使用する主な方法の概要を、汎用的なシーケンサー スクリプトの例とともに説明します。
前提条件
-
Unreal Engine での Python スクリプティング の経験がある。
-
シーケンサー の使用方法について理解している。
シーケンサーでの Python 用語
シーケンサーでは次の用語が使用されます。
シーケンサーでの Python 用語 | 説明 |
---|---|
World (ワールド) | アクタとコンポーネントが存在し、それらをレンダリングすることができるマップを表すオブジェクトで、Level (レベル) とも呼ばれます。 |
LevelSequence (レベル シーケンス) | シネマティクス シーンのコンテナであるアセットで、Sequence (シーケンス) とも呼ばれます。レベル シーケンスには、さまざまなオブジェクトにバインドしてそれらをアニメートできるデータとトラックが含まれます。 |
MovieSceneBindingProxy | レベル シーケンスによってバインドされているアクタまたはコンポーネントを定義する構造体で、Binding (バインディング) とも呼ばれます。 |
Possessable (所有可能) | アニメート可能なあらゆるプロパティをレベル シーケンスで所有することができるレベル内に存在するアクタ、またはコンポーネントを表すバインディングのタイプです。 |
Spawnable (スポーン可能) | シーケンスの再生中のみに 存在するアクタまたはコンポーネントを表すバインディングのタイプです。 |
MovieSceneTrack (ムービー シーン トラック) | バインディング (MovieSceneBindingProxy) の下位に位置するオブジェクトで、特定タイプのプロパティに対する編集のすべてのセクションが含まれます。たとえば、MovieScene3DTransformTrack > Actor / Component Transform です。 |
MovieSceneSection (ムービー シーン セクション) | トラック (MovieSceneTrack) の下位に位置するオブジェクトで、特定タイプのプロパティのすべてのチャンネル、長さ、パラメータが含まれます。たとえば、MovieScene3DTransformSection > Pre / Post Roll、When Finished State、Active/Muted、Additive です。 |
MovieSceneScriptingChannel (ムービー シーン スクリプティング チャンネル) | セクション (MovieSceneSection) の下位に位置するオブジェクトで、特定タイプのプロパティまたはサブプロパティをアニメートするすべてのキーフレームが含まれます。たとえば、MovieSceneScriptingFloatChannel > Location.X です。 |
MovieSceneScriptingKey (ムービー シーン スクリプティング キー) | 特定タイプのチャンネルでキーフレームを表すオブジェクトです。たとえば、MovieSceneScriptingFloatKey です。 |
FrameNumber (フレーム番号) | フレームを表す構造体です。 |
FrameRate (フレーム レート) | フレームと秒を定義する 2 つの整数値の割合を表す構造体です。たとえば、1 秒あたり 30 フレームは 30/1 と表現されます。 |
レベル シーケンスにアクセスする
シーケンサーでの Python スクリプティングを行うには、最初に、これから最も頻繁にやり取りする主要なオブジェクトである LevelSequence にアクセスします。状況に応じて、これを行う方法がいくつかあります。
シンプルなアクセス
コンテンツ ブラウザ 内に存在するレベル シーケンスにアクセスするには、次のサンプル スクリプトを使用できます。目的のシーケンスは現在開かれている必要はなく、現在のレベル内に存在している必要もありません。このスクリプトでは、レベル シーケンス アセットがルート コンテンツ フォルダに含まれていることを想定しています。
import unreal
# レベル シーケンス アセットを取得する
level_sequence = unreal.load_asset("/Game/LevelSequenceName")
# 次にそれをシーケンサーで開く
unreal.LevelSequenceEditorBlueprintLibrary.open_level_sequence(level_sequence)
現在のレベル シーケンスにアクセスする
現在開かれているレベル シーケンスにアクセスするには、次のスクリプトを使用できます。
import unreal
# 現在開かれているレベル シーケンスを取得する
level_sequence = unreal.LevelSequenceEditorBlueprintLibrary.get_current_level_sequence()
レベル シーケンスを作成して開く
新しいレベル シーケンス アセットを作成して開くには、次のスクリプトを使用できます。
import unreal
# アセット ツールを取得する
asset_tools = unreal.AssetToolsHelpers.get_asset_tools()
# ルート コンテンツ フォルダに LevelSequenceName という名前のレベル シーケンスを作成する
level_sequence = unreal.AssetTools.create_asset(asset_tools, asset_name = "LevelSequenceName", package_path = "/Game/", asset_class = unreal.LevelSequence, factory = unreal.LevelSequenceFactoryNew())
現在表示されているレベル シーケンスを取得および設定する
シーケンサーでフォーカスのあるレベル シーケンスを取得、設定するには、以下のスクリプトを使用します。
# フォーカスのある現在のレベル シーケンスを取得する
focused_level_seqeunce = unreal.LevelSequenceEditorBlueprintLibrary.get_focused_level_sequence()
また、フォーカスするサブ シーケンス セクションを指定することで、特定のサブ シーケンスにフォーカスすることも可能です。
# 最初のサブ シーケンス トラックを取得し、レベル シーケンスから最初のセクションを取得する
sub_sequence_track = level_sequence.find_master_tracks_by_type(unreal.MovieSceneSubTrack)[0]
sub_sequence_section = sub_sequence_track.get_sections()[0]
# フォーカスのある現在のレベル シーケンスを設定する
unreal.LevelSequenceEditorBlueprintLibrary.focus_level_sequence(sub_sequence_section)
親シーケンスにフォーカスを戻すには、次のコマンドを実行します。
unreal.LevelSequenceEditorBlueprintLibrary.focus_parent_sequence()
レベル シーケンスをクエリして編集する
Python でレベル シーケンスにアクセスしたら、変更を加えることができます。シーケンスに対してはさまざまな方法で影響を及ぼすことができますが、その一部の例を以下に示します。
フレーム レートを変更する
レベル シーケンスは、デフォルトで 30 フレーム/秒 (fps) で再生されます。この再生レートを変更するには、次のコマンドを使用できます。
# フレーム レート オブジェクトを作成し、希望する fps 番号に設定する
frame_rate = unreal.FrameRate(numerator = 60, denominator = 1)
# 表示速度を設定する
level_sequence.set_display_rate(frame_rate)
開始時間と終了時間を変更する
デフォルトでは、シーケンスの再生範囲の開始はフレーム 0 に、終了はフレーム 150 に設定されています (30fps のフレーム レートを想定)。次のコマンドを使用して、開始フレームと終了フレームの両方を調整できます。
# 再生範囲を 20-200 に設定する
level_sequence.set_playback_start(20)
level_sequence.set_playback_end(200)
アクタを追加する
現在のレベルからアクタを追加して、これをシーケンサーで所有させるには、次のコマンドを使用します。
# アクタおよびレベル シーケンス エディタのサブシステムを取得する
actor_system = unreal.get_editor_subsystem(unreal.EditorActorSubsystem)
ls_system = unreal.get_editor_subsystem(unreal.LevelSequenceEditorSubsystem)
# 選択されたアクタを現在のレベル シーケンスに所有可能オブジェクトとして追加する
actors = actor_system.get_selected_level_actors()
bindings = ls_system.add_actors(actors)
Python スクリプトでカメラ オブジェクトを追加するには、シーケンサー UI での処理を模倣して、次のコマンドを使用します。
# レベル シーケンス エディタ サブシステムを取得する
ls_system = unreal.get_editor_subsystem(unreal.LevelSequenceEditorSubsystem)
# カメラ カット トラックを使用し、スポーン可能なカメラ アクタ バインディングを追加する
camera = ls_system.create_camera(spawnable = True)
レベルからの現在のアクタを所有する代わりに、シーケンス期間中での使用に向けて python を使用してアクタを新しく スポーン することができます。前述の LevelSequenceEditorSubsystem の add_actors を使い、まずコマンドでアクタを所有可能にしてから、スポーン可能なオブジェクトに変換することが可能です。次の各コマンドを使用して、スポーン可能なものをシーケンスに追加します。
# アクタおよびレベル シーケンス エディタのサブシステムを取得する
actor_system = unreal.get_editor_subsystem(unreal.EditorActorSubsystem)
ls_system = unreal.get_editor_subsystem(unreal.LevelSequenceEditorSubsystem)
# 選択されたアクタを現在のレベル シーケンスに所有可能オブジェクトとして追加する
actors = actor_system.get_selected_level_actors()
bindings = ls_system.add_actors(actors)
# すべての追加されたバインディングをループする
バインディングの場合
# スポーン可能に変換
ls_system.convert_to_spawnable(binding)
必要に応じて、LevelSequenceEditorSubsystem を使用して、以下のコマンドでスポーン可能から所有可能に戻すことができます。
ls_system = unreal.get_editor_subsystem(unreal.LevelSequenceEditorSubsystem)
selected_bindings = unreal.LevelSequenceEditorBlueprintLibrary.get_selected_bindings()
selected_bindings のバインディングの場合
ls_system.convert_to_possessable(binding)
トラックとセクションを作成する
Python スクリプティングを使って トラック と セクション を追加することもできます。それぞれのトラック タイプはセクション タイプを示します。次に例を挙げます。
-
トランスフォーム トラック が
unreal.MovieScene3DTransformTrack
として定義され、そのセクションではunreal.MovieScene3DTransformSection
を使用します。 -
スケルタルメッシュ アニメーション トラック が
unreal.MovieSceneSkeletalAnimationTrack
として定義され、そのセクションではunreal.MovieSceneSkeletalAnimationSection
を使用します。
トラックとセクションを追加するには、次のコマンドを使用します。
# バインディングを使用し、シーケンサーにトラックを追加する - トラック タイプ別に指定
transform_track = actor_binding.add_track(unreal.MovieScene3DTransformTrack)
anim_track = actor_binding.add_track(unreal.MovieSceneSkeletalAnimationTrack)
# 範囲、パラメータ、またはプロパティを操作できるようにトラックにセクションを追加する
transform_section = transform_track.add_section()
anim_section = anim_track.add_section()
# レベル シーケンスの開始フレームと終了フレームを取得する
start_frame = level_sequence.get_playback_start()
end_frame = level_sequence.get_playback_end()
# レベル シーケンスの開始フレームと終了フレームにセクション範囲を設定する
transform_section.set_range(start_frame, end_frame)
anim_section.set_range(start_frame, end_frame)
# 追加された新しいトラックおよびセクションを視覚的に表示するためにリフレッシュする
unreal.LevelSequenceEditorBlueprintLibrary.refresh_current_level_sequence()
一部のセクションでは、使用するためにプロパティの定義が必要な場合があります。たとえば、アニメーション トラック セクションではアニメーション アセットを定義する必要があります。これを行うには、次のコマンドを使用します。
# アニメーション シーケンス アセットを取得する
anim_seq = unreal.load_asset("/Game/Mannequin/Animations/ThirdPersonWalk")
# セクションを取得し、パラメータを取得し、アニメーションをアニメーション シーケンス アセットに設定する
anim_section.params.animation = anim_seq
コマンドをコピーおよびペーストする
また、Objects、Tracks、Section、Folder はすべて Python スクリプトを使用して、以下のコピー アンド ペースト機能で整理および管理することが可能です。
フォルダ
ls_system = unreal.get_editor_subsystem(unreal.LevelSequenceEditorSubsystem)
selected_folders = unreal.LevelSequenceEditorBlueprintLibrary.get_selected_folders()
level_sequence = unreal.LevelSequenceEditorBlueprintLibrary.get_current_level_sequence()
# クリップボードに追加を行い、ペーストするために入力できるテキストを返す
ls_system.copy_folders(selected_folders)
# パラメータを作成し、このペースト先となる場所を決定する
# ここでは、コピー元と同じレベル シーケンスにペーストする
paste_params = unreal.MovieScenePasteFoldersParams()
paste_params.sequence = level_sequence
paste_params.parent_folder = None
# 文字列が空の場合はクリップボードを確認する。ただし、copy_bindings から返されるテキストを入力することもできる
ls_system.paste_folders("", paste_params)
バインディング
ls_system = unreal.get_editor_subsystem(unreal.LevelSequenceEditorSubsystem)
selected_bindings = unreal.LevelSequenceEditorBlueprintLibrary.get_selected_bindings()
# クリップボードに追加を行い、ペーストするために入力できるテキストを返す
ls_system.copy_bindings(selected_bindings)
# パラメータを作成し、このペースト先となる場所を決定する
# ここでは、コピー元と同じレベル シーケンスにペーストする
# プロパティには特定の型の配列が必要なため、空の配列をパスする必要がある
paste_params = unreal.MovieScenePasteBindingsParams()
paste_params.bindings = []
paste_params.folders = []
paste_params.parent_folder = []
# 文字列が空の場合はクリップボードを確認する。ただし、copy_bindings から返されるテキストを入力することもできる
ls_system.paste_bindings("", paste_params)
トラック
ls_system = unreal.get_editor_subsystem(unreal.LevelSequenceEditorSubsystem)
level_sequence = unreal.LevelSequenceEditorBlueprintLibrary.get_current_level_sequence()
tracks_to_copy_from = unreal.LevelSequenceEditorBlueprintLibrary.get_selected_tracks()
# 最初に選択されるバインディングは選択されたトラックからのもの
bindings_to_paste_to = unreal.LevelSequenceEditorBlueprintLibrary.get_selected_bindings()[1:]
# クリップボードに追加を行い、ペーストするために入力できるテキストを返す
ls_system.copy_tracks(tracks_to_copy_from)
# パラメータを作成し、このペースト先となる場所を決定する
# ここでは、選択されたトラックを選択されたバインディングにペーストする
# プロパティには特定の型の配列が必要なため、空の配列をパスする必要がある
paste_params = unreal.MovieScenePasteTracksParams()
paste_params.bindings = bindings_to_paste_to
paste_params.folders = []
paste_params.parent_folder = None
paste_params.sequence = level_sequence
# 文字列が空の場合はクリップボードを確認する。ただし、copy_bindings から返されるテキストを入力することもできる
ls_system.paste_tracks("", paste_params)
セクション
ls_system = unreal.get_editor_subsystem(unreal.LevelSequenceEditorSubsystem)
level_sequence = unreal.LevelSequenceEditorBlueprintLibrary.get_current_level_sequence()
# 最初に選択されたトラックからセクションを取得する
sections_to_copy_from = unreal.LevelSequenceEditorBlueprintLibrary.get_selected_tracks()[0].get_sections()
# 最初に選択されたトラックの後のトラックを取得する
tracks_to_paste_to = unreal.LevelSequenceEditorBlueprintLibrary.get_selected_tracks()[1:]
# クリップボードに追加を行い、ペーストするために入力できるテキストを返す
ls_system.copy_sections(sections_to_copy_from)
# パラメータを作成し、このペースト先となる場所を決定する
# ここでは、シーケンス開始時のコピー元と同じレベル シーケンス内にある選択されたセクションにペーストする
# プロパティには特定の型の配列が必要なため、空の配列をパスする必要がある
paste_params = unreal.MovieScenePasteSectionsParams()
paste_params.time = unreal.FrameTime()
paste_params.track_row_indices = []
paste_params.tracks = tracks_to_paste_to
# 文字列が空の場合はクリップボードを確認する。ただし、copy_bindings から返されるテキストを入力することもできる
ls_system.paste_sections("", paste_params)
トラックのフィルタリング
トラックのフィルタリング コマンドを使用することもできます。
# トラックのフィルタ名を取得し、出力する
track_filter_names = unreal.LevelSequenceEditorBlueprintLibrary.get_track_filter_names()
for track_filter_name in track_filter_names:
print(track_filter_name)
# スケルタルメッシュと選択されたコントロール リグのコントロールにトラック フィルタを設定する
unreal.LevelSequenceEditorBlueprintLibrary.set_track_filter_enabled("Skeletal Mesh", True)
unreal.LevelSequenceEditorBlueprintLibrary.set_track_filter_enabled("Selected Control Rig Controls", True)
# トラックごとのフィルタ有効化ステータスを参照する
print(unreal.LevelSequenceEditorBlueprintLibrary.is_track_filter_enabled("Event"))
print(unreal.LevelSequenceEditorBlueprintLibrary.is_track_filter_enabled("Skeletal Mesh"))
その他のシーケンサー スクリプティング リソース
全般的なシーケンサー Python スクリプティングのさらなる資料については、次のローカル エンジン パスに含まれるシーケンサー スクリプティングの例を参照してください。
…\Engine\Plugins\MovieScene\SequencerScripting\Content\Python