ビデオの内容紹介
まず、キーボードを押すと、数字が1つずつ加算されて表示されるブループリントを作って、GetとSetの役割を考えます。さらに、キーを押すたびに、キャラクターの色がランダムに変化するグラフを組むことによって、既存のメッシュのプロパティを変更する方法を学びます。
原題 Blueprint Essentials – 6 – Variable Get vs Set
メモ
この記事を作成している時に使用しているエンジンのバージョンは 4.2 なので、UIの日本語化も進んでいます。GetとSetの日本語も「取得」と「設定」になっています。しかし、「設定」という語は一般的によく使われるのでまぎらわしいので、この記事ではなるべくSetで行きます。Setは「値を変数にセット(代入)する」という意味です。「値を設定する」でもよいのですが。
原題 Blueprint Essentials – 6 – Variable Get vs Set
まず、先にこれを覚えておきましょう。
★ワイヤを間違えた時に削除する方法
スロー
ピンの上にカーソルをマウスオーバーする → 右クリック → 「~へのリンクを削除」をクリック
☆GetとSetの基本的な役割を学ぶ (0:43)
これから組むグラフは、キーボードのEキーを押すと、数字が1つずつ加算され、それがゲーム中に表示されるようにするというものです。
スロー
前回までに作成したVariableWorkshopというブループリントを開き右上「デフォルト」をクリック → 「Input」欄の「Auto Receive Input」で「Player 0」を選択する → 右上「グラフ」をクリック → スペースで右クリック → Searchに「E」とタイプ → 「E」をクリック(イベントノードが出現する) → 「マイブループリント」パネルの「+V変数」をクリック → MyIntという名前にする → 「詳細」の「変数の種類」をintにセット → 左上「コンパイル」をクリック(MyIntのデフォルト値が「0」であることを確認) → MyIntをグラフ内にドラッグアンドドロップ → Get(「取得」)をクリック → スペースで右クリック → Search欄に「+」とタイプ → 「f Integer+Integer」をクリック → MyInt と「f Integer+Integer」をワイヤで結ぶ → 「f Integer+Integer」の下の値を「1」にする → 「マイブループリント」から新たにMyIntをグラフ内にドラッグアンドドロップ → 「設定」をクリック → 「f Integer+Integer」の右側のピンからMyIntのSetにワイヤをつなぐ → 「E」イベントノードの「Pressed」からSetの実行(exec)ピンにワイヤで接続 → スペースを右クリック → Searchで「log」とタイプ → 「f Pring String」をクリック → Setから「f Integer+Integer」の実行ピンにワイヤをつなぐ → 「f Integer+Integer」の右側のピンから「f Pring String」の「In String」にワイヤをつなぐ(自動的に型の変換ノードが出現する) → 「コンパイル」をクリック → レベルエディタのツールバー右から2つ目「再生」(本当は「プレイ」という意味)をクリックする → カーソルをレベル内に置き、1回左クリックしてからEを押す
メモ
①上記の意味をここでまとめておきます。「E」イベントノードによってEキーが押されると、Setが発動します(イベントノードがなければ何事も起こりません)。Setは、MyIntに値を格納します(MyIntに最初に入っていた値「0」は上書きされてしまいます)。どのような値を入れるのかは、すでにプログラムされて(決まって)います。それは、「f Integer+Integer」から供給されることになっています(このあたりの因果関係的なことは慣れなければ普通のプログラムよりも難しく感じるかもしれません)。ところで、その「f Integer+Integer」は、(マウスオーバーすると表示されますが)「Int A」と「Int B」を足し合わせます。「Int A」に入る値は、GetのMyIntノードから供給されています(ワイヤでつながっています)。「Int B」はどこともつながっていないので、四角の中の数値です。これらの合計がSetノードに入ります(つまりMyIntという変数に格納されます)。つまり、最初にEを押すと0+1つまり「1」の値がMyIntにセットされるのです。Setノードは「f Print String」を呼び起こします。「f Print String」は、「f Integer+Integer」の結果が文字列(string)に変換されたものをスクリーンに表示します。これで1ターンが終わりです。この後に再度Eキーが押されると、上記と同じような動作を繰り返しますが、1つだけ異なるのは、MyIntには0ではなく1が入っているということです。ですから、「f Integer+Integer」の計算は2になり、新たなにMyIntには2が格納されることになります。その流れを模式的に書くと次のようになります。
(Get) MyInt [0]
f Integer+Integer [1+0]
(Set) MyInt [1]
Print String [1]
↓
(Get) MyInt [1]
f Integer+Integer [1+1]
(Set) MyInt [2]
Print String [2]
②変数のSetノードを理解するには、次のような実験をしてみるといいかもしれません。
このグラフではあえて変数のSetを使用していません。ワイヤで接続していません(削除したのと同じです)。すると、どのような動作になるかというと、Eのキーを押すたびに「1」が表示されるようになります。
これはどういうことかと言うと、MyIntという変数に値が蓄えられていない(保存されていない)ということです。最初は「1」+「0」 →「1」 という計算が実行されますが、この結果がどこにも保存されないため、ずっと「1」のままです。
変数のSetノードを接続すると、関数Integer+Integerの結果が、MyIntという変数に保存されるということが分かりました。
まとめ
Getは変数の値を他のノードに供給、Setは変数に値を格納(変数に入っている値を変更)。
★既存のオブジェクトのプロパティに値をセットする方法 (3:22)
Fキーを押すたびに、キャラクターの色がランダムに変化するグラフを組みます。かなり長くなるので、「スロー」は便宜上3つに分けてあります。
スロー①
(まず先ほどのグラフを左クリックで範囲指定してDelボタンを押し、消しておく) → コンテンツ ブラウザ/BlueprintsでMyCharacterをダブルクリック → ブループリントエディタが起ち上がるのでConstruction Scriptタブをクリック → 「マイブループリント」パネル内下「継承した変数を表示」にチェックを入れる → Characterを展開 → MeshをConstruction Scriptパネルにドラッグアンドドロップ → 「取得」をクリック(「取得」しかクリックできない) → ピンからワイヤを空いているところにドラッグ → Search欄に get materialとタイプ → 「f Get Material」(関数 マテリアル情報を取得)をクリック (Meshとf Get Materialがつながる) → (以下メッシュのマテリアルの色情報を確認するために)右上「コンポーネント」をクリック → 「コンポーネント」パネルでMeshを選択 → 「詳細」パネルのMeshにあるSkeletal Meshのサムネイルをダブルクリック(HeroTPP_Skeletonのタブが開かれる) → 「メッシュの詳細」のMaterialsのサムネイルをダブルクリック(MI_Template_BaseBlueタグが開かれる) → 「詳細」の「パラメータグループ」のVector Parameter Valuesを展開 → DiffuseColorにチェックが入っていることを確認(ここまでで確認作業終わり) → MyCharacterタグの「グラフ」に戻る
キーワード
Construction Script(コンストラクションスクリプト): Construction Scriptを含むアクタがレベルに配置されたり改変(更新)された場合に、このノードにつながっている関数などが実行されます。この例ではConstruction Scriptが実行されることによってf Create Dynamic Material Instanceが実行されるようにワイヤがつながっています。
Dynamic Material Instance(動的なマテリアルインスタンス): マテリアルの情報(=見た目)をエディタなどで変更するとコンパイルが必要になりますが、このMaterial Instanceを使うと、コンパイルが不要なため、ゲーム中のその時々の条件に応じて(=動的に)マテリアルを変更することができます。
スロー②
→ スペースで右クリック → Search欄にcreateとタイプ → f Create Dynamic Material Instance(関数 動的マテリアルインスタンスの作成)をクリック → 右クリックしたままでドラッグして、ウィンドウ内の左上の(見えない)部分にConstruction Scriptというノードが表示されるまでたぐり寄せる → Construction Scriptノードをf Create Dynamic Material Instanceの近くに移動する → Construction Scriptノードのexecピンからf Create Dynamic Material Instanceノードの左側execピンにワイヤをつなぐ → f Get MaterialノードのReturn Value(返り値)とf Create Dynamic Material InstanceノードのParent(親)をワイヤでつなぐ → f Create Dynamic Material InstanceノードのReturn Valueを右クリック → Promote to Variable(変数に昇格)をクリック → (Return ValueからワイヤがつながったSetノードができるので)「マイブループリント」で名前をDMIとする → 「マイブループリント」からMeshを再度ドラッグアンドドロップ → 「取得」をクリック → ピンからワイヤをスペースにドラッグして右クリック → Search欄にset materialとタイプ → f Set Materialをクリック(自動的にMeshのピンからf Set MaterialのTargetピンに接続される) → DMIのSetのexeピンから f Set Materialのexeピンに接続 → f Create Dynamic Material InstanceノードのReturn Valueからf Set MaterialのMaterialピンに接続
スロー③
→ 右上「デフォルト」をクリック → Search欄にinputとタイプ → 「Input」欄の「Auto Receive Input」で「Player 0」を選択する → 右上「グラフ」をクリック → Event Graphタブをクリック→ スペースで右クリックしてSearch欄にFとタイプ → 「F」をクリック(イベントノードが出現する) → 「マイブループリント」からDMIをドラッグアンドドロップ → 「取得」をクリック → ピンからワイヤをドラッグ → スペースで右クリックしてSearch欄にset vecとタイプ → f Set Vector Parameter Valueをクリック(DMIとつながる) → Parameter NameにDiffuseColorとタイプ → Fのexecピンとf Set Vector Parameter Valueのexecピンをつなげる → Valueピンからスペースにドラッグアンドドロップ → Search欄にmake linearとタイプ → 「LinearColorを作成する」(Make Linear Color)をクリック → LinearColorを作成する」ノードのRピンからスペースにドラッグアンドドロップ → Search欄にrandomとタイプ → f Random Float in Rangeをクリック → Maxを1にする → f Random Float in Rangeを選択状態にして(左クリックして)Ctrl+C → Ctrl+Vでコピーアンドペーストする(2回) → f Random Float in RangeのReturn ValueからGピンおよびBピンにそれぞれワイヤで接続 → f Random Float in RangeのAに1とタイプ → コンパイルをクリック → レベルエディタで「再生」をクリックしてからFキーを数回押してみる
メモ
以上の操作(グラフ)の意味をまとめておきます。
アクタの色を動的に(その場で)変更するためにはDynamic Material Instanceが必要です。Dynamic Material Instanceを作成するためには、f Construction Scriptを使います。これはアクタがレベルに配置された時に実行されるため、それにつながっているf Create Dynamic Material Instanceが実行されることになります。(なお、Dynamic Material Instanceは、アクタのメッシュのマテリアルを基にして作るので、Meshからf Get MaterialをつなげてMaterialの情報を取得してDynamic Material Instanceにつなげています。) f Create Dynamic Material Instanceによって作られたDynamic Material Instanceは変数にしています(昇格)。これによって、後で再利用できるようになります。この変数(新たなマテリアル)をMeshに適用するために、Get Meshをf Set Materialにつなげています(Set Meshならば、メッシュが丸ごと変わることになるので、ここでは使えません。ここでは、メッシュの一部=マテリアルを変更しているので)。
このままでは新たなマテリアルがメッシュに適応されるだけなので、ゲーム中にFキーを押してマテリアルの値(色)を変化させるために、Event Graphでグラフを組みます。まず「F」ノードからf Set Vector Paramete Valueにつなげています。これによって、Fキーを押すとマテリアルの値が新たにセットされるようになります。変更されるマテリアルは新たなマテリアルであるDMIなので、それをf Set Vector Paramete ValueのTargetピンにつなげています。セットする値は、Valueピンにつながっている「Linear Color を作成する」ノードから得られます。これはf Random Float in Range (以下の範囲でランダムな浮動小数点数を得る)という関数から値を得ています。RGBはそれぞれ色の成分を表します。つまり、各色の成分をランダムに決めて、1つの色として合成することになります。
今回は以上です。大変お疲れ様でした!