初めに結論
-
pure
はドキュメントとは異なりクラスのメンバーを変更可能 -
const
ならばクラスのメンバーを変更できない - 実行ピンを消すのは
pure
,const
は変わらない
説明
Blueprintの関数にはpureのオプションとconstのオプションがある。
pureのオプションを有効にするとそのBPの関数は「純粋関数」となるとドキュメントでは説明されている。
関数は 純粋関数 または 非純粋関数 のどちらかになります。両者の大きな違いは、純粋関数がステートやクラスのメンバーを一切変更しないのに対し、 非純粋関数はステートを自由に変更します。純粋関数は通常、データ値を出力するだけの getter 関数や演算子に使用されます。
https://docs.unrealengine.com/latest/JPN/Engine/Blueprints/UserGuide/Functions/index.html#純粋関数と非純粋関数
一方、constのオプションは普段は隠されており、ドキュメント中には明確な説明はない。
比較表
挙動を調べると以下のような違いがある。
通常 | pure | const | pure & const | |
---|---|---|---|---|
sample | ||||
実行ピン | あり | なし | あり | なし |
メンバーの変更 | 可能 | 可能 | 不可 | 不可 |
Selfへの参照入力pin (除くBP関数ライブラリ) |
あり | なし | あり | あり |
メンバーの変更
たとえば関数の中身が以下のようなグラフとする。
※param
はクラスのprivateメンバー変数
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への参照入力ピンの有無に影響