Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What is going on with this article?
@ConquestArrow

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

More than 3 years have 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への参照入力ピンの有無に影響
5
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ConquestArrow
ノンプログラマです。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
5
Help us understand the problem. What is going on with this article?