エンジニアっぽくなりたい

UnityやUnrealEngine 4などでなにか役に立ちそうなことを発信していく。

UE5 シーケンサーで自作トラックを活用する(2)~トラック追加対象制御~

前回自作トラックをひとまず作ってみました。
前回の内容では、マスタートラックとしてもどのアクターに対しても追加できる状態となっており、またそのアクターの情報を制御する方法も作っておりません。

今回はそのあたりを対応していこうと思います。

 

 

やりたいこと

前回作成したトラックに、以下のような対応を行う

  • トラックを追加できる対象を制限
  • トラックを追加した対象をトラック内で制御する

具体的には、ACharacterクラスに対してトラックを追加できるようにし、トラック内でACharacterの座標を変更させるようにしてみましょう。

 

今回は以下の記事の続きになります。

naoxgames.hatenablog.jp

 

環境

UE 5.4.4
VisualStudio 2022 17.11.1

 

作戦

前回調べたクラスを基にまたエンジンコードを眺めていた感じ、以下が参考になりそうなのでそれらを基に対応する。

  • バインド対象指定系
    • Engine\Plugins\Animation\ControlRig\Source\ControlRigEditor\Private\Sequencer\
      ControlRigParameterTrackEditor.h
    • Engine\Plugins\Animation\ControlRig\Source\ControlRigEditor\Private\Sequencer\
      ControlRigParameterTrackEditor.cpp

  • Excute内でバインド対象を操作する系
    • Engine\Plugins\Animation\ControlRig\Source\ControlRig\Public\Sequencer\
      MovieSceneControlRigParameterTemplate.h
    • Engine\Plugins\Animation\ControlRig\Source\ControlRig\Private\Sequencer\
      MovieSceneControlRigParameterTemplate.cpp

ということで今回はControlRigParameterTrackに倣って対応してみよう!

 

やってみた

先に結果を以下に記述します。

関連コミットのみはこちら

github.com

 

全体はこちら

github.com

 

 

今回の対応で、以下のようにシーケンサーのマスタートラックの追加から選択できなくなりました。

そして以下のように「ACharacter」を継承しているアクターに対してはトラックの追加が可能になっています。

 

挙動は、以下のようにキーの中にTransformの値を設定できるように項目を追加し、

 

キーが配置されているタイミングでキャラクターに処理が反映されます。

※移動はテレポート的な挙動になります。

 

という感じになりました。

以前のトラックよりもそれなりに使い物になるようになったと思います。
今回はTransformの制御にしましたが、この方法で制御するのはあまり適切ではないですね。
今回のようなTransfrom制御では、既存のTransformトラックやControlRigParameterトラックのように各パラメーターがトラックにぶら下がっていて、各パラメーターがカーブで制御できるのが望ましいです。

今後そのような対応も試して記事にしていきます。

 

対応内容

マスタートラックを封じる

「FMyEventTrackEditor::BuildAddTrackMenu」の中身を丸ごとコメントアウトしました。
この関数はシーケンサーの「+追加」ボタンから呼び出されるときの処理となっており、ここの処理によってマスタートラックとして追加できるようになります。

今回は追加できる対象を制限したいので丸ごとコメントアウトします。

 

トラック追加可能対象を指定する

「FControlRigParameterTrackEditor::BuildObjectBindingTrackMenu」に倣って「FMyEventTrackEditor::BuildObjectBindingTrackMenu」に処理を追加します。

内容はシンプルで以下を追加します。

if (!ObjectClass)
{
    return;
}
if (!ObjectClass->IsChildOf(ACharacter::StaticClass()))
{
    return;
}
「BuildObjectBindingTrackMenu」の「ObjectClass」は、トラックを追加した対象が取得でき、今回は「ACharacter」ですが、「Component」でも可能です。

これにより、「ACharacter」以外の場合はトラック追加メニューに表示されなくなります。

 

バインド対象をトラック内で制御する

今回は対象のTransformを制御するので、キーに情報を追加します。
「struct FMyMovieSceneEventParameters」に以下のように「FTransform」を追加します。

UPROPERTY(EditAnywhere)
FTransform TestTransform;

次に、「MyMovieSceneEventEvalTemplate.cpp」で「FMyEventTrackExecutionToken」(※今回名前変えてます)の「Execute」の中身を変更します。
こちらも「ControlRigParameter」関連の「FControlRigParameterExecutionToken」の「Execute」に倣って対応します。


virtual void Execute(const FMovieSceneContext& Context, const FMovieSceneEvaluationOperand& Operand, FPersistentEvaluationData& PersistentData, IMovieScenePlayer& Player) override { FMovieSceneSequenceID SequenceID = Operand.SequenceID; TArrayView<TWeakObjectPtr<>> BoundObjects = Player.FindBoundObjects(Operand); const UMovieSceneSequence* Sequence = Player.State.FindSequence(Operand.SequenceID); UObject* BoundObject = BoundObjects.Num() > 0 ? BoundObjects[0].Get() : nullptr; ACharacter* TargetCharacter = Cast<ACharacter>(BoundObject); if (TargetCharacter==nullptr) { return; } TArray<UObject*> EventContexts = Player.GetEventContexts(); for (UObject* EventContextObject : EventContexts) { if (!EventContextObject) { continue; } for (FMyMovieSceneExcuteEventData& Event : Events) { TargetCharacter->SetActorTransform(Event.Payload.Parameters.TestTransform); } } }

「IMovieScenePlayer」から「FMovieSceneEvaluationOperand」で取得できてしまうようで、お手軽ですね!

あとは前の処理同様の流れで、最後に対象の「ACharacter」に「Transform」を設定することでバインド対象の制御が行えます。

 

 

懸念点

今回の対応でトラックを追加できる対象を制限しましたが、実はシーケンサー上でコピペすると他のにトラックを設定できてしまいます。
C++でも普通に追加できちゃうので、気を付けましょう!

 

思ったこと

ということで、バインド対象の制限と制御をしてみたわけですが。
今回の対応でわりと使える幅が広がって、だいたいのことはできるようになった気がしています。

わりとエンジンのコードを参考にするだけでいろんなことが簡単にできることがわかりますね!

そういえば今回参考にしたControlRigParameterTrackでも「FMovieSceneEvalTemplate」を使った処理になっていて、ほぼ同じような処理の流れになっています。
前の記事でLegacyなのかもって心配していましたが、特に問題なく現役で使われているようなので大丈夫そうだなと感じています。

 

 

なにかあればご指摘お願いいたします!!!