Python スクリプティング は Sequencer でのコントロールリグのアニメーション化のさまざまな部分を自動化および制御するために使用することができます。このドキュメントでは、コントロール リグ、アニメーション モード、その他のアニメーション ワークフローで 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()
Set Control Value を取得する
次のコマンドを使用して、任意のフレーム番号の任意のコントロールから特定の値を取得できます。
# シーケンサーのコントロール リグを取得し、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 に移動しましょうLet's move the space key from frame 30 to frame 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)
スペース キー フレームはこれらのコマンドを使用sひて削除することができます。
# シーケンサーのコントロール リグを取得し、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 に
# あると想定しましょう。空間のキーをフレーム 30 から 45 に移動しましょうLet's remove the space key from frame 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)
ベイクとマージ
コントロール リグへベイクする
シーケンサーのアクタに既にアニメーション シーケンスがある場合は、現在のアニメーションをコントロール リグにベイク処理することで、コントロール リグ トラックを作成できます。そのためには次のコマンドを使用します。
# 現在のエディタ レベルを取得する
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)
アニメーション シーケンスへベイクする
コントロールリグ アニメーションが完了したら、次のコマンドを使用して、アニメーションをアニメーション シーケンスとしてエクスポートし、UnrealEngine の他の領域で使用できます。
# 現在のレベル シーケンスを取得する
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)
アニメーション レイヤーをマージする
コントロールリグ トラック内で複数のセクションとレイヤーを使用している場合は、次の折りたたみコマンドを使用して、アニメーションをベイク処理して 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)