Edited at

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

More than 1 year has passed since last update.


初めに結論



  • 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への参照入力ピンの有無に影響