307K Views
March 26, 24
スライド概要
2024年3月16日二開催された「Unreal Engine Meetup in Nagoya Season2 Vol.1」で使用した講演スライドです。
https://anurabless.connpass.com/event/308577/
講演者:
スクワッドスターズ株式会社
岡田和也
ガンホーが新しく設立する、Unreal Engine 5を使ったコンシューマ向けハイエンド開発スタジオ https://squadstars.jp/
猫でもわかるシーケンサー 自動生成 スクワッドスターズ株式会社 岡田 和也 #UENagoya
本スライドは動画を多く含むため 下記データからの閲覧を推奨いたします https://docs.google.com/presentation/d/135JogUFiouU1XgzqGKDTaC HjKAXEwV4tfWzpbezn4nw/edit?usp=sharing #UENagoya
自己紹介 スクワッドスターズ株式会社 シニアプログラマー 岡田 和也 兼 おかず( @pafuhana1213 ) 2023年10月まで Epic Games Japan で サポートエンジニアしてました 今は現職でゲーム開発中!たのちい! 仲間募集中です!ご興味のある方はぜひ! https://squadstars.jp/recruit/ #UENagoya
猫でもわかる シーケンサーの自動生成 ※ 本日の講演内容は業務で実際に使っているものではなく 個人的に学習・検証したものです #UENagoya
シーケンサー( Sequencer )とは? リアルタイムの シネマティックアニメーションツール UE4.12 ( 2016年6月 ) に正式リリース #UENagoya
シーケンサーはいいぞ レベル上のActor や 見た目 を制御できるだけでなく、 イベントなども設定することが可能!直感的で操作しやすいUIもある! #UENagoya
シーケンサーはいいぞ BPで実装したイベントを呼ぶことも可能! #UENagoya
カットシーンだけでなく、様々な用途で利用可能 - カットシーン・映像作品の制作 必殺技・スキル演出の制御 ゲーム中のギミック制御 などなど #UENagoya
シーケンサーの基本的な使い方はこちら 【初心者向け】UE5 シーケンサーと Movie Render Queue の使い方 https://www.youtube.com/watch?v=-qKSJLNLV94 UE4のシーケンサーをもっともっと使いこなそう! 最新情報・Tipsをご紹介! https://www.docswell.com/s/EpicGamesJapan/5XP4YZ-U E4_GCC19_Sequencer_LatestInfoAndTips #UENagoya
Sequencerのセットアップ大変すぎる問題 できることが沢山ある分、編集・設定作業が膨大になりがち… #UENagoya
Sequencer の物量多くなりがち問題 主な用途 - カットシーン・映像作品の制作 必殺技・スキル演出の制御 ゲーム中のギミック制御 などなど ✖ 500 大量の シーケンサーアセットが 爆誕! 3分 = 10,800フレーム #UENagoya
つらい… 人間がすべき作業じゃない… #UENagoya
そうだ! シーケンサーを自動生成しよう! #UENagoya
シーケンサーの自動生成とは? 設定ファイル や スクリプトなどから シーケンサーアセット( Level Sequence )を 自動的に生成・構築すること #UENagoya
シーケンサーの自動生成に関する事例 SCARLET NEXUS 開発事例:特徴的なカットシーンの実装および次世代機開発の道のり 【UNREAL FEST EXTREME 2021 WINTER】https://www.youtube.com/live/66q4d56FoFk?si=xlavAPa2ydHHhHIJ&t=2406 https://www.docswell.com/s/EpicGamesJapan/Z9GD15-UE4_UFE21W_BNE_TOSE_SCARLETNEXUS#p24 グラフィニカの開発したツールで紹介する、UE4でのカットシーン制作ワークフロー 【あにつく2022】 https://youtu.be/_GB-r3FJxtw?si=cdX60bI4Ss6axdYG https://www.too.com/dc/report/2209_atsuc2022_graphinica01/ クライシス コア -ファイナルファンタジーVII- リユニオン 開発における心得と制作手法 【UNREAL FEST 2023 TOKYO】 https://youtu.be/NENg8lxLGhE https://www.docswell.com/s/EpicGamesJapan/5W1V9P-UE_UF23T_TOSE 劇場版 シルバニアファミリー フレアからのおくりもの 【CGWORLD vol.306 2024年2月号】 https://cgworld.jp/magazine/cgw306.html #UENagoya
昨今の傾向 UE外のツールで作成したカットシーンデータを使って Level Sequenceを自動生成する事例が年々増加 UnityにおけるSequencerに近い機能 「Timeline」を会話・戦闘演出で活用した事例が年々増えている カットシーン以外での 利用・自動生成の需要も 更に広がっていく(いっている)予感 https://docs.unity3d.com/ja/2019.2/Manual/TimelineOverview.html #UENagoya
UnityのTimeline で 会話シーン・戦闘演出を実装した事例の一部 「IDOLY PRIDE」における動画のようなADVの実現方法 https://learning.unity3d.jp/8852/ ヘブンバーンズレッド × バトル × アドベンチャー 〜WFSのゲーム制作・演出の最大化手法〜 https://techcon.gree.jp/2022/session/TrackB-2 『呪術廻戦 ファントムパレード』の多彩なスキル演出を生み出した制作ツールへのこだわり https://cagc.cyberagent.co.jp/2024/session/index.html?id=T6yR9hPB #UENagoya
というわけで シーケンサーの自動生成のみに 絞ってみました #UENagoya
お品書き 1. 2. 3. 4. シーケンサーの基本機能・データ構造について シーケンサーの自動生成 - 基本編 シーケンサーの自動生成 - 特殊Track編 シーケンサーの自動生成 - データ管理編 - #UENagoya
今回の検証環境 Unreal Engine 5.3 ちなみに、5.4 から Sequencer のエディタUIが変わるみたいです 講演前にそういうのはやめてほしい #UENagoya
シーケンサーの 基本機能・データ構造について #UENagoya
自動生成するにはまず基本から シーケンサーを自動生成 シーケンサーのデータ構造と 各エディタ操作の内部を (ある程度)把握する事が重要! シーケンサーエディタ上での 各操作を全自動で実行 #UENagoya
Level Sequence(LS) #UENagoya
Level Sequence シーケンサー アセットのこと Shot Track や Subsequences Track により 複数の Level Sequence を 連結・同時使用 することが可能 #UENagoya
Track, Section, Channel, Key #UENagoya
基本データ構造 Track: 制御対象の要素・機能 ( Actor, Component, Propertyなど) Section: 制御する時間 Channel Channel: 設定する値の型・クラス Key Key: 設定値 Track Section #UENagoya
基本データ構造 こんなイメージ #UENagoya
基本データ構造 Track(制御対象): - Actor, Component, Transform Section(制御時間): - 0フレーム ~ XXX フレームまで Channel(設定値の型・クラス): - Transform ( double * 9 ) Key(設定値): - Location (■■■, ■■■, ■■■ ) - Rotation ( … ) - Scale ( … ) #UENagoya
Object Binding #UENagoya
シーケンサー と レベル Level Sequence と Level は 別アセット 制御するには 紐付ける必要がある #UENagoya
基本データ構造の振り返り Track: 制御対象の要素・機能 ( Actor, Component, Propertyなど) Section: 制御する時間 Channel Channel: 設定する値の型・クラス Key Key: 設定値 Track Section #UENagoya
Object Binding Track と『レベル上に存在するオブジェクト(※)』を紐づけする機能 ※ オブジェクト = Actor, Component, プロパティ など #UENagoya
Object Binding はかんたん!(この方法の場合は エディターから Actorを追加した場合は Object Bindingが 自動的に行われる #UENagoya
余談:Track Settings LevelSequenceにActorを追加した際に 自動的に追加されるTrackを設定することが可能 https://docs.unrealengine.com/5.3/ja/cinematic-actor-tracks-in-unreal-engine/ #UENagoya
Object Binding による紐づけが切れてしまうケースの一部 ● Object Binding対象の Actorをレベルから削除した ● Object Binding対象のActorを 別BPに置き換えた ● 別レベルを開いた状態で Level Sequenceを開いた #UENagoya
つまり… LevelSequence が 特定のLevel・Actor と強く紐づくため 別の環境・条件で使い回すことが不可能 #UENagoya
Possessable , Spawnable #UENagoya
Possessable と Spawnable Possessable (所有可能なもの) Spawnable (スポーン可能なもの) レベル上のActorを参照 Sequencer から 制御対象のActorをSpawn これまでのものはこちら #UENagoya
Spawnable のメリット ① レベルの情報に依存しないため 様々なレベルで使用することが可能! Spawnable に設定した Level Sequence #UENagoya
Spawnable のメリット ② Object Binding を実行中に変更することで レベル上のActorを制御可能( SequencerからのSpawnはスキップ ) 「動的に生成されたActor」もSequencerで制御することが可能 ( 例:プレイヤーキャラ ) #UENagoya
Object Bindingの動的変更 - Add Binding Object Bindingを変更するTrackを一覧から指定する方法 実装が楽な反面、汎用性に欠ける方法。また、LS側の変更に弱い #UENagoya
Object Bindingの動的変更 - Add Binding by Tag Trackに設定した Tag を元にObject Binding を実行する方法 Tag設定が少々面倒ですが、LS側の変更に強く汎用性も高い ・・・ #UENagoya
Object Bindingの動的変更 - 動的Binding ( UE5.3 から ) 従来の方法とは異なり Level Sequence内で Object Bindingの設定処理を実装可能に! より手軽に様々な環境・条件で再生できるように 操作キャラ 特定のActorタグを持つActor #UENagoya
ブループリントでアクタをシーケンサーとリバインドする https://docs.unrealengine.com/5.3/ja/ change-cinematic-track-bindings-in-unreal-engine/ シーケンサーでプレイヤーを参照する https://docs.unrealengine.com/5.3/ja/ how-to-reference-the-player-in-unreal-engine-cinematics/ 動的バインディング https://docs.unrealengine.com/5.3/ ja/dynamic-binding-in-sequencer/ #UENagoya
Track Section Channel Object Binding Possessable Spawnable Key #UENagoya
基本データ構造 Track: 制御対象の要素・機能 ( Actor, Component, Propertyなど) Section: 制御する時間 Channel Channel: 設定する値の型・クラス Key Key: 設定値 Track Section #UENagoya
Object Binding Track と『レベル上に存在するオブジェクト(※)』を紐づけする機能 ※ オブジェクト = Actor, Component, プロパティ など #UENagoya
Possessable と Spawnable Possessable (所有可能なもの) Spawnable (スポーン可能なもの) レベル上のActorを参照 Sequencer から 制御対象のActorをSpawn これまでのものはこちら #UENagoya
お品書き 1. 2. 3. 4. シーケンサーの基本機能・データ構造について シーケンサーの自動生成 - 基本編 シーケンサーの自動生成 - 特殊Track編 シーケンサーの自動生成 - データ管理編 - #UENagoya
基本編ですること Editor Utility 機能を使って シーケンサーアセット( Level Sequence )を 自動的に生成・構築 #UENagoya
Editor Utility UE5上で動作する便利ツール や エディタ拡張を実装するための標準機能 BP, C++, Python に対応 ツールのUIは UMGで構築できるため 非エンジニアにも優しい 既に多くのドキュメント・解説記事が あるので今回は説明を割愛 https://cgworld.jp/regular/202401-ue5tool-02.html #UENagoya
おすすめリンク 公式ドキュメント https://docs.unrealengine.com/5.3/ja/scripting-and-automating-the-unreal-editor/ https://docs.unrealengine.com/5.3/ja/editor-utility-widgets-in-unreal-engine/ UE5:Editor Utilityを活用したツール制作術 ( CG WORLD ) https://cgworld.jp/regular/unreal_engine_5_editor_utility/ UE5 ブループリントでツールをつくる本 - 入門編 https://zenn.dev/pokotaro/books/ce31aff7a884d1 Unreal Engine Editor Utility Widget | エディタ拡張 ( UE5攻略リンク ) https://ue5study.com/unrealengine-editorutility/ #UENagoya
Sequencer と Python シーケンサーでの Python スクリプティング https://docs.unrealengine.com/5.3/ja/python-scripting-in-sequencer-in-unreal-engine/ 公式サンプル集 Engine/Plugins/MovieScene/SequencerScripting/Content/Python kezzardrix/UE4のPython Sequencer Scriptingの基本 https://gist.github.com/kezzardrix/8514eda83691efb348c3ab0a1ffef9ac 20tab/UnrealEnginePython https://github.com/20tab/UnrealEnginePython/tree/master/examples #UENagoya
シーケンサーの自動生成 - 基本編 1. 2. 3. 4. 5. Level Sequence アセットを作成 キャラクターを追加 移動アニメーションを再生 指定のポイント間を移動 作成・編集したアセットを保存 #UENagoya
Level Sequence アセットを作成 Level Sequence Factory New Level Sequence #UENagoya
Construct Level Sequence Factory New ノードのつくりかた #UENagoya
Tips : Create Unique Asset Nameノードを使うと、既にある既存ファイルとは 重複しないファイル名を取得可能 ( 過去に解説した記事 ) #UENagoya
#UENagoya
Tips: 自動生成ではなく、 現在開いているLevelSequenceに対して処理を実行したい場合は Get Current Level Sequenceノードを使う #UENagoya
シーケンサーの自動生成 - 基本編 1. Level Sequence アセットを作成 2. キャラクターを追加 3. 4. 5. 移動アニメーションを再生 指定のポイント間を移動 作成・編集したアセットを保存 #UENagoya
#UENagoya
Skeletal Mesh Actor の Spawnable Track を追加 Add Spawnable from Class ノードを使って 指定クラスのActor のTrack を Spawnable 設定で追加 Skeletal Mesh Actor #UENagoya
Skeletal Mesh Actor の Spawnable Track を追加 Skeletal Mesh が空 #UENagoya
Skeletal Mesh を設定 Get Object Template ノードの結果を編集することで 追加した Track のデフォルト値を変更 Movie Scene Binding Proxy Structure #UENagoya
Skeletal Mesh を設定 #UENagoya
Add Spawnable from Instance ノードの場合 動的に生成したActor を Spawnable Track として追加可能 EditorUtilityからSpawnしたActorを取り除かないと レベル上に残り続けるため #UENagoya
シーケンサーの自動生成 - 基本編 1. 2. Level Sequence アセットを作成 キャラクターを追加 3. 移動アニメーションを再生 4. 5. 指定のポイント間を移動 作成・編集したアセットを保存 #UENagoya
#UENagoya
Add Track ノード で アニメーション再生用Trackを追加 Trackのみで、Sectionなどは空 Movie Scene SkeletalAnimation Track #UENagoya
Add Section ノードで追加したセクションを編集 Section を末尾まで伸ばす アニメーション再生用 Section の パラメータを設定 #UENagoya
Set End Frame Bounded, Set End Frame ( Seconds ) ノード Add Section のみだと 長さが 0 フレームしかないため セクションを伸ばす必要がある #UENagoya
Section の長さを調整するノード #UENagoya
再生するアニメーションアセットを設定 アニメーション再生用Sectionのプロパティ(Params) から設定 #UENagoya
再生するアニメーションアセットを設定 アニメーション再生用Sectionのプロパティ(Params) から設定 #UENagoya
#UENagoya
シーケンサーの自動生成 - 基本編 1. 2. 3. Level Sequence アセットを作成 キャラクターを追加 移動アニメーションを再生 4. 指定のポイント間を移動 5. 作成・編集した Level Sequenceアセットを保存 #UENagoya
指定のポイント間を移動 1. 2. Transform Track、Sectionを追加 Location.X/Y/Z , Rotation.X/Y/Z , Scale.X/Y/Z の 合計 9 個の Key を追加 ( Transform・Vector・Rotation Keyはない ) #UENagoya
Transform Track、Sectionを追加 追加したSpawnable Trackに対して Add Track, Section ▶ 追加したセクションの長さを調整 Movie Scene 3D Transform Track #UENagoya
Transform Section が持つ各Channelを取得 Get Channels by Type ノード または Get All Channels ノードにより、Section から Channelを取得 Movie Scene Scripting Double Channel #UENagoya
9 個の Double Channel Double Channel : Channel Name = Location.x #UENagoya
Double Channel ( Location.X ) に対して 0 フレーム目に Key ( 0.0f ) 追加 50 フレーム目に Key ( 0.0f ) 追加 #UENagoya
#UENagoya
関数化するとしたら…(つらい #UENagoya
PG向け : エンジン内で用意されている C++ 関数 Transformとフレーム数の配列を渡せば Transform Keyを追加してくれる関数 bool MovieSceneToolHelpers ::AddTransformKeys ( const UMovieScene3DTransformSection * InTransformSection, const TArray<FFrameNumber >& Frames, const TArray<FTransform>& InLocalTransforms, const EMovieSceneTransformChannel & InChannels) 注意:フレーム数( FFrameNumber )を変換する必要あり FFrameRate::TransformTime(KeyTime, UMovieSceneSequenceExtensions::GetDisplayRate(Sequence.Get()), UMovieSceneSequenceExtensions::GetTickResolution(Sequence.Get())).RoundToFrame(); #UENagoya
BPノード化がオススメ!
bool UMyEditorBlueprintFunctionLibrary ::AddTransformKeys (
const UMovieScene3DTransformSection * InTransformSection,
const TArray<FFrameNumber >& InFrames,
const TArray<FTransform >& InLocalTransforms)
{
TArray<FFrameNumber > TransformedFrames;
const UMovieScene * MovieScene = InTransformSection-> GetTypedOuter <UMovieScene >();
for (const FFrameNumber & Frame : InFrames)
{
FFrameTime KeyTime =
FFrameRate ::TransformTime (FFrameTime (Frame),
MovieScene-> GetDisplayRate (), MovieScene-> GetTickResolution ()).RoundToFrame ();
TransformedFrames. Add(KeyTime. FrameNumber );
}
return MovieSceneToolHelpers ::AddTransformKeys (InTransformSection,
TransformedFrames, InLocalTransforms, EMovieSceneTransformChannel ::AllTransform );
}
#UENagoya
シーケンサーの自動生成 - 基本編 1. 2. 3. 4. Level Sequence アセットを作成 キャラクターを追加 移動アニメーションを再生 指定のポイント間を移動 5. 作成・編集した Level Sequenceアセットを保存 #UENagoya
Save Loaded Asset ノードで生成・編集したアセットを保存 LSの 編集処理 #UENagoya
ここまでの成果 #UENagoya
ここまでの内容だけでもいろいろできる! #UENagoya
お品書き 1. 2. 3. 4. シーケンサーの基本機能・データ構造について シーケンサーの自動生成 - 基本編 シーケンサーの自動生成 - 特殊Track編 シーケンサーの自動生成 - データ管理編 - #UENagoya
シーケンサーの自動生成 特殊Track編 ● ● ● ● ● プロパティ系 Track Component の Track Camera Cut Track Shot, Subscene Track Event Track #UENagoya
String型プロパティ「Test」の Track を追加 Set Property Name and Path 自作BP Movie Scene String Track #UENagoya
Movie Scene Scripting String Channel #UENagoya
#UENagoya
Set Property Name and Path ノード Actor/Componetが持つプロパティ と プロパティ系Track を紐づけ BP Track #UENagoya
Set Property Name and Path ノード の Property Path ピン プロパティの内部実装名( Internal Name )を指定 構造体の場合は 【構造体名】.【プロパティのInternal Name】 FocusSettings. ManualFocusDistance Cineカメラコンポーネントが持つプロパティ #UENagoya
Trackをコピーした際のテキストデータにも記載あり Begin Object Class=/Script/Sequencer.MovieSceneCopyableB inding Name="MovieSceneCopyableBinding_3" … UniqueTrackName="FocusSettings.ManualFocus Distance" PropertyBinding=(PropertyName="ManualFocusD istance",PropertyPath="FocusSettings.ManualFo cusDistance ",bCanUseClassLookup=True) Sections(0)="/Script/MovieSceneTracks.MovieS ceneFloatSection'MovieSceneFloatSection_0'" #UENagoya
余談: UE5.3 から Text 型 も Sequencerで制御可能に MovieScene TextTrack Textなので、 ローカライズ対応 できるのが嬉しい! ただし、 UE5.3時点では BPから 自動生成できず… #UENagoya
TArray<UMovieSceneScriptingChannel *> UMovieSceneSectionExtensions::GetChannelsByType (UMovieSceneSection * Section,
TSubclassOf<UMovieSceneScriptingChannel > ChannelType)
{
…
// ToDo: This needs to be done dynamically in the future but there's not a good way to do that right now with all of the SFINAE-based Templating
driving these channels
TWeakObjectPtr <UMovieSceneSequence > Sequence = Section->GetTypedOuter <UMovieSceneSequence >();
if (ChannelType == UMovieSceneScriptingBoolChannel::StaticClass ())
{ GetScriptingChannelsForChannel <FMovieSceneBoolChannel , UMovieSceneScriptingBoolChannel >(ChannelProxy, Sequence, Section, Channels); }
else if (ChannelType == UMovieSceneScriptingByteChannel::StaticClass ())
{ GetScriptingChannelsForChannel <FMovieSceneByteChannel , UMovieSceneScriptingByteChannel >(ChannelProxy, Sequence, Section, Channels); }
else if (ChannelType == UMovieSceneScriptingFloatChannel::StaticClass ())
{ GetScriptingChannelsForChannel <FMovieSceneFloatChannel , UMovieSceneScriptingFloatChannel >(ChannelProxy, Sequence, Section, Channels); }
else if (ChannelType == UMovieSceneScriptingDoubleChannel::StaticClass ())
{ GetScriptingChannelsForChannel <FMovieSceneDoubleChannel , UMovieSceneScriptingDoubleChannel >(ChannelProxy, Sequence, Section, Channels); }
else if (ChannelType == UMovieSceneScriptingIntegerChannel::StaticClass ())
{ GetScriptingChannelsForChannel <FMovieSceneIntegerChannel , UMovieSceneScriptingIntegerChannel >(ChannelProxy, Sequence, Section, Channels); }
else if (ChannelType == UMovieSceneScriptingStringChannel::StaticClass ())
{ GetScriptingChannelsForChannel <FMovieSceneStringChannel , UMovieSceneScriptingStringChannel >(ChannelProxy, Sequence, Section, Channels); }
else if (ChannelType == UMovieSceneScriptingEventChannel::StaticClass ())
{ GetScriptingChannelsForChannel <FMovieSceneEventChannel , UMovieSceneScriptingEventChannel >(ChannelProxy, Sequence, Section, Channels); }
else if (ChannelType == UMovieSceneScriptingActorReferenceChannel::StaticClass ())
{ GetScriptingChannelsForChannel <FMovieSceneActorReferenceData , UMovieSceneScriptingActorReferenceChannel >(ChannelProxy, Sequence, Section,
Channels); }
else if (ChannelType == UMovieSceneScriptingObjectPathChannel::StaticClass ())
{ GetScriptingChannelsForChannel <FMovieSceneObjectPathChannel , UMovieSceneScriptingObjectPathChannel >(ChannelProxy, Sequence, Section, Channels);
}
else
{
FFrame::KismetExecutionMessage (TEXT("Unsupported ChannelType for FindChannelsByType!" ), ELogVerbosity::Error );
}
return Channels;
}
#UENagoya
シーケンサーの自動生成 特殊Track編 ● プロパティ系 Track ● Component の Track ● ● ● Camera Cut Track Shot, Subscene Track Event Track #UENagoya
Component の Track Component が Object Binding の対象である Possessable Track 既にレベル上に存在することを 前提とした実装になっているため、 自動生成時は少々面倒なことに (より良い方法あったら知りたい… #UENagoya
ComponentのTrackを追加する方法 ① Componentを持つActorをSpawn ▶ LSに追加 ③ Spawn した Actor を削除 ② Componentを Possesable として追加し Actor の Object Binding と親子付け #UENagoya
Destoryしたはずの Actor の Track が残る問題 #UENagoya
Remove ノード で 不要になったTrackを削除 ① Component Track 追加時に自動生成された 親TrackのObject Binding 情報を取得 ② 親TrackのBinding情報を削除。この時点でTrackは消えるが レベル上のActorは消えないため、Destroy Actorは必要 #UENagoya
例:Cina Camera Actor の 焦点距離のプロパティのTrackを自動生成 Set Property Name and Path Path = FocusSettings.ManualFocusDistance #UENagoya
シーケンサーの自動生成 特殊Track編 ● ● プロパティ系 Track Component の Track ● Camera Cut Track ● ● Shot, Subscene Track Event Track #UENagoya
Camera Cut Track シーケンサーのカメラ制御を行う専用Track 既に登録されたCamera系ActorのTrackを設定する必要あり #UENagoya
Camera Cut Track の生成・セットアップ Cine Camera Actor の Track 追加処理 Camera Cut Track に Cine Camera を設定 Get Binding ID -> Set Camera Binding ID Movie Scene Camera Cut Track #UENagoya
シーケンサーの自動生成 特殊Track編 ● ● ● プロパティ系 Track Component の Track Camera Cut Track ● Shot, Subscene Track ● Event Track #UENagoya
他 Level Sequence を組み込むための 専用Track Shot Track 映像制作における カットを管理するもの https://docs.unrealengine.com/5.3/ja/sequences-shots-and-takes-in-unreal-engine/ SubScene Track 1つのカットを 複数人で同時作業する ためのもの #UENagoya https://docs.unrealengine.com/5.3/ja/cinematic-subscequences-track-in-unreal-engine/
#UENagoya https://www.docswell.com/s/EpicGamesJapan/5XP4YZ-UE4_GCC19_Sequencer_LatestInfoAndTips#p81
Shot, Subscene Track の 追加、LSの登録 Movie Scene Cinematic Shot Track Movie Scene Sub Track Set Sequence ノードで Track に LS を登録 #UENagoya
Shot, Subscene Track の 追加、LSの登録 #UENagoya
シーケンサーの自動生成 特殊Track編 ● ● ● ● プロパティ系 Track Component の Track Camera Cut Track Shot, Subscene Track ● Event Track #UENagoya
Event Track Level Sequence 毎に存在する専用BP (Director BP) が持つ イベント・関数を実行するTrack #UENagoya
Actor・Component Track でも Event Trackを使用可能 呼び出したい関数・イベントを Director BP に自動追加・配置 #UENagoya
実行する関数・イベントに渡すパラメータを Level Sequence側で設定可能 ( Payload ) Directo BP のイベント #UENagoya
Event Trackの自動生成における課題 ● ● ● 実行する関数・イベントをDirector BPに自動追加するには? 実行する関数・イベントの引数(Payload)はどう設定すれば? Director BPを汎用化するにはどうすれば? #UENagoya
実行する関数・イベントをDirector BPに自動追加するには? Create Quick Binding、Create Event ノードを使う! #UENagoya
実行する関数・イベントの引数(Payload)の設定方法 In Objectに指定したものが持つ SetActorScale3D関数を指定 #UENagoya
DirectorBPへのイベント追加 と Event Key の追加を実現 #UENagoya
Payloadの書き方 Event Trackをコピーして テキストにペーストすると… PayloadVariables = (("Bool", (Value="True")), ("Int", (Value="1")), ("String", (Value="Test")), ("Vector",(Value="1.000000,2.000000,3.000000"))) #UENagoya
Create Quick Bindingの問題 その1 In Objectに LevelSequence を 指定しても機能しない Director BPがもともと持つ イベント・関数を Key として使えない Create Quick Bindingの 改変ノードをC++で自作すれば解決(記事 作成中… #UENagoya
Create Quick Bindingの問題 その2 指定した関数名が同じであっても Create Quick Bindingを実行するたびに イベントノードが自動生成・追加される問題 近日中に記事を公開予定 返り値のEndPointを使い回せば、暫定的に回避可能 #UENagoya
Event Trackの自動生成における課題 ● ● 実行する関数・イベントをDirector BPに自動追加するには? 実行する関数・イベントの引数(Payload)はどう設定すれば? ● Director BPを汎用化するにはどうすれば? 汎用化したい・課題になる理由 - 一時停止、分岐処理など、LS間で共通化したい処理は多い 共通処理の実行用Actorを使うのは楽だが、スマートなやり方ではない 共通処理をDirector BPの基底クラスにまとめたいが 基底クラスの変更が少々面倒( 参考記事 その1, その2 ) #UENagoya
Director BPの基底クラスを変更するノードをつくってみました
UBlueprint * UMyEditorBlueprintFunctionLibrary ::SetDirectorBlueprint (ULevelSequence * LevelSequence,
UBlueprint * BaseDirectorBlueprint)
{
UBlueprint * NewDirectorBlueprint = nullptr ;
if(LevelSequence && BaseDirectorBlueprint)
{
NewDirectorBlueprint = FKismetEditorUtilities ::CreateBlueprint (BaseDirectorBlueprint-> GeneratedClass , LevelSequence,
FName(*LevelSequence-> GetDirectorBlueprintName ()), BPTYPE_Normal , UBlueprint ::StaticClass (),
UBlueprintGeneratedClass ::StaticClass ());
NewDirectorBlueprint-> ClearFlags (RF_Standalone );
LevelSequence-> SetDirectorBlueprint (NewDirectorBlueprint);
LevelSequence-> MarkPackageDirty ();
UObject * AssetObject = LevelSequence;
while (AssetObject)
{
if (AssetObject-> IsAsset ())
{
break;
}
AssetObject = AssetObject-> GetOuter ();
}
if (AssetObject)
{
FBlueprintActionDatabase ::Get().RefreshAssetActions (AssetObject);
}
}
return NewDirectorBlueprint;
}
参考:
-
FMovieSceneSequenceEditor_LevelSe
quence::CreateBlueprintForSequence
FMovieSceneSequenceEditor::GetOrCr
eateDirectorBlueprint
#UENagoya
お品書き 1. 2. 3. 4. シーケンサーの基本機能・データ構造について シーケンサーの自動生成 - 基本編 シーケンサーの自動生成 - 特殊Track編 シーケンサーの自動生成 - データ管理編 - #UENagoya
シーケンサーの自動生成とは? 設定ファイル や スクリプトなどから シーケンサーアセット( Level Sequence )を 自動的に生成・構築すること #UENagoya
シーケンサーの自動生成とは? 設定ファイル や スクリプトなどから シーケンサーアセット( Level Sequence )を 自動的に生成・構築すること #UENagoya
基本的な流れ 1. 2. 3. 自動生成に関するコマンドを用意 1で用意したコマンドやルールに基づいて、スクリプト・データを用意 UE側:2を読み込み、その内容を元にコマンドを実行( = LSを自動生成) Add Character (00) Character : 00_グレイマン Animation : Walk Start : Point 00 Stop : Point 01 Frame : 0 - 100 Add Animation (Walk) Add Transform (100, 100, 0) Add Transform (100, 200, 0) Character ID : 01_マニー #UENagoya
基本的な流れ 1. 2. 3. 自動生成に関するコマンドを用意 1で用意したコマンドやルールに基づいて、スクリプト・データを用意 DCCツールからスクリプト・データを生成 UE側:2を読み込み、その内容を元にコマンドを実行( = LSを自動生成) Set Skeletal Mesh (00) Character : 00_グレイマン Animation : Walk Start : Point 00 Stop : Point 01 Frame : 0 - 100 Add Animation (Walk) Add Transform (100, 100, 0) Add Transform (100, 200, 0) #UENagoya
「設定ファイル や スクリプトなど」の例 UEアセット ● ● Data Table Data Asset ローカルファイル ● ● CSV テキストファイル (.json など) オンライン ● ● Google スプレッドシート Notion #UENagoya
DataTable・DataAsset(既に沢山資料があるので詳細は割愛) DataAsset 詳細パネルでデータ管理 DataTable 表形式でデータを管理csv と json を入出力可能 自由度は高いが、外部データへの変換機 能は自前で用意する必要がある #UENagoya
Instanced Object (Struct)でコマンドを実装するのがオススメ! パラメータが異なるものを #UENagoya 同じ配列で管理できるのが便利!
エディタのUXを向上させる Unreal C++との付き合い方 #UENagoya
UEアセットをソースにする メリット・デメリット メリット ● ● UE内で作業が完結 自動生成の呼び出し実装が楽 デメリット ● ● UEにある程度慣れている必要がある (学習コスト問題) 作業効率を上げるために専用エディタを 自作する必要があるかもしれない #UENagoya
「設定ファイル や スクリプトなど」の例 UEアセット ● ● Data Table Data Asset ローカルファイル ● ● CSV テキストファイル (.json など) オンライン ● ● Google スプレッドシート Notion #UENagoya
CSV カンマ区切りで管理する データフォーマット Excelで編集・出力可能なので 扱いに慣れている人が多い UEでは CSV を 読み取って DataTableを更新する形で利用可能 - 公式ドキュメント 【UE4】DataTableの使い方-その① ~基本編~【★~★★】 ID,Parent,Command,Param 0,Param 1,Param 2, 0,,キャラクター ,00-Grayman,,, 1,0,アニメーション再生 ,Walk,,, 2,0,Transform 設定,0,0,, 3,0,Transform 設定,50,1,, #UENagoya
Json テキスト形式の データフォーマット 扱いやすく人気があり 多くのツールが対応している BPでも扱うことが可能! - 【UE5】Json Blueprint Utilities プラグインを活用する Unreal Engine Json(UE5攻略 リンク) { "Commands": [ { "Command": "AddCharacter", "Type": "00_Grayman", "Commands": [ { "Command": "AddAnimation", "Animation": "00_Grayman", }, { "Command": "AddTransform", "Frame": "0", "Transform" : { #UENagoya
CSV ● Excelという強力な編集エディタを使える ○ ● その反面、Excelの呪いも受ける データの入力ルールの策定や 入力支援機能の準備にコストがかかる Json ● ● 様々なツールと連携しやすい 直接編集するのは不便なため、 Jsonを編集 or 出力するツールが必要 #UENagoya
「設定ファイル や スクリプトなど」の例 UEアセット ● ● Data Table Data Asset ローカルファイル ● ● CSV テキストファイル (.json など) オンライン ● ● Google スプレッドシート Notion #UENagoya
Google スプレッドシート Excel・CSVと同じく 表形式で編集・管理 オンライン上に データがあるのが大きな強み! Runtime DataTable UEから直接アクセス可能 https://www.unrealengine.com/marketplace/ja /product/runtime-datatable #UENagoya
Notion 様々なツールに分散していた役割を 統合したオンラインサービス 個人でも会社でも活用中! Notionはいいぞ 公式のNotion APIを実行することで ページ内の情報を Json で取得可能 https://developers.notion.com/reference/intro #UENagoya
Googleスプレッドシート ● ● ● 強力な編集エディタを使える 直接アクセス可能なため、DL ▶ 変換作業が不要 CSVと同じく、データ編集ルールと支援機能の問題がある Notion ● ● ドキュメントやタスク管理といった Notionの各機能と連携できる カスタマイズに限界があり、融通が利かない部分もある #UENagoya
UEアセット ● ● Data Table Data Asset ファイル ● ● CSV テキストファイル (.json など) オンライン ● ● Google スプレッドシート Notion どのプロジェクトにおいても ベストな方法は無い ワークフロー、作業環境、 人員構成などを考慮しつつ、 何が最適な方法なのかを 検証する必要がある #UENagoya
参考資料 スクリプトに関して UE4と融合されたスクリプトシステム!「Caligula2」イベントシーン開発事例【UNREAL FEST EXTREME 2021 WINTER】 UEとNotionの連携に関して AIR-Plateによる空間情報記述の新手法について【UNREAL FEST WEST ’22】 #UENagoya
本日のまとめ シーケンサーを自動生成するには、まず基本機能・データ構造の把握から ● ● Track, Section, Channel, Key Object Binding, Possessable, Spawnable 少し手数は多いものの、 BPのみで シーケンサーの自動生成は可能!(C++が使えると更に楽に) 自動生成のソースデータは様々な選択肢があるが プロジェクトに最適な方法を自身で検証・決定する必要がある #UENagoya
自動生成で作業効率をあげて 楽しい・重要な作業に 時間をもっと使っていきましょう! おしまい #UENagoya