[BP]Blueprintアンチパターン その3 -Select+SetByRefVar-

今回は、ゲーム制作を通して実際に遭遇したBlueprintのアンチパターンについて紹介したいと思います。

SelectノードをIncrementノードに繋げる

まず、図1のように繋ぎます。
図1 Selectノードを通してIncrementする
ピン形状的に問題はなさそうに見えます。また、これはPIE上で正しく動作(IndexがFalseならTestVarAが1に、TrueならTestVarBが1にインクリメントされる)します。
しかし、この繋ぎ方をするとパッケージ化に失敗します。

おそらくバグかと思われますが、調べてみると類似の問題がUE4.11から発生しているらしく、修正が困難な例なのかもしれません。

問題の単純化

問題はIncrementノードに繋いでいるから発生しているわけではありません。同じようなことはDecrementでも起こります。
大本の原因は、図2のようにSetBy-RefVarノード(「リファレンス渡し変数を設定」ノード)に直接Selectノードを繋げることで起きています。Incrementノードは内部的にSetBy-RefVarノードを用いるマクロですから、マクロが展開されたときに問題の繋ぎ方をしてしまい、パッケージ化に失敗してしまいます。
図2 SelectノードにSetBy-RefVarノードを繋げる

回避方法

問題は「直接」繋ぐことで起きています。
これは図3のように関数でラップすれば回避できることを意味しています。
図3 Incrementとほぼ同じ実装の関数
このような関数を代わりに使うと、パッケージ化で失敗する問題を回避できるようです。
もしくは、単純にブランチでインクリメントする変数を分岐する方が良いかもしれません。


この記事は次のバージョンで作成されました。
Unreal Editor(4.15.1-3348071+++UE4+Release-4.15)

コメント