[UE4]Blueprintの関数のpureとconstの違い

  • 1
    Like
  • 0
    Comment

初めに結論

  • pureはドキュメントとは異なりクラスのメンバーを変更可能
  • constならばクラスのメンバーを変更できない
  • 実行ピンを消すのはpure, constは変わらない

説明

Blueprintの関数にはpureのオプションとconstのオプションがある。

pureのオプションを有効にするとそのBPの関数は「純粋関数」となるとドキュメントでは説明されている。

関数は 純粋関数 または 非純粋関数 のどちらかになります。両者の大きな違いは、純粋関数がステートやクラスのメンバーを一切変更しないのに対し、 非純粋関数はステートを自由に変更します。純粋関数は通常、データ値を出力するだけの getter 関数や演算子に使用されます。
https://docs.unrealengine.com/latest/JPN/Engine/Blueprints/UserGuide/Functions/index.html#純粋関数と非純粋関数

一方、constのオプションは普段は隠されており、ドキュメント中には明確な説明はない。

option_setting_details.PNG

比較表

挙動を調べると以下のような違いがある。

通常 pure const pure & const
sample normal_fn.PNG pure_fn.PNG const_fn.PNG constpure_fn.PNG
実行ピン あり なし あり なし
メンバーの変更 可能 可能 不可 不可
Selfへの参照入力pin
(除くBP関数ライブラリ)
あり なし あり あり

メンバーの変更

たとえば関数の中身が以下のようなグラフとする。
paramはクラスのprivateメンバー変数
code.PNG

pureを設定した場合、返り値の値は変更後の値が返ってくる。

一方、constを設定すると、そもそもこのグラフはコンパイルできない。

Error Variable  param  is read-only within this context and cannot be set to a new value

Selfへの参照入力pin

クラスBPやLvBPで関数を作成すると、通常はデフォルトがSelfを指すObjectリファレンス型の入力ピン(引数)が自動でノードにつく。

pureを設定するとSelf入力ピンはつかないが、constを設定した場合はつく。両方設定した場合はconstが優先となって入力ピンがつく。

※Blueprint関数ライブラリの関数を除く

まとめ

  • BPの純粋関数は実はクラスのメンバーを変更可能
  • 変えられなくするためにはconstをつける
  • pureは主に実行ピンの有り無し、selfへの参照入力ピンの有無に影響