>100 Views
December 05, 25
スライド概要
"本講演へのアンケートにご協力をお願い致します:
https://forms.gle/P3NKHimB366C43Rq9
講演動画:
https://www.youtube.com/watch?v=kGIDMBG-5OI
講演内容:
UnrealEngine4で制作したタイトルの続編をUnrealEngine5で制作する際に、パーティクルシステムをCascadeからNiagaraへ移行する必要がありました。
本公演では、過去のタイトルで実装した大量のCascadeアセットやその関連アセットをどのようにNiagaraへ移行したのか、移行に際してどのような工夫を行ったのかなどの取り組みを紹介いたします。
講演者:
松尾 隆志(株式会社サイバーコネクトツー)
株式会社サイバーコネクトツーについてはこちら:
https://www.cc2.co.jp/
Unreal Fest Tokyo 2025公式サイト:
https://www.unrealengine.com/ja/events/unreal-fest-tokyo-2025
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
続編制作におけるCascadeからNiagaraへの移行事例 株式会社サイバーコネクトツー 松尾 隆志 #unrealfest
はじめに 株式会社サイバーコネクトツー 開発部 プログラムディビジョン セクションマネージャー 松尾 隆志 テクニカルアーティストとして、 コンシューマーゲームやスマートフォンゲーム開発に従事。 描画表現をはじめとして、技術開発・開発効率化など、 社内全体のテクニカルサポート業務を幅広く担当。 現在は開発に携わりながら、 テクニカルサポート・描画セクションの セクションマネージャーを務める。 -2- #unrealfest
アジェンダ ● Cascade から Niagara への移行について ● Cascade to Niagara Converter Plugin について ● プラグインで対応できなかった箇所について ● 移行の際に用意したツールなどについて ● 実際に運用しての振り返り -3- #unrealfest
Cascade と Niagara について -4- #unrealfest
CascadeとNiagaraについて Cascade カスケード UnrealEngine4(以下、UE4)で 主に使用されているエフェクトツール 5.6 でも非推奨ながら動作する Niagara ナイアガラ UnrealEngine5(以下、UE5)で 主に使用されているエフェクトツール 4.20 で ”Early Access”、4.25 から “Production Ready” -5- #unrealfest
CascadeとNiagaraについて UnrealEngine5 でも Cascade は動作する 『枯れた技術』であり安定動作が期待できる 現在の『フォートナイト』も一部は Cascade が使用されている -6- #unrealfest
あるタイトルでの移行について -7- #unrealfest
あるタイトルでの移行について 具体的にどのタイトルの話なのかについては 今回はお話することはできませんが 紹介する内容はすべて実際に行った内容となります -8- #unrealfest
あるタイトルでの移行について 前作 次作 UE4 UE4 or UE5? … UE4 で制作されたあるタイトルの続編制作が決定 続編は UE4 か UE5 にするかが問題になった -9- #unrealfest
あるタイトルでの移行について 前作 次作 UE4 UE4 UE5 … 開発が長く続くことや機能の更新などを加味し UE5 へアップデートすることに - 10 - #unrealfest
あるタイトルでの移行について 前作 次作 UE4/Cascade UE4/Cascade UE5/Niagara … いつまでサポートされるか不明だったため Cascade から Niagara への移行を実施することに - 11 - #unrealfest
あるタイトルでの移行について 前作 次作 UE4/Cascade UE4/Cascade UE5/Cascade UE5/Niagara … UE5 のアップデートも同時進行となるため 段階的に UE5 の Niagara へ移行することに - 12 - #unrealfest
あるタイトルでの移行について Niagara移行にともない対応する必要があること CascadeアセットをNiagaraアセットにする Cascadeアセットを参照しているアセットを更新する - 13 - #unrealfest
あるタイトルでの移行について CascadeアセットをNiagaraアセットにする ● 大量の Cascade アセットの移行 ꟷ 前作のリソースの多くを次作でも流用することは決まっていた ꟷ すべてをいちからNiagaraで作り直すにはコストが高すぎる - 14 - #unrealfest
あるタイトルでの移行について Cascadeアセットを参照しているアセットを更新する ● Cascade アセットが参照しているアセットが大量にある ꟷ Blueprint, DataAsset, AnimSequence, Sequencer, ・・・ ꟷ プログラムコードの修正も必要になる - 15 - #unrealfest
あるタイトルでの移行について 移行のスケジュール(概要) プログラマー対応 アーティスト対応 開始 1 2 3 4 5 6 7 8 9 10 完了 ※上記は期間・内容を簡略化したスケジュールです - 16 - #unrealfest
Cascade to Niagara Converter Plugin での移行 - 17 - #unrealfest
Cascade to Niagara Converter Plugin について Cascade to Niagara Converter Plugin ● Cascade アセットを Niagara アセットに変換するプラグイン ꟷ エンジンに付属しているプラグイン ꟷ Python コード, C++ コード, NiagaraScript で構成されている ꟷ 現在はベータ版で Cascade が廃止になるまでサポートが続く ※本講演中では「コンバーター」と呼称 - 18 - #unrealfest
Cascade to Niagara Converter Plugin について https://dev.epicgames.com/documentation/ja-jp/unreal-engine/cascade-to-niagara-effects-converter-plugin-for-unreal-engine より引用 プラグイン設定から「Cascade To Niagara Converter」を有効化 その後 Editor を再起動すると利用できる - 19 - #unrealfest
Cascade to Niagara Converter Plugin について https://dev.epicgames.com/documentation/ja-jp/unreal-engine/cascade-to-niagara-effects-converter-plugin-for-unreal-engine より引用 変換するカスケードアセットを右クリックし 「Convert To Niagara System」を選択すると 変換したアセットが同階層に作成される ※日本語環境の場合は「Niagaraシステムに変換」 - 20 - #unrealfest
Cascade to Niagara Converter Plugin について 変換後のNiagaraアセット内で変換エラーなどが確認できる https://dev.epicgames.com/documentation/ja-jp/unreal-engine/cascade-to-niagara-effects-converter-plugin-for-unreal-engine より引用 エラーに出ない見た目の違いが発生する場合がある - 21 - #unrealfest
Cascade to Niagara Converter Plugin について 今後も利用し続ける想定のあるアセットをいくつか抽出し Cascade から Niagara に変換して検証 複数の Cascade アセットを変換した結果 想定以上に変換がうまくいかず効率的ではなかった 効率化のためにはコンバーターの改善が必要 - 22 - #unrealfest
Cascade to Niagara Converter Plugin について コンバーターに足りない機能などがある場合は Pythonコードを変更することで自分で拡張可能 Engine Plugins FX CascadeToNiagaraConverter Content Python CascadeToNiagaraConverter.py コンバーター内のPythonコードの拡張を実施 - 23 - #unrealfest
Cascade to Niagara Converter Plugin について Python コードは 「Python Editor Script Plugin」でのコードと同じような形式 https://dev.epicgames.com/documentation/ja-jp/unreal-engine/scripting-the-unreal-editor-using-python より引用 - 24 - #unrealfest
コンバーター変換後に判明した対応すべき点(抜粋) そのまま変換した場合に修正すべき点が多い状態 (※Cascade アセットの設定によって発生している点もある) ● エミッターのループ数を反映する ● “Facing Mode” を反映する (Camera, Velocity) ● “Sprite Size” のスケールを反映する ● “Pivot Offset” の値を反映する ● “Initial Mesh Orientation” を設定する ● “Spawn Rotate Vector” の向きを反転する ● “Mesh Orientation” の “Lifetime” を設定する ● “Lifetime” モジュール未使用のループ挙動を合わせる ● “Sort Order” の設定を反映する ● “Scalability” の設定を反映する ● オフにしたモジュールを無効のままにする ● “Scale Color/Life” で設定した色を乗算する ● “Cylinder” “Sphere” モジュールの値を反映する ● “Mesh Material” の設定が有効にする ● “Size By Speed” を同じ値で10倍の動作にして合わせる ● “Sub UV Animation” の設定を反映する など・・・ - 25 - #unrealfest
コンバーター修正の大まかな流れ アーティストが Cascade アセットを変換する 問題のある箇所を切り出した Cascade アセットと 正しく変換されたと想定した Niagara アセットを用意する Niagara アセットが想定された内容に変換できるように コンバーターの Python スクリプトをプログラマーが変更する アーティストが再度 Cascade アセットを変換して確認する - 26 - #unrealfest
Cascade to Niagara Converter Plugin の拡張 - 27 - #unrealfest
Cascade to Niagara Converter Plugin について Cascade の実装状況によって異なる • ほとんど手を入れなくてよいケース • コンバーターが未対応で拡張が必要なケース • Niagara 側で仕様が変わることで Cascade と一致しなくなったケース • UnrealEngine の想定外の組み方をしているケース • 独自に拡張した機能を使用しているケース まずは素のコンバーターを利用して いくつかのアセットを変換することが重要 - 28 - #unrealfest
Cascade to Niagara Converter Plugin について 今回紹介する点はあるタイトルにおいて Cascade アセットを変換した際に生じた点であり 実際に変換する Cascade アセットによって 対応すべき内容は変わります - 29 - #unrealfest
Cascade to Niagara Converter Plugin について Cascade to Niagara Converter Plugin は バージョンアップごとに更新が行われています ご使用のバージョンによっては 解決している場合もありますのでご注意ください - 30 - #unrealfest
コンバーターの修正例の紹介 コンバーターにない機能を追加する コメントアウトされている部分を実装する Niagaraの仕様変更部分に対応する 複数のモジュールをまたいだ拡張を行う - 31 - #unrealfest
コンバーターの修正例の紹介 “Mesh Material” の設定を有効にする “Facing Mode” を反映する (Camera, Velocity) “Sort Order” の設定を引き継ぐようにする オフにしたモジュールを無効にしたままにする - 32 - #unrealfest
コンバーターの修正例の紹介 “Mesh Material” の設定を有効にする “Facing Mode” を反映する (Camera, Velocity) “Sort Order” の設定を引き継ぐようにする オフにしたモジュールを無効にしたままにする - 33 - #unrealfest
“Mesh Material” の設定を有効にする メッシュマテリアルを使用する場合には “Enable Material Overrides” のチェックを入れる必要がある Cascade Niagara - 34 - #unrealfest
“Mesh Material” の設定を有効にする “Enable Material Overrides” の有効化処理を追加 /Engine/Plugins/FX/CascadeToNiagaraConverter/Content/Python/ModuleConversionScripts/ CascadeMeshMaterialToNiagara.py class CascadeMeshMaterialConverter(ModuleConverterInterface): @classmethod def get_input_cascade_module(cls): return ue.ParticleModuleMeshMaterial @classmethod def convert(cls, args): cascade_module = args.get_cascade_module() emitter = args.get_niagara_emitter_context() # mesh material is only valid for the mesh renderer, so start by finding that. mesh_renderer_props = emitter.find_renderer("MeshRenderer") if mesh_renderer_props is not None: # get all properties from the cascade mesh material module. # noinspection PyTypeChecker mesh_materials = ueFxUtils.get_particle_module_mesh_material_props(cascade_module) # 追加 if len(mesh_materials) > 0: mesh_renderer_props.set_editor_property("bOverrideMaterials", True) # set the mesh overide materials from the casade module properties. # noinspection PyTypeChecker ueFxUtils.set_mesh_renderer_material_overrides_from_cascade( mesh_renderer_props, mesh_materials) - 35 - #unrealfest
“Mesh Material” の設定を有効にする “Mesh Material” の設定反映処理を追加 - 36 - #unrealfest
コンバーターの修正例の紹介 “Mesh Material” の設定を有効にする “Facing Mode” を反映する (Camera, Velocity) “Sort Order” の設定を引き継ぐようにする オフにしたモジュールを無効にしたままにする - 37 - #unrealfest
“Facing Mode” を反映する (Camera, Velocity) 変換時に “Screen Alignment” を “Facing Mode” に変換・反映する必要がある Cascade Niagara - 38 - #unrealfest
“Facing Mode” を反映する (Camera, Velocity) Mesh Particle の “Facing Mode” の変換処理を実装 /Engine/Plugins/FX/CascadeToNiagaraConverter/Content/Python/RendererConversionScripts/ CascadeMeshTypeDataToNiagaraMeshRenderer.py /Engine/Plugins/FX/CascadeToNiagaraConverter/Content/Python/CascadeToNiagaraHelperMethods.py class CascadeMeshTypeDataConverter(RendererConverterInterface): def get_facingmode_for_screenalignment_mesh(cascade_screen_alignment): if cascade_screen_alignment == ue.ParticleScreenAlignment.PSA_FACING_CAMERA_POSITION: return ue.NiagaraMeshFacingMode.CAMERA_POSITION @classmethod def convert(cls, cascade_typedata_module, cascade_required_module, niagara_emitter_context): elif cascade_screen_alignment == ue.ParticleScreenAlignment.PSA_SQUARE: return ue.NiagaraMeshFacingMode.DEFAULT # 略 elif cascade_screen_alignment == ue.ParticleScreenAlignment.PSA_RECTANGLE: return ue.NiagaraMeshFacingMode.DEFAULT # get the niagara subimage blend enabled state and binding from the cascade # equivalent interpolation method subimage_blend, subimage_binding = c2nUtils.get_enable_subimage_blend_and_binding_for_interpolation_method( interpolation_method) mesh_renderer_props.set_editor_property("bSubImageBlend", subimage_blend) elif cascade_screen_alignment == ue.ParticleScreenAlignment.PSA_VELOCITY: return ue.NiagaraMeshFacingMode.VELOCITY elif cascade_screen_alignment == ue.ParticleScreenAlignment.PSA_AWAY_FROM_CENTER: return ue.NiagaraMeshFacingMode.DEFAULT # 変更前 # mesh_renderer_props.set_editor_property("FacingMode", ) # 変更後 mesh_facingmode = c2nUtils.get_facingmode_for_screenalignment_mesh(screen_alignment) mesh_renderer_props.set_editor_property("FacingMode", mesh_facingmode) elif cascade_screen_alignment == ue.ParticleScreenAlignment.PSA_TYPE_SPECIFIC: return ue.NiagaraMeshFacingMode.DEFAULT elif cascade_screen_alignment == ue.ParticleScreenAlignment.PSA_FACING_CAMERA_DISTANCE_BLEND: return ue.NiagaraMeshFacingMode.CAMERA_PLANE # mesh_renderer_props.set_editor_property("bLockedAxisEnable", ) # mesh_renderer_props.set_editor_property("bLockedAxisEnable", ) # mesh_renderer_props.set_editor_property("LockedAxis", ) else: raise NameError("Unknown cascade_screen_alignment encountered!") - 39 - #unrealfest
“Facing Mode” を反映する (Camera, Velocity) Mesh Particle の “Facing Mode” の変換処理を実装 ※この内容は UnrealEngine 5.6 のコンバーターで対応済み - 40 - #unrealfest
コンバーターの修正例の紹介 “Mesh Material” の設定を有効にする “Facing Mode” を反映する (Camera, Velocity) “Sort Order” の設定を引き継ぐようにする オフにしたモジュールを無効にしたままにする - 41 - #unrealfest
“Sort Order” の設定を引き継ぐようにする Cascade Cascade は通常左から順番に描画 Niagara Niagara は “Sort Order Hint” で設定 - 42 - #unrealfest
“Sort Order” の設定を引き継ぐようにする Cascade の仕様と Niagara の仕様が異なっている (設計・仕様上で異なる点が存在している) - 43 - #unrealfest
“Sort Order” の設定を引き継ぐようにする Cascade と同じく並び順でオーダーを決めるように実装 /Engine/Plugins/FX/CascadeToNiagaraConverter/Content/Python/ CascadeToNiagaraConverter.py def __convert_cascade_to_niagara_system( cascade_particle_system, emitter_properties_converters, module_converters, renderer_converters, niagara_system_context, slow_task ): cascade_emitters = ueFxUtils.get_cascade_system_emitters(cascade_particle_system) context_str = str(cascade_particle_system.get_name() + "| ") # 追加 emitter_index = 0 for cascade_emitter in cascade_emitters: if slow_task.should_cancel(): break niagara_emitter_context = niagara_system_context.add_empty_emitter( ueFxUtils.get_cascade_emitter_name(cascade_emitter)) __convert_cascade_to_niagara_emitter( cascade_emitter, emitter_properties_converters, module_converters, renderer_converters, niagara_emitter_context, slow_task, context_str # 追加 ,emitter_index) ▼インターフェース /Engine/Plugins/FX/CascadeToNiagaraConverter /Content/Python/RendererConverterInterface.py class RendererConverterInterface(object): ▼設定箇所 /Engine/Plugins/FX/CascadeToNiagaraConverter/Content/Python/ RendererConversionScripts/ NullCascadeTypeDataToNiagaraSpriteRenderer.py class SpriteConverter(RendererConverterInterface): @classmethod def get_input_cascade_module(cls): pass @classmethod def convert( cls, cascade_typedata_module, cascade_required_module, niagara_emitter_context, # 追加 emitter_index ): pass # 追加 emitter_index += 1 @classmethod def convert(cls, cascade_typedata_module, cascade_required_module, niagara_emitter_context # 追加 , emitter_index ): # 略 sprite_renderer_props.set_editor_property ("SortMode", niagara_sort_mode) if sort_binding is not None: niagara_emitter_context.set_renderer_binding( sprite_renderer_props, "CustomSortingBinding", sort_binding, ue.NiagaraRendererSourceDataMode.PARTICLES) # 追加 sprite_renderer_props.set_editor_property ("SortOrderHint", emitter_index) niagara_system_context.finalize() - 44 - #unrealfest
“Sort Order” の設定を引き継ぐようにする Cascade と同じく並び順でオーダーを決めるように実装 0 1 2 3 - 45 - #unrealfest
コンバーターの修正例の紹介 “Mesh Material” の設定を有効にする “Facing Mode” を反映する (Camera, Velocity) “Sort Order” の設定を引き継ぐようにする オフにしたモジュールを無効にしたままにする - 46 - #unrealfest
オフにしたモジュールを無効にしたままにする エミッターもモジュールも同じように無効化する必要がある Cascade Niagara エミッターは無効化されるものの、モジュールは無効化されない - 47 - #unrealfest
オフにしたモジュールを無効にしたままにする
モジュールごとに反映するように実装
/Engine/Source/Runtime/Engine/Classes/Particles/
ParticleModule.h
/Engine/Plugins/FX/CascadeToNiagaraConverter/Content/Python/ModuleConversionScripts/
CascadeSpawnToNiagaraSpawn.py
class ENGINE_API UParticleModule : public UObject
{
GENERATED_UCLASS_BODY()
class CascadeSpawnConverter(ModuleConverterInterface):
//
略
UPROPERTY()
uint8 bSupported3DDrawMode:1;
//
//
//
変更前
UPROPERTY()
変更後
UPROPERTY(EditAnywhere, Category=Cascade)
uint8 bEnabled:1;
@classmethod
def convert_spawn_burst(
cls, burst_scale_distribution, burst_method, burst_list, emitter
# 追加
,cascade_module
):
# 略
i = 0
for burst in burst_list:
i += 1
# 略
time_input = ueFxUtils.create_script_input_float(burst.get_editor_property("Time"))
spawn_burst_script.set_parameter("Spawn Time", time_input)
# 追加
spawn_burst_script.set_module_enabled(cascade_module.get_editor_property("bEnabled"))
- 48 -
• CascadeAccelerationDragToNiagaraAccelerationDrag.py
• CascadeAccelerationOverLifetimeToNiagara.py
• CascadeAccelerationToNiagaraAcceleration.py
• CascadeAttractorLineToNiagara.py
• CascadeAttractorPointToNiagara.py
• CascadeCameraOffsetToNiagara.py
• CascadeCollisionToNiagaraCollision.py
• CascadeColorOverLifeToNiagaraColorOverLife.py
• CascadeColorScaleOverLifeToNiagara.py
• CascadeColorToNiagaraColor.py
• CascadeInheritParentVelocityToNiagara.py
• CascadeKillBoxToNiagara.py
• CascadeLightToNiagara.py
• CascadeLocationBoneSocketToNiagara.py
• CascadeLocationCylinderToNiagara.py
• CascadeLocationSphereToNiagara.py
• CascadeMeshRotationRateToNiagara.py
• CascadeParticleLifetimeToNiagaraParticleLifetime.py
• CascadeParticleVelocityToNiagaraParticleVelocity.py
• CascadeRotationRateToNiagaraRotationRate.py
• CascadeSizeMultiplyLifeToNiagara.py#4
• CascadeSizeScaleBySpeedToNiagara.py
• CascadeSizeScaleToNiagara.py
• CascadeSpawnToNiagaraSpawn.py
• CascadeSubUVMovieToNiagara.py
• CascadeSubUVToNiagaraSubUV.py
• CascadeTrailSourceToNiagara.py
• CascadeVelocityByLifeToNiagara.py
• CascadeWorldOffsetToNiagara.py
など・・・
#unrealfest
オフにしたモジュールを無効にしたままにする モジュールごとに反映するように実装 ※UnrealEngine 5.6 のコンバーターでは無効なモジュールは削除される - 49 - #unrealfest
Cascade to Niagara Converter Plugin について(再掲) 実際にはそれぞれの実装状況によって異なる • ほとんど手を入れなくてよいケース • コンバーターが未対応で拡張が必要なケース • Niagara側で仕様が変わることでCascadeと一致しなくなったケース • UnrealEngineの想定外の組み方をしているケース • 独自に拡張した機能を使用しているケース まずは素のコンバーターを利用して いくつかのアセットを変換することが重要 - 50 - #unrealfest
移行後の参照の書き換え(アセット,コード) - 51 - #unrealfest
参照の書き換え(アセット,コード) アセットの変換が進んだので 実際にゲームで利用するために参照を変更する コード アセット アセットの元となるコード DataAsset / Blueprint / Sequencer (DataAsset, Blueprint) AnimSequence(Notify/NotifyState) - 52 - #unrealfest
参照の書き換えの流れ アーティスト Cascade アセットをコンバーターで変換する コードに Niagara の参照枠を追加する 対象のアセットに Niagara アセットを設定する プログラマー Cascade アセットの参照をなくす Niagara アセットを使用するように切り替える - 53 - #unrealfest
参照の書き換えの流れ アーティスト Cascade アセットをコンバーターで変換する コードに Niagara の参照枠を追加する 対象のアセットに Niagara アセットを設定する プログラマー Cascade アセットの参照をなくす Niagara アセットを使用するように切り替える - 54 - #unrealfest
シーケンサーの参照書き換え Cascade アセットをコンバーターで変換する Niagaras Particles PS_XXXXX NS_XXXXX PS_YYYYY NS_YYYYY … … 元のアセットと同階層に同じルールで配置する このルールに沿って参照を取得する - 55 - #unrealfest
参照の書き換えの流れ アーティスト Cascade アセットをコンバーターで変換する コードに Niagara の参照枠を追加する 対象のアセットに Niagara アセットを設定する プログラマー Cascade アセットの参照をなくす Niagara アセットを使用するように切り替える - 56 - #unrealfest
参照の書き換えの流れ コードに Niagara の参照枠を追加する Cascade と Niagara を近い場所で設定できるように 参照箇所を追加する - 57 - #unrealfest
参照の書き換えの流れ アーティスト Cascade アセットをコンバーターで変換する コードに Niagara の参照枠を追加する 対象のアセットに Niagara アセットを設定する プログラマー Cascade アセットの参照をなくす Niagara アセットを使用するように切り替える - 58 - #unrealfest
参照の書き換えの流れ 対象のアセットにNiagaraアセットを設定する EditorUtility を利用して一括設定 (置き換え対象のクラスに合わせたコードを都度実装) - 59 - #unrealfest
EditorUtility について https://dev.epicgames.com/documentation/ja-jp/unreal-engine/scripted-actions-in-unreal-engine より引用 ブループリントで実装した内容に沿って アクターやアセットを操作できる機能 - 60 - #unrealfest
参照の書き換えの流れ 対象のアセットにNiagaraアセットを設定する Cascade アセットが設定されている場合は参照を取得し 先のファイルパスのルールに沿って Niagara アセットを設定 - 61 - #unrealfest
参照の書き換えの流れ アーティスト Cascade アセットをコンバーターで変換する コードに Niagara の参照枠を追加する 対象のアセットに Niagara アセットを設定する プログラマー Cascade アセットの参照をなくす Niagara アセットを使用するように切り替える - 62 - #unrealfest
参照の書き換えの流れ Cascade アセットの参照をなくす Niagara アセットを使用するように切り替える 参照を消した上で処理を切り替えるように進行 - 63 - #unrealfest
参照の書き換え(アセット,コード) 対応に手間がかかるのが “シーケンサー” • レベルに配置している Cascade アセットの差し替え • 各トラックに設定している内容の差し替え • Niagara における仕様変更部分への対応 EditorUtility を利用しつつ Cascade から Niagara へ置き換え - 64 - #unrealfest
シーケンサーの参照書き換えの流れ アーティスト Cascade アセットをコンバーターで変換する プログラマー EditorUtility で置換するツールを実装する 実装したツールでシーケンサーを変換する アーティスト 必要に応じて調整を行う - 65 - #unrealfest
シーケンサーの参照書き換えの流れ アーティスト Cascade アセットをコンバーターで変換する プログラマー EditorUtility で置換するツールを実装する 実装したツールでシーケンサーを変換する アーティスト 必要に応じて調整を行う - 66 - #unrealfest
シーケンサーの参照書き換え Cascadeアセットをコンバーターで変換する Niagaras Particles PS_XXXXX NS_XXXXX PS_YYYYY NS_YYYYY … … 先と同じく元のアセットと同階層に同じルールで配置する 同じルールにすることで同じ処理で対応可能になる - 67 - #unrealfest
シーケンサーの参照書き換えの流れ アーティスト Cascade アセットをコンバーターで変換する プログラマー EditorUtility で置換するツールを実装する 実装したツールでシーケンサーを変換する アーティスト 必要に応じて調整を行う - 68 - #unrealfest
シーケンサーの参照書き換え EditorUtility で置換するツールを実装する Cascade と同じ座標・設定になるよう Niagara を配置する 動作確認用に Cascade は一旦残す(後に削除する) - 69 - #unrealfest
シーケンサーの参照書き換えの流れ アーティスト Cascade アセットをコンバーターで変換する プログラマー EditorUtility で置換するツールを実装する 実装したツールでシーケンサーを変換する アーティスト 必要に応じて調整を行う - 70 - #unrealfest
シーケンサーの参照書き換え 実装したツールでシーケンサーを変換する レベルに紐付くレベルシーケンスを変換する - 71 - #unrealfest
シーケンサーの参照書き換えの流れ アーティスト Cascade アセットをコンバーターで変換する プログラマー EditorUtility で置換するツールを実装する 実装したツールでシーケンサーを変換する アーティスト 必要に応じて調整を行う - 72 - #unrealfest
シーケンサーの参照書き換え 必要に応じて調整を行う シーケンス上には Cascade も Niagara もあるため 両方確認しながら最終調整を行う - 73 - #unrealfest
移行をより効率的に行うツールの用意 - 74 - #unrealfest
移行をより効率的に行うツールの用意 オフになっているモジュール・エミッターの削除 警告が出ているアセットのサムネイルを変更 - 75 - #unrealfest
移行をより効率的に行うツールの用意 オフになっているモジュール・エミッターの削除 警告が出ているアセットのサムネイルを変更 - 76 - #unrealfest
オフになっているモジュール・エミッターの削除 制作の都合などの事情でオフになっている モジュールやエミッターが数多く存在している (最終的に利用しなくなった など) - 77 - #unrealfest
オフになっているモジュール・エミッターの削除 オフにしているだけでは問題が発生する • 意図せず有効化した場合に表示の問題が生じる • ロードされるのでメモリやパフォーマンス面に影響する • 手動でひとつひとつ削除するには時間がかかる EditorUtility を利用し オフになっているモジュールとエミッターを削除 - 78 - #unrealfest
オフになっているモジュール・エミッターの削除 - 79 - #unrealfest
移行をより効率的に行うツールの用意 オフになっているモジュール・エミッターの削除 警告が出ているアセットのサムネイルを変更 - 80 - #unrealfest
警告が出ているアセットのサムネイルを変更 コンバーターの変換は大きな括りで行われるため 警告の存在に気付きにくく埋もれる可能性がある - 81 - #unrealfest
警告が出ているアセットのサムネイルを変更 警告が出ているNiagaraアセットのサムネイルを 一括変更することでエディタ上でもわかりやすくする - 82 - #unrealfest
警告が出ているアセットのサムネイルを変更 エンジンのアップデート時にモジュールが更新され 警告が出るようになるケースの検知としても利用 - 83 - #unrealfest
コンバーターでも対応できなかった箇所について - 84 - #unrealfest
コンバーターでも対応できなかった箇所について Cascade と Niagara の挙動が異なる実装になっており 互換性が保たれていない箇所があった Cascade と Niagara の仕様そのものが違っており コンバーターの拡張では吸収できない Niagara(モジュール)の改変が必要に - 85 - #unrealfest
Niagaraのモジュールについて https://dev.epicgames.com/documentation/ja-jp/unreal-engine/overview-of-niagara-effects-for-unreal-engine より引用 各モジュールが「Niagara Module Script」という アセットとして存在している - 86 - #unrealfest
Niagaraのモジュールについて 既存のアセットの拡張やアセット追加で独自実装が可能 Engine Plugins FX Niagara Content Modules Spawn Velocity AddVelocity.uasset モジュールの拡張を実施 - 87 - #unrealfest
モジュールを拡張した例 異なるエミッターで同一のシード値を使用しても一致しない - 88 - #unrealfest
モジュールを拡張した例 異なるエミッターで同一のシード値を使用しても一致しない Cascade Niagara ※ それぞれのエミッターにある “Shape Location (Cylinder)” に同じシード値を設定 - 89 - #unrealfest
モジュールを拡張した例 CascadeとNiagaraで仕様が異なることで発生している • Cascade はシード値さえ一致していれば同じ挙動になっていた • Niagara のランダムの計算のシード値にエミッター名が使用されている • Niagara は同名のエミッター名は使用できないため同じ挙動にならない Cascade と同じようにシード値が一致すれば 同じ見た目になるように拡張する - 90 - #unrealfest
モジュールを拡張した例(抜粋) Seed: シード値を返すノード Translator.CellID: エミッター名などから ユニークな値を返すノード ※この箇所以外も修正があります /Niagara/Functions/V2/CalculateRandomRange から抜粋 - 91 - #unrealfest
モジュールを拡張した例(抜粋) エミッター上で設定を切り替えられるように パラメータを公開するように変更 - 92 - #unrealfest
モジュールを拡張した例 異なるエミッターでも同一シード値は同じように表示可能に - 93 - #unrealfest
モジュールの適用について - 94 - #unrealfest
モジュールの配置について すでに存在するモジュールを書き換える必要がある • 多数のエンジン側のモジュールを書き換える必要があった • 今後のエンジンアップデート時に上書きしてしまう可能性があった • 拡張したものとそうでないものを両方保持しておきたかった 専用のプラグインを作成し 拡張したモジュールを格納するように - 95 - #unrealfest
モジュールの配置について ディレクトリ構造が一致するように配置し ファイル名にサフィックスを付与する Engine Plugins FX Niagara Content Modules Spawn Velocity AddVelocity.uasset Project Plugins CustomNiagaraModules Content Niagara Modules Spawn Velocity AddVelocity_CC2.uasset - 96 - #unrealfest
モジュールの配置について ツール類での差し替え対応を行いやすくする Engine Plugins FX Niagara Content Modules Spawn Velocity AddVelocity.uasset Project Plugins CustomNiagaraModules Content Niagara Modules Spawn Velocity AddVelocity_CC2.uasset - 97 - #unrealfest
モジュールの適用について モジュールの適用方法は下記を用意 コンバーター EditorUtility Cascadeから変換する際に すでに変換しているアセットの モジュールの差し替えも行う モジュールの差し替えを行う 変換作業の途中だったため 状況に合わせて使い分ける形にした - 98 - #unrealfest
モジュールの適用について コンバーターも EditorUtility も流れは同じ Niagara内に対象のモジュールがあるかチェック 対象のモジュールがある場合はモジュールを置換 置換した場合のみNiagaraアセットを保存 - 99 - #unrealfest
モジュールの適用について 基本的には拡張後のモジュールを使用することにしたが 適用忘れなどが発生していたため下記の機能も追加 DataValidation コマンドレット 新規実装時に漏れていた場合 アセットが固まった段階で 保存時に警告を出す 一括で処理 - 100 - #unrealfest
DataValidation について https://dev.epicgames.com/documentation/ja-jp/unreal-engine/data-validation-in-unreal-engine より引用 独自のアセットチェックを実装することができるプラグイン コードによって柔軟に制御できる - 101 - #unrealfest
DataValidation について アセットの保存時などに任意のチェック処理を実行し メッセージログに警告などを表示できる アセットの作成者が保存時に自分で気付ける - 102 - #unrealfest
コマンドレットについて エディタを起動せずに任意の処理を実行する機能 アセットの一括処理などで有用 %EngineRoot%¥Engine¥Binaries¥Win64¥UnrealEditor-Cmd.exe MyProject.uproject -run=MyCommandlet アセット作成が落ち着いた段階で一括処理し 設定漏れが発生しないように対応 - 103 - #unrealfest
モジュールの適用について 今回のケースのように 新しく実装する場合は発生しない点も Cascade から移行している都合上 (動作を維持する都合上) 拡張する必要が生じる場合もあります - 104 - #unrealfest
モジュールの適用について 今回はCascadeの互換性維持の話でしたが Niagaraを使用するにあたり より便利に・よりよくするために 独自で拡張を行ったモジュールもあります - 105 - #unrealfest
実際に運用しての振り返り - 106 - #unrealfest
あるタイトルでの移行について 移行のスケジュール(概要) プログラマー対応 アーティスト対応 開始 1 2 3 4 5 6 7 8 9 10 完了 ※上記は期間・内容を簡略化したスケジュールです - 107 - #unrealfest
あるタイトルでの移行について 移行のスケジュール(概要) 開始 1 2 3 4 5 6 7 8 9 10 完了 ※上記は期間・内容を簡略化したスケジュールです - 108 - #unrealfest
あるタイトルでの移行について 移行のスケジュール(概要) コンバーターの拡張・ツールの整備 開始 1 2 3 4 5 6 7 8 9 10 完了 ※上記は期間・内容を簡略化したスケジュールです - 109 - #unrealfest
あるタイトルでの移行について 移行のスケジュール(概要) 参照の修正準備 開始 1 2 3 4 5 6 7 8 9 10 完了 ※上記は期間・内容を簡略化したスケジュールです - 110 - #unrealfest
あるタイトルでの移行について 移行のスケジュール(概要) 移行サポート・ツール拡張 開始 1 2 3 4 5 6 7 8 9 10 完了 ※上記は期間・内容を簡略化したスケジュールです - 111 - #unrealfest
あるタイトルでの移行について 移行のスケジュール(概要) 移行後の整理・調整 開始 1 2 3 4 5 6 7 8 9 10 完了 ※上記は期間・内容を簡略化したスケジュールです - 112 - #unrealfest
あるタイトルでの移行について 移行のスケジュール(概要) アセットの変換・参照の変更 開始 1 2 3 4 5 6 7 8 9 10 完了 ※上記は期間・内容を簡略化したスケジュールです - 113 - #unrealfest
あるタイトルでの移行について 移行のスケジュール(概要) シーケンサーの変換・調整 開始 1 2 3 4 5 6 7 8 9 10 完了 ※上記は期間・内容を簡略化したスケジュールです - 114 - #unrealfest
あるタイトルでの移行について 移行のスケジュール(概要) 開始 1 2 3 4 5 6 7 8 9 10 完了 ※上記は期間・内容を簡略化したスケジュールです - 115 - #unrealfest
実際に運用しての振り返り 効果があった箇所 変換後に調整はあるものの 大量の Cascade アセットを一定数自動で変換できた • 約 4300 アセット分の Cascade アセットの変換 • 約 1600 箇所以上のシーケンサートラックの再配置 • 約 1800 アセット分の AnimationNotify の再設定 ※概算 - 116 - #unrealfest
実際に運用しての振り返り 大変だった箇所 想定以上にエンジンやコンバーターの変更を行ったり モジュールの変更やツールの用意を行う必要があった • 約 40 種類のエンジン修正 • 約 30 種類のコンバーターの拡張対応 • 約 30 種類のモジュールの拡張対応 • 約 10 種類のツールの実装対応 ※概算 - 117 - #unrealfest
実際に運用しての振り返り 副次的な効果 他のタイトルでも流用できるケースがあった • エンジンとプラグインとツールのセットがあれば利用できる (一度コンバートするためのプロジェクトとして用意できる) • 過去作のリソースを仮アセットや検証用のデータとして使用できる - 118 - #unrealfest
おわりに - 119 - #unrealfest
おわりに あるタイトルにおける Cascade を Niagara に移行する事例 • Cascade to Niagara Converter Plugin による移行 • コンバーターの拡張による Niagara 変換内容の向上 • モジュールの拡張や EditorUtility などのツールでのサポート 対応すべき点は Cascade アセットの個数や内容 ゲームそのものの実装内容によって大きく変わる - 120 - #unrealfest
おわりに 最初にコンバーターを利用した変換を確認した後で どのような対応が必要なのかを検討していくことが重要 コンバーターの拡張が必要か? ツールによるサポートは必要か? 参照の変更にはどのような作業が必要か? - 121 - #unrealfest
おわりに 現状は Cascade も使用できますが 新しく制作する場合は Niagaraを選択ことが多いと思います - 122 - #unrealfest
おわりに 過去の作品からの流用や移行など Cascade から Niagara に移行する際や 日々の開発に 今回紹介した内容が みなさまの助けになりますと幸いです - 123 - #unrealfest
おわりに ご清聴ありがとうございました - 124 - #unrealfest