LoginSignup
6
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-02-10

初めに結論

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6