前回の振り返り問題
Gキーを押すとCube4がz方向に3倍に拡大するようにしてください。GetActorLocationとSetActorLocationの代わりにGetActorScale3DとSetActorScale3Dを使います。
この問題は前回の位置の操作、つまり、「Cube4の位置データのうち、xとyはそのままにしておき、zに+200」する操作とほとんど変わりませあん。GetActorLocationとSetActorLocationの代わりにGetActorScale3DとSetActorScale3Dを使って、+200の代わりに×3するだけです。つまり次のようになります。
(画像1)
実行前は次のようになっています。
(画像2)
実行すると、次のようになります。
(画像3)
このようにブループリントでは、一つのことが分かれば、他のことにも簡単に応用が効くような場合がずいぶんあります。なお、何回もGキーを押すと、さらに3倍されるのでどんどん高い塔のようなものができます。
コンストラクション スクリプトとは
ブループリントには、イベントグラフだけではなくコンストラクション スクリプトというタブが備わっています。たとえば、これまで多用してきたMyCubeブループリントにも次のようにコンストラクション タブがあります。
(画像4)
これは動画チュートリアルで後々かなり出てくるので、どのようなものか概要くらいは知っておくべきでしょう。
まず、コンストラクション スクリプトは、イベントグラフと同じように自分でノードをつないで組み立てるのですが、これが実行されるのは特定のイベントが発生したときではなくて、次のような場合です。
▷ クラスからインスタンスが作られた場合 (エディタでブループリントのファイルをレベルにインスタンスとしてドラッグしたり、イベントグラフでインスタンスを配置した場合) 。
▷ ゲームが開始されてインスタンスがスポーンした場合。
▷ ブループリントをコンパイルした場合。
▷ アクタ (インスタンス) のパラメータを変化させた場合 (レベルエディタ内でドラッグしたり、[Details] (詳細) パネルで値を調整した場合) 。
これらに共通していることは、インスタンスのデータが何らかの変化 (生成を含めて) をした場合です。コンストラクション スクリプトの用途の例としては、
●コンストラクション スクリプトに仕掛けをしておくことで、データ変更時に一つの柱から壁を作る場合。(ブループリントの基本的な構成要素⑩ ループの利用: プロシージャルなレベル デザイン)
●低木を多数配置する場合にコンポーネントをランダムに多数追加する場合。(ブループリント クイックショット⑫ Random Streams)
などがあります。
レベルにアクタを配置する時に発動する性質を利用して、ランダム関数を仕込んでおき配置時に自動的に大きさや方向などをランダムに決めさせて見栄えを調整する場合などに便利です。あるいはアクタがスポーンする際にそのインスタンスに何らかの仕掛けを施すことも可能になります。
コンストラクション スクリプトを使ってみる
次のグラフは、いつもながらのMyCubeブループリントのコンストラクション スクリプトです。
(画像5)
前回まで学んでいたトランスフォームのデータを変化させています。大きな流れは単純で、コンストラクション スクリプトが前項にあげたような条件によって発動すると、Set Actor Scale 3D が実行されます。これは、アクタの3D空間におけるスケールをセットする関数です。ここでは、X方向のスケールは一定にしてあります。1になっています。YとZにはそれぞれRandom Float in Range (一定の範囲にあるFloat型の値をランダムに返す) が接続しています。つまり、YとZにはランダムな値が入ることになります。その範囲は、0.3~3に設定してあります。
ここでコンパイルする前にレベルエディタの[詳細パネル]の様子をスクリーンショットしておきます。注目していただきたいのは、「拡大縮小」 (Scale) の部分です。
(画像6)
さてコンパイルしてみましょう。すると次の画像のように、コンパイルしただけでコンストラクション スクリプトが実行されることが分かります。
(画像7)
この時点で、CubeのScaleの値はランダムに変更になっているはずです。では、本当にそうか、[詳細パネル]を見てみましょう。
(画像8)
確かにScaleの値がXを除いて変化しています。Cubeの見た目も大きく変わりました。
次にレベルエディタ内でアクタを移動してみましょう。本当にコンストラクション スクリプトは発動するのでしょうか?Y軸に沿って (画面右から左に) 移動してみます。
(画像9)
(画像10)
(画像11)
(画像12)
確かにCubeの大きさが移動するたびにランダムに変わっています。つまり、コンストラクション スクリプトは、アクタのデータを変更する (=この場合移動して位置のデータを変更した) たびに実行されていました。
【振り返り問題】
Cubeを移動すると、ランダムでZ軸方向の回転がランダムに変化するコンストラクション スクリプトを作りましょう。Make Rotatorを使います。