HOME

Maneki Pipeline

ゲーム開発のためのプロシージャル

PublicAPIを使ってUnrealEngineのEUWからHoudiniEngineを利用する③

BPからツールとしてHDAを実行する。

現在、株式会社クリーク・アンド・リバー社/ COYOTE TECHNICAL ART TEAMの方々と一緒に、「Houdiniをパイプラインとして利用する仕組みを検証・開発」する「Feshdini」というプロジェクトを進めています。
本稿はそれに基づいて調べた内容の一部となります。


概要

前回の記事
PublicAPIを使ってUnrealEngineのEUWからHoudiniEngineを利用する①
PublicAPIを使ってUnrealEngineのEUWからHoudiniEngineを利用する②

HoudiniEngineをUnrealで利用したい場合、ユーザーライクなUE用のHDAツールを作成する場合はこの機能で呼び出して利用する形になると思う。

EUWのイメージ

本稿はこの呼び出しを行うための方法となる。

前回はEUW上から呼び出したHDAが動作するところまで来ることができた。
今回はhdaにノード入力以外のパラメータを設定する方法とデリゲータについて触れていく

デリゲータの必要性について

BPとHoudiniEngineは非同期で動作する

BPによる処理とHoudiniEngineによる処理は非同期で行われている。
そのためHDAを組合わせた処理を作成しようとした場合、以下のように呼び出した処理が実行出来ずに処理が中断してしまう場合がある。

HDA Actor作成後、すぐに入力を設定しようとする構成
HDA Actorが処理中のため、UnrealEngineからの支持を受け入れることができずに警告が出てしまう

ProcessHDAに用意されている出力はこれをカバーするためのものだが、(前回の記事参照)この機能はノード作成時のみにしか利用出来ない。

ProcessHDAの出力でHDA Actor作成時のみ、処理の待機ができる

そのため、例えば次に上げるような場合にはProcessHDAの待機だけでは想定通りに動作できない場合が考えられる

ProcessHDAによる待機のみでは処理中を完了できないパターン

以下のようなパターンではProcessHDAによる待機だけでは想定通りに処理を行えない場合がある。

  • 例①:HDA作成後、配置済みHDAのパラメータ調整などを行った後にBPによる操作を行う場合
    処理の待機ができるのは配置時のみなのでパラメータ調整が結果に反映するまで待機しないまま処理を行ってしまう可能性がある
  • 例②:複数のHDAを特定の順番に呼び出す処理を行う場合
    HDAが複数になった場合、処理の待機が複雑になるため後工程であるべき処理が先に完了してしまうと正しい処理順で実行できない可能性がある。
  • 例③:複数回のクック/ベイクを実行する必要がある場合
    重い処理などで段階的なクックを行った後にベイクを行うような工程の場合。ProcessHDAのクック待機は単一のみなので一つのノードで複数回のクックを行う場合は個別の待機が難しい。

こういった処理を行う場合に処理順を明確にするためにデリゲータを利用する。

デリゲータ

非同期で動作する問題を回避するためにPublicAPIでは特定処理が完了するまで処理を待機する「デリゲータ」という仕組みが用意されている

PubicAPIの「Assign On ~」を作成するとカスタムイベントと処理に紐づけるための「Bind ~ 」というノードが作成される

特定の動作とイベントに紐づけて動作を開始し、紐づけた動作が完了すると指定したイベントが実行される。これでHDAの処理完了後に指定の動作順で処理を行うことができる。

デリゲータを利用すると指定の処理が実行後に特定のイベントの処理が開始するような構成が作れる

デリゲータを用いた処理の待機構成例

例:デリゲータで操作の結果をUIに反映、待機する

前述の「デリゲータを使わないと想定した処理順にできない場合がある例」の①。
以下はパラメータ操作が作成のタイミングと分離している構成。
パラメータ操作が反映中にベイクなどの処理が呼び出された場合、クックが完了していないと次の処理に移行できない場合がある。

UIによるパラメータ設定とベイクを含めるような構成
UI操作などでパラメータ反映後にベイクをするような場合。ProcessHDAは作成時のみ処理待機できるので作成後に何度か処理を行う場合は相性が悪い

作成後に待機が必要な場合、デリゲータでフラグ管理や処理順の制御を行うことでコントロールすることができる、

※「OnPostCookDelegate」と「OnPostProcessingDelegate」があるが、OnPostCookDelegateはHoudiniの内部の処理完了待機のみで、OnPostProcessingDelegateがUnrealEngineに結果を反映させた後に待機が完了する処理。この例の場合、次の工程の処理はUnrealEngine上なのでOnPostProcessingDelegateを使っている。


実用的なものを作っているとBluePrintとの連携、不要データの削除、実行可能かどうかの判定など、デリゲートはかなり頻繁に使います。(今回の例示だけだとあまりピンとこない気がしますが)

fish_ball

プロシージャル魚類