
UE5 C++&BP 03 【Blueprint版】変数を作成して取得・設定する
前回の記事を日をあけて客観的に読んでみました。
1つの記事に文字数が多くて読みづらかったです。
校正ツールも文字数オーバーしてしまって手間も増えてしまいました。
今後はBlueprint版とC++版を別々の記事にすることで読みやすくします。
書きたいことがたくさんありますが、大体3000~6000文字くらいに収めるようにします。
バランスは行動しながら取っていくしかないのだと実感しました。
Unreal Engineはエンジンのソースコードが読めるので、面白くなって書きすぎてしまいます。
プログラミングをC言語から始めたのですが、変数からつまづきました。
[float]を[浮動小数点型]と説明されたので、当時は意味が分からなかったです。
Blueprintは視覚的にプログラミングができるので分かりやすいですね。
Blueprintからプログラミングを始めたかったです。
ソースコードでタイピングして、コンパイルが成功した時はうれしい。
プログラミングは楽しいです。
前回は「EventBeginPlayでPrintStringを実行する」方法について調査しました。
今回は「変数を作成して取得・設定する」方法について調査していきます。
前回からの続きです。
最終的なC++とBlueprintの比較画像です。
両方とも同じ動作をします。

まずはBlueprintで処理を実装しましょう。
【Blueprint】変数を作成して取得・設定する
学習用の新規レベル「Chapter_2_4_Variable」を作成する
学習用に新規レベルを作成します。

[Empty Level]を選択します。

作成したレベルを保存します。(File > Save Current Level)

名前を「Chapter_2_4_Variable」に設定して、「Save」ボタンをクリックします。

変数を作成する(ノードのInputピンから)
「BP_SampleActor」をダブルクリックしてBlueprint Editorで開きます。

Print Stringの[In String]を変数化します。
In StringのInputピンからDrag&Dropします。

メニューから「Promote to variable」を選択します。

In Stringと書かれたノードが増えます。
InStringと書かれたノードとPrint StringのInputピンが接続されています。

変数の設定を変更する
My Blueprintパネルの「Variable」カテゴリーに「In String」という項目が増えています。これが変数(Variable)です。
変数を選択するとDetailパネルに変数の設定が表示されます。

Detailパネルの[Variable Name]を[Message]に変更します。
Print StringのIn Stringに接続していたノードの名称も「Message」に変換されます。

Default値(初期値)を設定します。
しかし、Default Valueに「Please compile the blueprint」と表示されており、設定できません。

Blueprint Edior左上の[Compile]ボタンをクリックします。

Default Valueが設定できます。
InputピンからDrag&Dropして変数を作成すると、Inputピンに設定していた値がDefault Valueに設定されています。

再び、[Compile]ボタンをクリックして、[Save]ボタンをクリックします

LevelEditorに戻り、Viewportに「BP_SampleActor」をDrag&Dropします。

[Play]ボタンをクリックします。

変数「Message」に設定されていたDefault Valueの文字列が表示されます。

同じ結果です。
・Print StringのIn Stringに文字列を設定する。
・Print StringのIn Stringに変数の値を設定する。

変数「Message」のDefault Valueを「BP Hello World!」変更します。

Blueprint Edior左上の[Compile]ボタンをクリックします。

Level Editorの[Play]ボタンをクリックします。

変数「Message」のDefault Valueを「BP Hello World!」が表示されます。

複数のノードに同じ値を設定しようとした時に、ノードに直接入力すると、「入力の間違い」、「入力の漏れ」といったヒューマンエラーが起きます。
変数を作成し、変数から値を取得するようにBlueprintを組んでおくことで、複数のノードで変数の値が使われることが約束されます。
また変数名を分かりやすい名前にしておくことで、可読性が上がります。
処理の流れを追いやすくなります。
変数の名前は非常に大事なのですごく悩みます。

変数を作成する(My BlueprintパネルのVariableカテゴリーから)
Print StringのDurationピンに変数を作成して設定します。
変数はMy BlueprintパネルのVariablesカテゴリーから追加できます。

[Variables]カテゴリーの右側[+]ボタンをクリックします。

[Variables]カテゴリーに変数が追加されます。
変数の設定をDetailパネルで設定します。

[Variable Name(変数名)]を[Duration]に設定します。

次に[Variable Type(変数の型)]を設定します。
設定したいInputピンにマウスオーバーします。
表示される文字(ToolTip)からInputピンのVariableTypeを確認します。
DurationのVariableTypeはFloatということが分かりました。

[Variable Type]のリストから[Float]を選択します。
(Inputピンにマウスオーバーした時に表示されたVariable Type)

次にDefault Valueを設定します。
Default ValueはComplireしてから設定できるので、左上のComplireボタンをクリックします。

[Compile]を行うとDefault Valueが設定できます。
Print StringのDurationに設定された値[10.0]を設定します。

変数の値をGet(取得)する
変数「Message」ノードと同じように、Inputピンに接続するノードを追加します。

[Variavles]カテゴリーの[Duration]をDrag&Dropします。
マウスを離すと、メニューが表示されるので[Get Duration]を選択します。

変数「Duration」の右側(Outputピン)からDrag&Dropし、[Print String]のDurationに接続します。
Variable Typeが一致しているので接続できます。

Blueprint Edior左上の[Compile]ボタンをクリックします。

Level Editorの[Play]ボタンをクリックします。

文字列がDurationに設定した変数DurationのDefault Value[10.0](10秒間)表示されます。

変数の値をSet(設定)する
次にPrint Stringで変数を使う前に、値を[3.0](3秒)に変更するように変更します。
Get Durationを追加したのと同様に、変数[Duration]をEventGraphにDrag&Dropします。
マウスを離すとメニューが表示されるので、[Set Duration]を選択します。

Setと書かれたノードの実行ピンを[Print String]が実行される前に実行されるように接続し直します。
Durationには[3.0](3秒)を設定します。

Blueprint Edior左上の[Compile]ボタンをクリックします。

Level Editorの[Play]ボタンをクリックします。

文字列がDurationに設定した変数DurationのDefault Value[10.0](10秒間)ではなく、Setノードで設定した[3.0](3秒)で表示されます。

Default Valueは初期値なので、Setノードを使用すると処理の途中で値を変更できます。
変数をBlueprintReadOnlyに設定する(Default Valueから変更しない)
変数の値を途中で変えられてしまっては困る場合に、Setノードを使えなくし、Getノードのみしか使えなくできます。
[Blueprint Read Only]を有効にします。

Blueprint Edior左上の[Compile]ボタンをクリックすると、ノードの下部分に「Error!」と赤く表示されます。

Compiler Resultsにエラーメッセージが表示されます。
下線が付いている「Set Duraion」をクリックすると、エラーがあるノードにフォーカスがあいます。

原因は[Blueprint Read Only]を有効にしたことで、変数[Duration]が読み取り専用になったからです。変更しようとしたためErrorとなりました。
Setノードは使えなくなったので、削除します。
実行ピンを元に戻して、Blueprint Edior左上の[Compile]ボタンをクリックするとエラーが解消されます。

Variable Type(変数の型)をCast(変数の型を別の型に変える)する
Variable Typeが一致していないと、変数とノードのInputピンを接続できません。しかし、Variable Typeが一致していなくても、Variable Typeを変更することで変数の値を設定できます。
DurationのDefault Value[10.0]を文字列として、[Print String]の[In String]で使用するように変更します。
変数[Duration]のOutputピンから[Print String]の[In String]にDrag&Dropします。
右下に「Convert Float to String」と表示されます。

Variable Typeを[Float]から[String]に変換するノードが中間に作成されます。

Blueprint Edior左上の[Compile]ボタンをクリックします。

Level Editorの[Play]ボタンをクリックします。

DurationのDefault Valueである[10.0]が文字列として表示されます。
Variable Typeが一致していなくても、Variable Typeを変換できれば値を使用できます。
Blueprintでは変換できるVariable Typeであれば変換ノードを接続した時に作成してくれます。

Variable Type(変数の型)のリストにないVariable Typeを検索して設定する
Variable Type(変数の型)のリストにないVariable Typeを設定することがあります。今回はカラーを設定している[Print String]の[Text Color]ピンを変数化します。
まず、[Duration]ピンと同様に、[Text Color]ピンのVariable Typeを確認します。
マウスオーバーすると[Linear Color Structure]と表示されます。

変数[Duration]と同じように、[My Blueprint]タブから[+]ボタンをクリックして、変数を追加します。
変数を追加時にVariable Nameを変更できます。
Variable Nameは[TextColor]に設定します。

DetailパネルからVariable Typeを設定します。
しかし、リストには[Linear Color Structure]というVariable Typeが表示されません。

検索バーに[Linear Color]と入力します。
[Linear Color]と書かれた項目を選択します。
リストにない項目は検索することで見つけられます。

次にDefault Valueを設定するので、Blueprint Edior左上の[Compile]ボタンをクリックします。

LinearColorのDefault Valueは数値入力か[Color Picker]を使って色を設定できます。
Aと書かれたところを1.0に設定することを忘れないようにしてください。
AはAlpha(透明度)の数値なので、0.0が設定されていると、色を設定しても透明な文字として表示されます。1.0に設定して不透明な文字に設定します。

変数の設定ができたので、変数[TextColor]のGetノードをEventGraphに追加します。
変数を[Ctrl]キーを押しながらDrag&Dropするとメニューが表示されずにGetノードが追加されます。
Setノードは[Alt]キーを押しながらDrag&Dropすると追加できます。

変数[TextColor]のGetノードと[Print String]の[Text Color]ピーンを接続します
文字列の出力を変数[Message]に戻し、変換ノードを削除します。

Blueprint Edior左上の[Compile]ボタンをクリックします。

Level Editorの[Play]ボタンをクリックします。

表示される文字列の色が変数[TextColor]で設定した

変数のCategoryを設定する
変数は作成して行くにつれて増えていき、やがて何に使っているのか分からなくなります。
そんな時に便利なのが[Category]設定です。
[Category]は変数をグループ化できます。
[Print String]で使用している変数を[Print String]Categoryに設定します。
上から順番にCategoryを設定していきます。
Categoryはリストに[Default]しかないので、最初は入力してCategoryを増やします。
Categoryに[Print String]を設定します。

Variavlesカテゴリーに[Print String]というCategoryが作成され、変数[Message]がメンバーとして登録されました。

Categoryへのメンバー登録は2パターンあります。
・変数をCategoryにDrag&Drop
・変数のCategoryからリスト選択
変数[Duration]を[Print String]CategoryにDrag&Dropします。
変数[Duration]が[Print String]Categoryのメンバーになりました。

変数[TextColor]を選択します。

Categoryのリストから[Print String]を選択します。

Print Stringで使用している変数が[Print String]Categoryのメンバーになりました。

Categoryを整理することでVariavlesカテゴリーが見やすくなります。
・何で使われている変数なのか分かる
・折りたためるので、関係のない変数を非表示することができる

全て保存してBlueprint側の説明は終了です
他にも変数の設定項目がありますが、Blueprint用のクラスや変数をC++で作成する時に説明することにします。
コンテンツブラウザの[Save All]をクリックし、保存されていないアセットを保存します。

まとめ
Blueprint側だけでもかなりのボリュームになってしまったので、C++側は別の記事にします。
変数はどのプログラミング言語でも一番初めに触れる難問なので、分かりやすくなるように図解を増やします。
基本的なことほど説明するのが難しいので、分かりやすく説明するよう更新します。
Blueprintの視覚的にプログラミングできる力を借りてやっと書くことができました。
それではC++でBlueprintの処理を再現しましょう!