自分へのメモも兼ねて記事を起こしていきます。
今回は、レベルシーケンスのフォルダの操作について書いてきます。
実際に使用してみないと使い方が分からないノードもあった為まとめてみました。
検証環境
UnrealEngine5.3.2
フォルダを追加してその中にアクターを入れる
ここから、サンプルのノードを見つつ説明していきます。
サンプルはいずれも、Widgetで動かしています。
まずは、『レベルシーケンスにフォルダを追加してその中にアクターを入れる』事を実行した例です。
実行結果が以下のようになっています。
フォルダが一つ作成され、その中にアクターが二つ作成されています。
『SequenceActorA』『SequenceActorB』は、Actorから継承しただけのブループリントで、フォルダの中に入れる為に、用意したものです。Spawnableでインスタンス化できるならスタティックメッシュでも何でも構いません。
こちらのノードを実行すると、上の画像の結果が得られます。
ポイントになりそうなところだけ説明させていただきます。
AddRootFoldertoSequenceノード
AddRootFoldertoSequenceノードは、シーケンスにフォルダを追加します。フォルダを追加するノードは、これしかない為、追加するフォルダの個数の回数だけ呼び出す事になります。
引数の『NewFolderName』は作成するフォルダ名になります。
AddChildObjectBindingノード
AddChildObjectBindingノードは、フォルダと何らかのオブジェクトを親子するものと考えてください。フォルダに親子付けされると、そのフォルダに入れられます。
第一引数の『Folder』は、MovieSceneFolder型(UMovieSceneFolder)を引数にとります。MovieSceneFolderオブジェクトは、変数化できませんので、ブループリントで変数に入れて、保持しておくことはできません。
第二引数の『InObjectBinding』は、MovieSceneBindingProxy型(FMovieSceneBindingProxy)を取ります。
シーケンスで管理されているアクターやトラックは、MovieSceneBindingProxyを持っている為、ほとんどのオブジェクトで親子付けが可能です。
フォルダを追加してその中にサブフォルダを追加してアクターを入れる
次に、『レベルシーケンスにフォルダを追加してその中にサブフォルダを追加してアクターを入れる』事を実行した例です。
下の画像が実行結果です。
こちらのノードを実行すると、上の画像の結果が得られます。
ポイントになりそうなところだけ説明させていただきます。
AddChildFolderノード
AddChildFolderノードは、フォルダ同士を親子付けするノードです。『TargetFolder』のフォルダの中に『FoldertoAdd』のフォルダが作成されます。
AddRootFoldertoSequenceノードで必要な個数のフォルダのインスタンスを作成し、AddChildFolderノードで階層化していく感じです。
レベルシーケンスのフォルダを削除する
次に、追加した『フォルダの削除』の方法です。
こちらは、実行結果を用意していません。
サンプルノードは、以下の通りです。
ポイントになりそうなところだけ説明させていただきます。
RemoveRootFolderfromSequenceノード
RemoveRootFolderfromSequenceノードは、シーケンス内のフォルダのインスタンスを削除します。MovieSceneFolder型を引数に取る為、任意のフォルダを削除したい場合は、削除したいフォルダのMovieSceneFolder型のインスタンスを見つけてくる必要があります。
フォルダを削除については、注意点がいくつかります。
- RemoveRootFolderfromSequenceノードでフォルダを削除すると子供や孫などの下の階層のフォルダも削除される
- RemoveRootFolderfromSequenceノードで削除できるのは、フォルダ(のインスタンス)であって、中に入っているトラックやBindingオブジェクトは削除されない
※ この場合、フォルダ内のトラックやBindingオブジェクトは、シーケンスの直下に置かれてしまい残ります。実行時は、消える為、正しく動いているように見えますが、レベルシーケンスを開き直すと残っている事が確認できます。
フォルダの中で管理されているアクターの管理を外す
次に、『レベルシーケンスのフォルダの中で管理されているアクターの管理を外す』やり方の説明です。
まずは、下の画像は、『フォルダを追加してその中にサブフォルダを追加してアクターを入れる』に対して実行した結果を見てください。
これは、フォルダ内のトラックやオブジェクトを移動させるやり方です。
フォルダ内のあるトラックやオブジェクトのフォルダの管理が外れ、別のフォルダに関連させる事で、トラックの移動が実現できます。しかし、管理が外れたあと、どのフォルダにも管理されなけば、シーケンスの直下に置かれ画像もそのような結果になっています。
以下のノードを実行すれば、この結果が得られます。
ポイントになりそうなところだけ説明させていただきます。
RemoveChildObjectBindingノード
RemoveChildObjectBindingノードは、フォルダの子供のBindingオブジェクトを削除します。
上の方でも説明しましたが、レベルシーケンスからトラックやBindingオブジェクトが削除される訳ではありません。
また、もう一点気を付けて欲しい事は、ForEachLoopと相性が悪い点です。
通常ではあれば、以下のノードのように、『ForEachLoop』を使用するかと思います。
しかし、こちらの方法だと、『GetChildObjectBinding』から返されている配列が、参照になっており、RemoveChildObjectBindingノードを削除する度に、要素が減るので、最後までループが実行されません。
その為、サンプルでは、通常の『ForLoop』で回しています。
フォルダの中で管理されているアクターを削除する
ここでは、『レベルシーケンスのフォルダの中で管理されているアクターを削除する』事について説明します。
下の画像は、『フォルダを追加してその中にサブフォルダを追加してアクターを入れる』に対し実行した結果です。
以下のノードを実行すれば、この結果が得られます。
ポイントになりそうなところだけ説明させていただきます。
ポイントとしては、MovieSceneBindingProxyのRemoveを呼び出している点です。
また、Removeを呼び出すだけだと、フォルダの中のオブジェクトが削除されるだけなので、フォルダも消したい場合は、RemoveRootFolderfromSequenceノードと組み合わせで使う事になると思います。
フォルダの見つけ方
最後に特定のフォルダの見つけ方についてです。
簡単にテキストエディットに入力されたのフォルダ名が見つけられるノードを組んでみました。
基本的には、一階層ごとにループを回して階層を辿っていくような探し方になります。
全てのフォルダのリストの一覧が取れたりすれば、便利なんですが、そんな事もできる訳はなく…。
注意すべきは、シーケンスの直下のフォルダは、『GetRootFoldersinSequenceノード』で取得し、子供以降の階層については、『GetChildFoldersノード』で探していく点です。
その他
GetFolderColor / SetFolderColor
フォルダ色にアクセスするノード
GetChildTracks / RemoveChildTrack
トラックにアクセスする系のノード
C++の定義
中身を見たい方は、参考にしてください。
- UnrealEngine-5.3\Engine\Plugins\MovieScene\SequencerScripting\Source\SequencerScripting\Public\ExtensionLibraries\MovieSceneFolderExtensions.h
- UnrealEngine-5.3\Engine\Plugins\MovieScene\SequencerScripting\Source\SequencerScripting\Private\ExtensionLibraries\MovieSceneFolderExtensions.cpp