Python スクリプティング は、シーケンサー での コントロール リグ のアニメーション化のさまざまな部分を自動化および制御するために使用することができます。このドキュメントでは、コントロール リグ、アニメーション モード、その他のさまざまなアニメーション ワークフローで Python を使用する主な方法の概要を説明します。
前提条件
- Unreal Engine での Python スクリプティング および シーケンサーでのスクリプティング の経験があること。
- コントロール リグ の作成および使用方法を理解していること。
Control Rig トラックを作成する
Control Rig トラックの作成方法は、通常の シーケンサーでトラックを作成する 方法と若干異なります。Control Rig トラックには、作成する Control Rig クラスを定義する必要があります。Control Rig トラックを作成するには、次のコマンドを使用します。
# エディタのワールドを取得する
world = unreal.EditorLevelLibrary.get_editor_world()
# コントロール リグ アセットを取得する
rig = unreal.load_asset("/Game/Animation/ControlRig/Mannequin_ControlRig")
# リグ クラスを取得する
rig_class = rig.get_control_rig_class()
# レベル シーケンスおよびアクタのバインディングを使用すると、クラスから Control Rig トラックを見つける、または作成することができる
rig_track = unreal.ControlRigSequencerLibrary.find_or_create_control_rig_track(world,level_sequence, rig_class, actor_binding)
コントロールをアニメーション化する
次の例では、コントロールを編集およびアニメーション化するさまざまな方法について説明します。
コントロールの選択
これらのコマンドを使用して、コントロールを選択し、コントロールの選択をクエリできます。
# シーケンサーのコントロール リグを取得し、ControlRigSequencerBindingProxy のリストを返す
rig_proxies = unreal.ControlRigSequencerLibrary.get_control_rigs(level_sequence)
# Mannequin_ControlRig であることを想定し、最初のプロキシを取得する
rig_proxy = rig_proxies[0]
# ControlRigSequencerBindingProxy から ControlRig オブジェクトを取得できる
rig = rig_proxy.control_rig
# 指定されたコントロールを選択する
rig.select_control("body_ctrl")
# 現在のコントロールの選択内容を取得する
selected_controls = rig.current_control_selection()
print(selected_controls)
# コントロールの選択内容をクリアする
rig.clear_control_selection()
コントロール値を取得および設定する
次のコマンドを使用して、任意のフレーム番号の任意のコントロールから特定の値を取得できます。
# シーケンサーのコントロール リグを取得し、ControlRigSequencerBindingProxy のリストを返す
rig_proxies = unreal.ControlRigSequencerLibrary.get_control_rigs(level_sequence)
# フレーム 0 を取得する
frame_num = unreal.FrameNumber(0)
# 最初のプロキシを取得 - プロキシは Mannequin_ControlRig と想定
rig_proxy = rig_proxies[0]
# ControlRigSequencerBindingProxy から ControlRig オブジェクトを取得できる
rig = rig_proxy.control_rig
# ローカルのコントロール値を取得し、コントロールの型はそれぞれ独自の型の関数を持つようにする
transform = unreal.ControlRigSequencerLibrary.get_local_control_rig_transform(level_sequence, rig, "body_ctrl", frame_num)
bool = unreal.ControlRigSequencerLibrary.get_local_control_rig_bool(level_sequence, rig, "twist_ctrl_vis", frame_num)
print(transform)
print(bool)
次のコマンドを使用して、任意のフレーム番号で任意のコントロールに特定の値を設定することもできます。
# シーケンサーのコントロール リグを取得し、ControlRigSequencerBindingProxy のリストを返す
rig_proxies = unreal.ControlRigSequencerLibrary.get_control_rigs(level_sequence)
# 最初のプロキシを取得 - プロキシは Mannequin_ControlRig と想定
rig_proxy = rig_proxies[0]
# ControlRigSequencerBindingProxy から ControlRig オブジェクトを取得できる
rig = rig_proxy.control_rig
# 現在の時間を取得する
current_time = unreal.LevelSequenceEditorBlueprintLibrary.get_current_time()
# 現在の時間を FrameNumber オブジェクトに変換する
current_frame = unreal.FrameNumber(current_time)
# コントロールに適切な値のオブジェクトを作成する
transform_value = unreal.Transform(location=[0, 10, 20], rotation=[0,30,0], scale=[1,1,1])
bool_value = True
# ローカルのコントロール値を設定し、コントロールの型はそれぞれ独自の型の関数を持つようにする
# 型が設定された関数はそれぞれ、デフォルトでは True の set_key フラグも持つ
unreal.ControlRigSequencerLibrary.set_local_control_rig_transform(level_sequence, rig, "body_ctrl", frame_num, transform_value)
unreal.ControlRigSequencerLibrary.set_local_control_rig_bool(level_sequence, rig, "twist_ctrl_vis", frame_num, bool_value, set_key = False)
アニメーション モード
アニメーション モードのツール には、Python スクリプトの影響も反映されます。次の例が用意されています。
Tween ツール
次のコマンドは Tween ツール に使用することができます。
# -1 から 1 のトゥイーン値を設定する
# -1 は前のフレームにブレンドする
# 1 は次のフレームにブレンドする
tween_value = -1
unreal.ControlRigSequencerLibrary.tween_control_rig(level_sequence, rig, tween_value)
Snapper ツール
次のコマンドは Snapper ツール に使用することができます。ドライバ オブジェクトがアニメーション化されている場合は、ドライバ オブジェクトをアクティブ シーケンスに追加する必要があります。
# シーケンサーのコントロール リグを取得し、ControlRigSequencerBindingProxy のリストを返す
rig_proxies = unreal.ControlRigSequencerLibrary.get_control_rigs(level_sequence)
# 最初のプロキシを取得 - プロキシは Mannequin_ControlRig と想定
rig_proxy = rig_proxies[0]
# ControlRigSequencerBindingProxy から ControlRig オブジェクトを取得できる
rig = rig_proxy.control_rig
# エディタのアクタ サブシステムを取得し、アクタを追加する
editor_actor_subsystem = unreal.get_editor_subsystem(unreal.EditorActorSubsystem)
# キューブをエディタのワールドに追加し、位置を設定する
cube_mesh = unreal.load_asset("/Engine/BasicShapes/Cube")
cube_location = unreal.Vector(0, 10, 20)
cube_actor = editor_actor_subsystem.spawn_actor_from_object(cube_mesh, cube_location)
# 開始および終了フレームの範囲を設定する
start_frame = unreal.FrameNumber(0)
end_frame = unreal.FrameNumber(5)
# 親および子の ControlRigSnapperSelection オブジェクトを作成する
parent = unreal.ControlRigSnapperSelection()
children = unreal.ControlRigSnapperSelection()
# ActorForWorldTransforms オブジェクトを作成する
# キューブ アクタを親として設定する
parent_actor = unreal.ActorForWorldTransforms()
parent_actor.actor = cube_actor
# ControlRigForWorldTransforms オブジェクトを作成する
# 適切なコントロール リグを設定し、左手コントロールをコントロールとして設定する
# ここでは、複数のコントロール名を使用可能
child_control_rig = unreal.ControlRigForWorldTransforms()
child_control_rig.control_rig = rig
child_control_rig.control_names = ["hand_l_ctrl"]
# ActorForWorldTransforms オブジェクトを取得し、親 ControlRigSnapperSelection として設定する
# ControlRigForWorldTransforms オブジェクトを取得し、子 ControlRigSnapperSelection として設定する
parent.actors = [parent_actor]
children.control_rigs = [child_control_rig]
# スナップ設定を作成および設定する
snap_settings = unreal.ControlRigSnapSettings()
snap_settings.keep_offset = False
snap_settings.snap_position = True
snap_settings.snap_rotation = True
snap_settings.snap_scale = False
# 続いて、フレーム 0 から 5 のキューブに左手コントロールをスナップする
unreal.ControlRigSequencerLibrary.snap_control_rig(level_sequence, start_frame, end_frame, children, parent, snap_settings)
空間の切り替え
次のコマンドと例は、空間の切り替え に使用することができます。
空間の切り替えを開始するには、空間のキーフレームを作成する必要があります。コントロールの空間は、デフォルトの親、ワールド空間、または任意のフレーム番号での別のコントロールに設定できます。
# シーケンサーのコントロール リグを取得し、ControlRigSequencerBindingProxy のリストを返す
rig_proxies = unreal.ControlRigSequencerLibrary.get_control_rigs(level_sequence)
# 最初のプロキシを取得 - プロキシは Mannequin_ControlRig と想定
rig_proxy = rig_proxies[0]
# ControlRigSequencerBindingProxy から ControlRig オブジェクトを取得できる
rig = rig_proxy.control_rig
# 左手コントロールの空間をワールド空間のフレーム 0 に設定する
control_name = "hand_l_ctrl"
space = unreal.ControlRigSequencerLibrary.get_world_space_reference_key()
time = unreal.FrameNumber(value = 0)
unreal.ControlRigSequencerLibrary.set_control_rig_space(level_sequence, rig, control_name, space, time)
# その後、空間の切り替えをフレーム 30 で頭のコントロールに設定する
space = unreal.RigElementKey(type = unreal.RigElementType.CONTROL, name = "head_ctrl")
time = unreal.FrameNumber(value = 30)
unreal.ControlRigSequencerLibrary.set_control_rig_space(level_sequence, rig, control_name, space, time)
# 最後に、空間の切り替えをフレーム 60 でデフォルトの親に設定する
space = unreal.ControlRigSequencerLibrary.get_default_parent_key()
time = unreal.FrameNumber(value = 60)
unreal.ControlRigSequencerLibrary.set_control_rig_space(level_sequence, rig, control_name, space, time)
空間のキーフレームを作成したら、以下のコマンドを使用して任意のフレーム番号に移動可能
# シーケンサーのコントロール リグを取得し、ControlRigSequencerBindingProxy のリストを返す
rig_proxies = unreal.ControlRigSequencerLibrary.get_control_rigs(level_sequence)
# 最初のプロキシを取得 - プロキシは Mannequin_ControlRig と想定
rig_proxy = rig_proxies[0]
# ControlRigSequencerBindingProxy から ControlRig オブジェクトを取得できる
rig = rig_proxy.control_rig
# Set Space Key の例から、空間のキーは左手コントロールの 0、30、および 60 に
# あると想定しましょう。空間のキーをフレーム 30 から 45 に移動しましょう
control_name = "hand_l_ctrl"
old_time = unreal.FrameNumber(value = 30)
new_time = unreal.FrameNumber(value = 45)
unreal.ControlRigSequencerLibrary.move_control_rig_space(level_sequence, rig, control_name, old_time, new_time)
空間のキーフレームは、以下のコマンドを使用して削除可能
# シーケンサーのコントロール リグを取得し、ControlRigSequencerBindingProxy のリストを返す
rig_proxies = unreal.ControlRigSequencerLibrary.get_control_rigs(level_sequence)
# 最初のプロキシを取得 - プロキシは Mannequin_ControlRig と想定
rig_proxy = rig_proxies[0]
# ControlRigSequencerBindingProxy から ControlRig オブジェクトを取得できる
rig = rig_proxy.control_rig
# Move Space Key の例から、空間のキーは左手コントロールの 0、345、および 60 に
# あると想定しましょう。空間のキーをフレーム 45 から削除しましょう
control_name = "hand_l_ctrl"
time = unreal.FrameNumber(value = 45)
unreal.ControlRigSequencerLibrary.delete_control_rig_space(level_sequence, rig, control_name, time)
次のコマンドを使用して、最終的なアニメーションを特定の空間にベイク処理できます。
# シーケンサーのコントロール リグを取得し、ControlRigSequencerBindingProxy のリストを返す
rig_proxies = unreal.ControlRigSequencerLibrary.get_control_rigs(level_sequence)
# 最初のプロキシを取得 - プロキシは Mannequin_ControlRig と想定
rig_proxy = rig_proxies[0]
# ControlRigSequencerBindingProxy から ControlRig オブジェクトを取得できる
rig = rig_proxy.control_rig
# 選択済みのすべてのリグ コントロールを取得する
control_names = rig.current_control_selection()
# レベル シーケンスの開始および終了フレームを取得し、ベイク設定用に FrameNumber オブジェクトを設定する
start_frame_num = level_sequence.get_playback_start()
end_frame_num = level_sequence.get_playback_end()
start_frame = unreal.FrameNumber(value = start_frame_num)
end_frame = unreal.FrameNumber(value = end_frame_num)
# 空間のベイク設定を行い、デフォルトの親空間にベイクする
space_bake_settings = unreal.RigSpacePickerBakeSettings()
space_bake_settings.target_space = unreal.ControlRigSequencerLibrary.get_default_parent_key()
space_bake_settings.start_frame = start_frame
space_bake_settings.end_frame = end_frame
space_bake_settings.reduce_keys = False
space_bake_settings.tolerance = 0
unreal.ControlRigSequencerLibrary.bake_control_rig_space(level_sequence, rig, control_names, space_bake_settings)
アニメーション モードの設定
Python スクリプトを使って アニメーション モードの設定 を編集することができます。各プロパティは次の用語を使用します。
名前 | 説明 |
---|---|
bDisplayHierarchy | キャラクターにボーンを描画します。 |
bDisplayNulls | キャラクターに Null を描画します。 |
bHideManipulators | ビューポートですべてのコントロールを非表示にします。[Display Hierarchy] または [Display Nulls] をオンにしている場合、ボーンと Null も非表示にします。 |
bCoordSystemPerWidgetMode | ビューポート内でギズモ モードを変更すると座標空間が復元されます。 |
bOnlySelectRigControls | これを有効にすると、ビューポート内でコントロール リグ コントロールのみが選択可能になります。キャラクターを含む他のすべてのオブジェクトは選択できません。 |
bLocalTransformsInEachLocalSpace | オンにすると、トランスフォーム ギズモがローカル座標に設定されている場合、選択した各コントロールをそれぞれのローカル トランスフォーム空間を基準にトランスフォームします。 |
GizmoScale | ギズモ スケールを大きくまたは小さくします。 |
以下のコマンドを使用することができます。
# モード設定クラスをロードし、デフォルトのオブジェクトを取得する
ControlRigSettingsClass = unreal.load_class(None, '/Script/ControlRigEditor.ControlRigEditModeSettings')
ControlRigSettings = unreal.get_default_object(ControlRigSettingsClass)
# クエリされたデータを出力する
print(ControlRigSettings.get_editor_property('bDisplayHierarchy'))
print(ControlRigSettings.get_editor_property('bDisplayNulls'))
print(ControlRigSettings.get_editor_property(GizmoScale))
# プロパティを設定する
ControlRigSettings.set_editor_property('bDisplayHierarchy', True)
ControlRigSettings.set_editor_property('bDisplayNulls', True)
ControlRigSettings.set_editor_property('GizmoScale', 5)
ベイクとマージ
コントロール リグへベイクする
シーケンサーのアクタにすでにアニメーション シーケンスがある場合は、現在のアニメーションをコントロール リグにベイク処理することで、Control Rig トラックを作成できます。これを行うには、次のコマンドを使用します。
# 現在のエディタ レベルを取得する
editor_system = unreal.get_editor_subsystem(unreal.UnrealEditorSubsystem)
world = editor_system.get_editor_world()
# アニメーション シーケンスのエクスポート オプションを取得する
anim_seq_export_options = unreal.AnimSeqExportOption()
anim_seq_export_options.export_transforms = True
anim_seq_export_options.export_curves = True
# キーの許容範囲の番号およびキー削減のステートを取得する
tolerance = 0.01
reduce_keys = False
# コントロール リグへベイクする
unreal.ControlRigSequencerLibrary.bake_to_control_rig(world, level_sequence, rig_class, anim_seq_export_options, False, tolerance, actor_binding)
アニメーション シーケンスへベイクする
コントロール リグ アニメーションが完了したら、次のコマンドを使用して、アニメーションをアニメーション シーケンスとしてエクスポートし、Unreal Engine の他の領域で使用できます。
# 現在のレベル シーケンスを取得する
level_sequence = unreal.LevelSequenceEditorBlueprintLibrary.get_current_level_sequence()
# SK Mannequin という名前の SkeletaMeshActor バインディングを取得する
# これは、Mannequin_ControlRig をレベル エディタにドラッグした際のデフォルトの名前です
binding = level_sequence.find_binding_by_name("SK Mannequin")
# レベル エディタのワールドを取得する
editor_subsystem = unreal.get_editor_subsystem(unreal.UnrealEditorSubsystem)
world = editor_subsystem.get_editor_world()
# アニメーション シーケンスのエクスポート オプションを作成する
anim_seq_export_options = unreal.AnimSeqExportOption()
anim_seq_export_options.export_transforms = True
anim_seq_export_options.export_morph_targets = True
# アセット ツールを取得する
# 空の AnimSequence を作成する - /Game/Test_Anim
asset_tools = unreal.AssetToolsHelpers.get_asset_tools()
anim_sequence = unreal.AssetTools.create_asset(asset_tools, asset_name = "Test_Anim", package_path = "/Game/", asset_class = unreal.AnimSequence, factory = unreal.AnimSequenceFactory())
# 作成した AnimSequence へベイクする
unreal.SequencerTools.export_anim_sequence(world, level_sequence, anim_sequence, anim_seq_export_options, binding, False)
# リンクされたアニメーション シーケンスを作成する場合は、単純に最後の引数を True に変更する
unreal.SequencerTools.export_anim_sequence(world, level_sequence, anim_sequence, anim_seq_export_options, binding, True)
アニメーション レイヤーをマージする
Control Rig トラック内で複数のセクションとレイヤーを使用している場合は、次の折りたたみコマンドを使用して、アニメーションをベイク処理して 1 つのレイヤーにマージできます。
# シーケンサーのコントロール リグを取得し、ControlRigSequencerBindingProxy のリストを返す
rig_proxies = unreal.ControlRigSequencerLibrary.get_control_rigs(level_sequence)
# 最初のプロキシを取得 - プロキシは Mannequin_ControlRig と想定
rig_proxy = rig_proxies[0]
# ControlRigSequencerBindingProxy から MovieSceneControlRigParameterTrack オブジェクトを取得できる
# このトラックを使用し、トラック内のすべてのセクションを 1 つのセクションに折りたたむことができる
rig_track = rig_proxy.track
unreal.ControlRigSequencerLibrary.collapse_control_rig_anim_layers
(level_sequence, rig_track, key_reduce = False, tolerance = 0.001)