NiagaraScript にpythonやc++からアクセスする手段について

お世話になっております。

<br/>

氷が砕ける際に破片がそれぞれ異なる自転を行うようなエフェクトをアーティストのほうで作成しています。

それぞれの破片に対してShape Location を設定し、Shape Location > Transform > Offset に各破片の pivot 位置を Maya から手動で入力して実現しているとのことで、破片の数が増えると手入力に時間がかかるため自動設定したいという要望が来ています。

調べた限りでは Shape Location の実装は Niagara Script で行われており python や c++ からのアクセスは難しそうだったのですが、なにか手段はありますでしょうか?

あるいは、今回の目的に対して Shape Location を破片の数だけ用意する以外に適当な手段はありますでしょうか?

<br/>

お忙しいところ恐縮ですが、ご確認いただけますと幸いです。

以上よろしくお願いいたします。

[Attachment Removed]

お世話になっております。

ご調査いただいた通り、UE5.7の段階ではC++/PythonからNiagara Scriptにアクセスすることができません。UE5.8では MCP Toolkits が整備された関係で、(LLMを前提とした)Niagaraの操作機能が大幅しておりますが、UE5.7の段階ではC++/PythonからプログラムでNiagaraを作成・編集することについて、ほとんど打つ手がないというのが正直なところです。

> あるいは、今回の目的に対して Shape Location を破片の数だけ用意する以外に適当な手段はありますでしょうか?

お恥ずかしながら、当方ではまだShape Locationを通じて達成なされてようとしていることを正確に把握できておらず、この点について、詳細をお聞かせいただけますと幸いです。

「氷が砕けて破片が散る」という演出にもいろいろありますので、当方が想像しているものがお手元の実際のエフェクトとかなり異なっていると思われますが、「ひとかたまりの氷が、演出がはじまると複数の破片に分かれてパーティクルエフェクトとして砕け散る」という"ワンショット"のエフェクトであれば、Pivotをモデル原点にもつ破片メッシュをを飛ばせば特別なpivot設定なく簡単に自転させることができますし、この破片を特定の位置に配置してから運動を開始させるなら Spawn Burst を使い、Particle Spawn セクションで Set: Particle.Position で座標を書き込むという手があると思います(もちろん、ここで座標の配列を手で埋めなければならないという課題は生じます)。

現在の破片の数だけShape Locationを設定するというのは、単一のエミッタの中に複数のShape Locationを追加し、Shape Locationにつき1つの破片を生成させて動かしている(この発生源の位置を指定位置にずらすために Transform > Offset でシステム原点から位置を調整されている)という理解であっておりますでしょうか。演出中、そのShapeLocationから常に破片が発生しなければならないため、1つのシステムに複数のShapeLocationが必要という判断になっている、ということになりますでしょうか。

一旦お返事申し上げます。

以上、よろしくお願いいたします。

[Attachment Removed]

お世話になっております。

返信遅くなり申し訳ありません。

Niagara Script へのアクセスについて、UE5.7では難しい旨承知いたしました。

UE5.8へのアップデートを検討中なのですが、5.8へ更新した場合に今回のような事例に対応するならば MCP Toolkits を利用して Niagara Script にアクセスする方法が推奨されるということになるでしょうか?

あるいは MCP Toolkits 経由のアクセス手段を C++/Phthon などで無理矢理使うことも可能なのでしょうか?

Shape Location を通じて達成したい内容については詳細をアーティストに確認中となります。

申し訳ありませんがこちらに関しては今しばらく返答をお待ちいただけますと幸いです。

以上、お忙しいところ恐縮ですがよろしくお願いいたします。

[Attachment Removed]

お世話になっております。

Shape Location を用いて達成したい表現については以前ご記載いただいた「ひとかたまりの氷が、演出がはじまると複数の破片に分かれてパーティクルエフェクトとして砕け散る」で合っているとのことです。

例えば動画1のような表現を実現する場合、現在は以下の手順を踏んでいます。

1. モデルを破片分割

2. 破片モデルの中心にピボットを移動させたうえで、座標原点に移動(移動量をメモしておく)

3. UEへモデルをインポート

4. 破片の初期位置を設定するために、ShapeLocationのOffsetに「メモしておいた移動量を相殺する値」を破片ごとに設定する(動画2参照)

動画では破片数が3個と少ないため 2 のメモと 4 の手入力が少なく済んでいますが、破片数が多いと手間になるため自動化したいという状況です。

> 現在の破片の数だけShape Locationを設定するというのは、単一のエミッタの中に複数のShape Locationを追加し、Shape Locationにつき1つの破片を生成させて動かしている(この発生源の位置を指定位置にずらすために Transform > Offset でシステム原点から位置を調整されている)という理解であっておりますでしょうか。演出中、そのShapeLocationから常に破片が発生しなければならないため、1つのシステムに複数のShapeLocationが必要という判断になっている、ということになりますでしょうか。

に関してもご記載いただいた通りとのことでした。

以上、お手数ですがご確認いただけますと幸いです。

よろしくお願いいたします。

[Attachment Removed]

連投となり申し訳ありませんが、動画が1つしか添付できなかったため追加で添付いたします。

よろしくお願いいたします。

[Attachment Removed]

お世話になっております。

詳細なご回答ありがとうございます。

UE5.8にすれば何らかのアクセス手段がありそうとのことですので、プロジェクトに共有のうえ検討進めます。

直近でUE5.8へ更新するかは不透明なので、UE5.7の段階で作業軽量化手段があるようでしたら非常にありがたいです。

お手数ですが、引き続きご調査いただけますと幸いです。

以上、よろしくお願いいたします。

[Attachment Removed]

お世話になっております。

​

ご提案ありがとうございます。

いただいた内容をアーティストに共有いたしましたので、進展がありましたらご連絡いたします。

​

お手数ですが、よろしくお願いいたします。​

[Attachment Removed]

お世話になっております。

資料のご提供ありがとうございます。

> UE5.8へのアップデートを検討中なのですが、5.8へ更新した場合に今回のような事例に対応するならば MCP Toolkits を利用して Niagara Script にアクセスする方法が推奨されるということになるでしょうか?

> あるいは MCP Toolkits 経由のアクセス手段を C++/Phthon などで無理矢理使うことも可能なのでしょうか?

こちらについてですが、MCPのツールセットからNiagaraの編集ができるように、5.8で UNiagaraExternalEditUtilities というクラスが追加されております。このクラスは現在のところ全関数がAPI化されているため、C++で書いたツールから直叩き可能です。

また、MCPのツールとして公開することを前提としたNiagaraのツールセットの関数も現在のところPythonからコールすることができるようでして、LLMなしの人手で書いたPythonコードでツールを利用し、Niagaraの編集が可能ではあります(ただしMCPの利用法に基づいてPythonからコールする形となりますので、こちらはかなり書きづらいと思われます)。

まとめますと、ご質問の意図かと思いますが、MCP対応を主目的として行われた5.8での変更によって、従来ほとんど不可能だったC++/PythonからNiagaraを変更する経路が新たに登場していると考えていただいて差し支えございません。ただし、背景はあくまでMCPツールセットへの機能公開であり、この実現のためにやむをえずAPIを付けた、というニュアンスがあるようでして、今後の開発でこうした経路がふさがれていく恐れもあります。

また、いただいた映像資料をもとに、UE5.7の段階でご提案できる作業軽量化の手段がないか、改めて調査したいと思います。

以上、よろしくお願いいたします。

[Attachment Removed]

お世話になっております。

ご返信が遅れまして大変申し訳ありません。

いろいろテストをしてみたところ、ご提案できそうな手順が見つかりました。

UE5.7の段階では、Niagaraシステムのエミッタやエミッタのモジュールの内容をpythonなどから読み書きすることはできません。しかし、ユーザーパラメータがDynamic Inputタイプであれば、set_editor_propertyで読み書きができそうでして、

・各氷破片はモデル原点で書き出す

・各氷破片の初期ポジション、使用メッシュは配列型ユーザーパラメータでもつ

[Image Removed]・各破片の初期ポジションは、Shape Locationを複数並べるのではなく、Set Particles.Position 1個で書き込む

という形で、まずユーザーパラメータの配列を受け取って動かすアプローチにエミッタを変更可能でしょうか?

[Image Removed]上図において、Set Particles.MeshIndexは Return Exec Indexをバインドし、

[Image Removed]Set Particles.Positionでは単純にユーザーパラメータのPosition Arrayを流し込み、Mesh RendererではMeshes Bindingでユーザーパラメータをバインドしております。

この組み方でも従来通りのVFXの動かし方が可能であれば、あとは、

・①DCCツールから書き出したデータを、ユーザーパラメータとして流し込む(動的解決)

・②もしくは、DCCツールから書き出したデータを、Pythonでアセットのユーザーパラメータの初期値として流し込む(静的解決)

が可能です。

②の場合、このVFX表現のテンプレートを1アセットどこかにおいておき、Pythonでコピーを作ってユーザーパラメータを流し込む、ということができると思われます。

以上、概略ではございますが、一度複数モジュールではなく、データのほうを複数(配列)にする方法で同VFXを作成できそうか、ご確認いただけますと幸いです。

よろしくお願いいたします。

[Attachment Removed]

ありがとうございます。

お忙しいところ恐縮ですが、ご確認のほどよろしくお願いいたします。

※案件管理上、一旦本チケットをPending(ご返信待ち)ステータスに設定して保持させていただければと存じます。

以上、よろしくお願いいたします。

[Attachment Removed]