ブループリントからLevelSeqeuencerへオブジェクトを追加する

最近、Unrealengine4.26でブループリントでSeqeuence周りをさわっているのですが、非常に出来る事が増えていました。
しかし、ドキュメントは少なく、手探りで検証を進めた内容をメモとして残しておきます。
作成したブループリントは、**<font color="Red">エディタユーティリティウィジェット</font>**で実行しています。


# 環境
バージョン : Unrealengine4.26

# オブジェクトをLevelSeqeuencerに配置する
ノード説明用のブループリントです。
![サンプルAブループリント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/449ae896-32ae-d7cc-107b-020ff97d4d6f.png)

実行結果です。ブループリント(BP_A)とスケルタルメッシュ(FbxSphere)が追加されます。
![実行結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/c37065d9-ca3c-4729-849a-b33f05e13078.png)


## ノードの説明
- GetCurrentLevelSeqeuenceノード

SequenceEditorで開いているLevelSeqeuencerを取得できます。
当然ですが、LevelSeqeuencerが開かれていない場合は、IsValidが通りません。

![GetCurrentLevelSeqeuence.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/3561f0a7-4152-8872-6378-c53c02252bfb.png)

- AddSpawnablefromClassノード

ブループリントをLevelSeqeuencerにBindできます。

![AddSpawnableFromClass.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/6c37175c-e246-223a-f224-68b32ef8c6a8.png)

- AddSpawnablefromInstanceノード

スケルタルメッシュやスタティックメッシュなどのオブジェクトをLevelSeqeuencerにBindできます。

![AddSpawnableFromInstance.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/2d87bca8-fbf4-172a-9be3-3d5207ca9bc5.png)

- RefreshCurrentLevelSeqeuenceノード

SequenceEditorで開いているLevelSeqeuencerに更新をかけます。
こちらのノードを呼び出さない場合には、SequenceEditorに更新がかからず、LevelSeqeuencerを開き直す必要があります。

![RefreshCurrentLevelSeqeuence.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/20f0cc57-8eec-82ec-d51f-a63a13b26876.png)


- SaveLoadedAssetノード

アセットを保存する事ができます。
サンプルノードの上の例だと、このノードが入っていない為、LevelSeqeuencerは保存されていない状態になっていると思います。
OnlyifisDirtyは、Dirty状態(アスタリスクが付いている)になっているアセットだけを保存するかのフラグとなります。

![SaveLoadedAsset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/7dee105b-477d-95c9-17ca-78a73a84cb74.png)


# LevelSeqeuencerにフォルダを追加する
フォルダとその中にオブジェクトを追加しています。
ブループリントの流れとしては、ルートにフォルダを作成し、各オブジェクトをスポーンし、AddChildPbjectBindingノードを呼んでフォルダに関連付けます。

![同じ階層にオブジェクトを追加する_ブループリントの例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/27f009d1-42ab-9c0f-a1ac-c0cdf5f170e6.png)

結果として、以下のようになります。
![同じ階層にオブジェクトを追加する_実行結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/48382867-c8e5-e4d8-0167-e3cfffbd2358.png)

## ノードの説明
- AddRootFolderToSeqeuenceノード

Sequencerにフォルダを追加します。NewFolderNameは、追加するフォルダ名です。
このノードで返ってくるのは、[UMovieSceneFolder](https://docs.unrealengine.com/en-US/API/Runtime/MovieScene/UMovieSceneFolder/index.html)になります。

![AddRootFolderToSeqeuenceノード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/4df8dbb8-1fad-b060-7a20-29a23fda1aaf.png)

- AddChildObjectBindingノード

AddRootFolderToSeqeuenceノードで追加したフォルダに、オブジェクトを関連付けます。
AddRootFolderToSeqeuenceノードから返されるUMovieSceneFolderを第一引数にすれば、いくつでも同じ階層に置けます。


![AddChildObjectBindingノード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/0aef04c1-1026-5da4-e813-88521353f8ed.png)




# LevelSeqeuencerに配置したオブジェクトに親子付けする
オブジェクトにフォルダを追加するトラックサンプルです。
親子付けするには、[UMovieScene3DAttachTrack](https://docs.unrealengine.com/en-US/API/Runtime/MovieSceneTracks/Tracks/UMovieScene3DAttachTrack/index.html)と[UMovieScene3DAttachSection](https://docs.unrealengine.com/en-US/API/Runtime/MovieSceneTracks/Sections/UMovieScene3DAttachSection/index.html)を使用します。
既に紹介したフォルダは、例外ですが、Sequencerに追加されるオブジェクトは、トラックとセクションを持っています。
トラックの中にセクションがあり、必ず二つとも必要になります。
トラックとセクションは、4.26だけでも多くの種類がブループリントで実装されていますが、必要なプロパティへのアクセスが出来なかったり、セクションに渡す構造体がブループリントからはアクセス出来いない部分もあり、PythonやC++で扱うケースがまだ多いようです。
このサンプルでは、C++でフォローしています。

![親子付けする_ブループリントの例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/29ea10e2-8849-42eb-977e-2082f7bd6a8c.png)

結果として以下のようになります。
![親子付けする_実行結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/8226f525-7986-7ff2-58e2-b598c66294dd.png)

## ノードの説明
キャストノードの説明は省略します。

- MakeBindingIDノード

Sequencerに追加する為のBindingIDを作成します。ここで帰って来るのは、[FMovieSceneObjectBindingID](https://docs.unrealengine.com/en-US/API/Runtime/MovieScene/FMovieSceneObjectBindingID/index.html)になります。

![MakeBindingIDノード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/c12650a6-0fd8-0814-0300-093683762e00.png)

- AddTrack & AddSectionノード

AddTrackは、任意のトラックを追加します。今回は使用していませんが、AddSectionも紹介します。
AddSectionも任意のセクションを追加します。ただ、AddTrackで帰ってきたUMovieSceneTrackをそのまま繋ぐため、引数を気にする必要はありません。
AddSectionが実行されれば、トラックに対応したセクションが追加されるようです。

![AddTrack_AddSection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/142f14c7-0460-e286-6561-f2d07402eb24.png)

- AddConstraintノード

C++で実装が必要だった部分になります。
このノードは、[UMovieScene3DConstraintTrack](https://docs.unrealengine.com/en-US/API/Runtime/MovieSceneTracks/Tracks/UMovieScene3DConstraintTrack/index.html)の[AddConstraint](https://docs.unrealengine.com/en-US/API/Runtime/MovieSceneTracks/Tracks/UMovieScene3DConstraintTrack/AddConstraint/index.html)を呼び出しています。
引数は、AddConstraintを実行する為のものです。
ブループリントから、ConstraintBindingIDをUMovieScene3DAttachSectionに渡す方法は、実装されておらず、C++を使用しています。
AddSectionノードを使用していない理由は、**<font color="Red">AddConstraintで、AddSectionが実行される為</font>**です。

![AddConstraitノード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/90be1408-92dc-27e6-1f70-6648c4cad651.png)


UMovieScene3DAttachSectionにブループリントからでもアクセス可能な、AttachSocketNameとAttachComponentNameとConstraintBindingIDのセッターが用意されている為、ブループリントで完結するように見えますが現バージョンでは、**<font color="Red">SetConstraintBindingIDは正しく動作しない為</font>**、ConstraintBindingIDを別の方法で渡せれば実現可能かもしれません。

![親子付けする_ブループリントの例_ノード紹介.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/0890ecd5-9ca7-9a27-ef33-44a47c74a23e.png)


- SetRangeノード

SetRangeは、セクションの範囲を決めます。UMovieSceneSectionで実装されている為、UMovieScene3DAttachSectionに限らず、どのセクションでも使用します。

![SetRangeノード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/2e8ee87b-af79-c8b0-00a5-13e21f6a2d60.png)

SetRangeは、この範囲を設定する為のものです。

![SetRange説明.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/6411eead-e85b-5f64-cd33-9ce171066525.png)


- FrameNumberノード

FrameNumberは、Seqeuencer系の動作で主に使用されています。

![FrameNumberノード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/ce7d9fbc-4a50-7c2a-fd34-67d06ccf6b31.png)


以上となります。
C++からのフォローがいるとは言え、ブループリントで完結する部分も増えてきました。
今後のバージョンアップに期待です。