![見出し画像](https://assets.st-note.com/production/uploads/images/70685354/rectangle_large_type_2_bae3d428975cff30efa19f5d7d8b4c1c.jpeg?width=1200)
UE5から始める C++ & BP 10 【Blueprint版】Function(関数)
最初関数を作る意味がよく分かりませんでした。
10年前くらいのC言語のソースコードを新しいOSで動くようにするプロジェクトに参加した時に、1000行近いmain関数を読む機会がありました。
何をやっているか意味が分かりませんでした。
1000行も上から下に処理が書かれていると、意味が分からなくなります。
処理をまとめて関数化していきました。
あぁ、これはこういう処理なのか。
そうか!関数はこういうことが起こらないために作るのか。
やっと、関数を作る意味を知ることができました。
1000行のmain関数は極端な例ですが、後の人に理解してもらえるコードを書いていると未来の自分が助かります。
未来の自分を助けるプログラミングを心がけています。
前回は「Enumeration(列挙型)」方法について調査しました。
今回は「Function(関数)」方法について調査していきます。
【Blueprint版】Function(関数)
今回できること
[Add]ノードを再現するFunctionを作成します。
![](https://assets.st-note.com/img/1643094231412-hBYu1zXsBK.png?width=1200)
計算結果の出力処理をFunction化します。
![](https://assets.st-note.com/img/1643094248228-pkXeizAzSy.png?width=1200)
学習用の新規レベル「Chapter_2_Function」を作成する
学習用の新規レベルを作成します。
[File]メニューから[New Level…]を選択します。
![](https://assets.st-note.com/img/1643094270590-VFNoboBkIp.png)
[Default]を選択します。
![](https://assets.st-note.com/img/1643094281130-5KcOdGCZmO.png)
「Maps」フォルダに「Chapter_2_Function」を入力し、[Save]ボタンをクリックします。
![](https://assets.st-note.com/img/1643094290249-HAvEcfE1S8.png?width=1200)
Blueprintを複製する
「BP_FlowControl_SwitchEnum」を複製(Ctrl + W)して、「BP_Function」を作成します。
![](https://assets.st-note.com/img/1643094301516-POeXhQPGMd.png?width=1200)
Function[Sum]を作成する
Blueprintの[Add]ノードを再現したFunction[Sum]を作成します。
![](https://assets.st-note.com/img/1643094312183-MYdPFhbgyV.png)
Functionに[Sum]を追加します。
[My Blueprint]パネルのFunctionsカテゴリ右側の[+]をクリックします。
Functionが新しく作成されるので、名前を[Sum]に設定します。
GraphにはFunction名のノードが作成されます。
Functionの開始地点となるノードです。
![](https://assets.st-note.com/img/1643094320149-tUHCumEZai.png)
InputとOutputを追加します。
![](https://assets.st-note.com/img/1643094335058-O1UPsCxGYH.png)
![](https://assets.st-note.com/img/1643094346519-fXQ1hHdGUS.png?width=1200)
Addノードを追加します
![](https://assets.st-note.com/img/1643094356944-Hg81qLD4ur.png)
InputのA,Bを[Add]ノードで計算するように接続します。
[Add]ノードのOutputを[Return Node]の[ReturnValue]に接続します。
![](https://assets.st-note.com/img/1643094365304-1zlfQNOh1j.png)
Function[Sum]をEvent Grapthに追加します。
追加方法は2種類あります。
[My Blueprint]からFunction[Sum]をDrag&Dropする。
メニューで[Sum]を検索して選択する。
![](https://assets.st-note.com/img/1643094374754-NSFBMEDn8T.png?width=1200)
Function[Sum]を実行するように、実行ピンを接続しなおします。
Function[Sum]のInput[A][B]に変数[CalcValueA],[CalcValueB]を接続します。
Function[Sum]のOutput[ReturnValue]を[IntegerからString変換]ノードに接続します。
![](https://assets.st-note.com/img/1643094383269-WPnn4tInIZ.png?width=1200)
Function[Sum]の実行ピンを通過するように、変数[CalcType]のDefaultValueを[Add]に変更します。
![](https://assets.st-note.com/img/1643094391890-3jDadcrO4L.png)
[Compile]ボタンをクリックします。
![](https://assets.st-note.com/img/1643094399483-KI96Toj1Ga.png)
LevelEditorに戻り、「BP_Function」をViewportにDrag&Dropします。
![](https://assets.st-note.com/img/1643094406223-ErgtTSyvZl.png?width=1200)
Level Editorの[Play]ボタンをクリックします。
![](https://assets.st-note.com/img/1643094413725-ebVD5Zczzt.png)
Function[Sum]で計算した結果が表示されます。
![](https://assets.st-note.com/img/1643094421515-UJ7cpnuwKo.png)
Functionを使用した時の処理の流れは図のようになります。
![](https://assets.st-note.com/img/1643094428236-mbVQxcD8nZ.png?width=1200)
Function内でのみ使用できるLocal Variable(ローカル変数)を作成する
Functionでのみ使用できる変数「Local Variable(ローカル変数)」を使用します。
Local Variables[LocalResult]を作成します。
Function[Sum]を開きます。
Function[Sum]を開くと、[My Blueprint]パネルに[Local Variables]カテゴリが表示されます。
[Local Variables]カテゴリの[+]ボタンをクリックします。
追加されたLocal Variableの名前を「LocalResult」に設定します。
![](https://assets.st-note.com/img/1643094440809-rEbdO23fO1.png?width=1200)
Local Variable[LocalResult]のSetノードを追加します。
Input[A],[B]の[Add]ノードの結果を[LocalResult]に設定します。
Function[Sum]の[ReturnValue]に[LocalResult]の値を設定します。
![](https://assets.st-note.com/img/1643094448873-kK8y88l3w8.png?width=1200)
[Event Graph]に戻ると[Local Variables]カテゴリは表示されません。
![](https://assets.st-note.com/img/1643094459331-cLgbKy64Sk.png?width=1200)
[Local Variables]カテゴリはFunction内でのみ使用できる変数を宣言できます。
![](https://assets.st-note.com/img/1643094468128-2K2q2ozasq.png?width=1200)
VariablesとLocal Variablesの違いについて
![](https://assets.st-note.com/img/1643094486104-19Qqwx8ZQo.png)
![](https://assets.st-note.com/img/1643094496805-wiV23l1UFm.png?width=1200)
Function[Sum]のpure化(純粋化)
Blueprintの[Add]ノードのようにFunction[Sum]を実行ピンのないノードに変更します。
Function[Sum]のノードを選択し、[Detail]パネルから[Pure]のチェックボックスをチェックします。
![](https://assets.st-note.com/img/1643094507069-Jafu52Nadn.png?width=1200)
[Pure]のチェックボックスにチェックが入ると、Function[Sum]の実行ピンがなくなります。
![](https://assets.st-note.com/img/1643094525832-C1leVtZ8WE.png?width=1200)
公式ドキュメントの純粋関数(Pure Function)の解説です。
関数は 純粋関数 または 非純粋関数 のどちらかになります。両者の大きな違いは、純粋関数がステートやクラスのメンバーを一切変更しないのに対し、 非純粋関数はステートを自由に変更します。純粋関数は通常、データ値を出力するだけの getter 関数や演算子に使用されます。 関数または演算子は、データ値を単に出力します。
純粋関数はデータピンへ接続され、依存するデータが要求されるとコンパイラにより自動的に実行されます。このため、 純粋関数は接続先のノードにつき 1 回ずつ呼び出されます。純粋関数は以下のいずれかのメソッドを使って指定されます。
・コードで定義された関数に対する関数宣言のキーワードに BlueprintPure を指定します。
・ブループリント エディタ で追加された関数の [Pure] のチェックボックスにチェックを入れます。
計算結果の文字列を取得する関数を作成する
もう少し複雑な関数を作成します。
計算結果の出力処理を関数化しましょう。
![](https://assets.st-note.com/img/1643094567259-14fKT2Dd2T.png?width=1200)
まず、共通で使用しているInputの洗い出しを行います。
以下の4つの変数を共通的に使用しています。
CalcType
CalcVarA
CalcVarB
Duration
![](https://assets.st-note.com/img/1643094575539-1egAWeGoxk.png?width=1200)
共通で使用している変数を1か所だけ接続した状態にして、端にまとめます。
![](https://assets.st-note.com/img/1643094588824-IgDUdqJaxt.png?width=1200)
Inputに繋げていたノード以外を範囲選択します。
範囲選択したどれかのノードを右クリックし、[Collapse Function]を選択します。
![](https://assets.st-note.com/img/1643094597664-NLwuxzogTv.png?width=1200)
選択したノードたちが1つの[New Function 0]というノードに変換されます。
[New Function 0]をダブルクリックして中身を確認します。
![](https://assets.st-note.com/img/1643094606947-8UffzdpWTa.png?width=1200)
範囲選択したノードが[New Function 0]の中で再現されています。
![](https://assets.st-note.com/img/1643094614439-AC5plqtpmg.png?width=1200)
Input[A],[B],[Duration]を接続されていない、「引き算」,「掛け算」,「割り算」に接続し直します。
![](https://assets.st-note.com/img/1643094623269-Lcdr0o0iLo.png?width=1200)
Function Nameを[PrintCalcResult]に変更します。
Inputの順番を入れ替えたり、適切な名称に変更します。
![](https://assets.st-note.com/img/1643094633901-aObM3tqS8V.png?width=1200)
計算結果を出力する処理が1つの関数にまとめられました。
![](https://assets.st-note.com/img/1643094641384-Ut2y1jfKOD.png?width=1200)
EventGraphに戻って見ると、「HelloWorldを出力する」「計算結果を出力する」の2つの処理がBranchで切り分けられているのが分かりやすくなりました。
![](https://assets.st-note.com/img/1643094649184-n2dc4Ijots.png?width=1200)
Function化したことで、処理がまとめられて分かりやすくなります。
![](https://assets.st-note.com/img/1643094659301-S7V94sQB5P.png?width=1200)
[Compile]ボタンをクリックします。
![](https://assets.st-note.com/img/1643094668119-6CXNvX7VIU.png)
Level Editorの[Play]ボタンをクリックします。
![](https://assets.st-note.com/img/1643094675365-K71mmI90ru.png)
先ほどと同じ足し算の計算結果が表示されました。
![](https://assets.st-note.com/img/1643094682703-rscERLy9OL.png)
すべて保存してBlueprint側は終了です。
Blueprint側の説明は以上になります。
プロジェクトをすべて保存しましょう。
![](https://assets.st-note.com/img/1643094691424-vaaCUXwiyS.png?width=1200)
まとめ
改めてBlueprintで関数を勉強する手順を書いていると、関数の動きが分かりやすくていいですね。
プログラムの処理の流れを目で追うことができるBlueprintはプログラミング初心者に優しいですね。
ビジュアルスクリプトでプログラムを始められるのは楽しそうですね。
参照URL
UE4から始めるC++&Blueprint 進捗とロードマップ
Zennで進捗報告を行い、GitHubでロードマップを公開中です。
よかったら覗いてみてください。