関数を使ってアクタの位置を取得する
前回は、トランスフォームとはどのようなものかをざっと学びました。今回はそれを受けて、トランスフォームのデータを利用する方法を学びましょう。すでにレベルに配置済みのCubeのインスタンス (Cube4) を使って、その位置データを取得する方法について学びます。
なお、このCubeのインスタンスは、第18回 クラスの基本を学ぼうの「クラスからいくつでも作れるインスタンス」で作られたものです。また、そのようなインスタンスを変数に入れて利用する方法については、第19回 オブジェクト型の変数を使ってみようで学びましたので、忘れてしまった場合はそれらのページを振り返りましょう。
さて、Cube4の位置データはもちろん[詳細パネル]で確認できますが、今回はブループリントのグラフを使ってそのデータを取得してみます。 (そうすることによって、取得してから他の処理にも利用できるからです。)
(画像1)
なお、第19回 オブジェクト型の変数を使ってみようで行ったように、CubeIns変数にCube4が割り当てられるようにしておきます。キャラクターを選択状態にすると、「デフォルト」欄のCubeInsがCube4になっているのが分かります。
(画像2)
グラフは簡単です。GetActorLocation (アクタの位置を取得する) 関数を使うだけです。この関数の「ターゲット」という入力ピンに先ほどのCubeIns変数を接続します。つまり、CubeIns変数に入っているCube4の位置を取得することになります。
(画像3)
これを実行してみましょう。
(画像4)
例によって左上に取得したデータが表示されています。このデータは画像1の位置データと同じです (四捨五入はされていますが) 。 後ほど、この位置データを利用してCube4の位置を変える方法についても学びましょう。
関数を使ってアクタを任意の位置に動かす
単純にアクタの位置を変更するためには、Cube4をMovable (移動可能) にしてから (こうしなければ動きません) 、
(画像5)
SetActorLocation (アクタの位置をセットする) 関数を使うだけです。
(画像6)
上のグラフでは、SetActorLocation関数のNew Location (新たな位置) にx=50, y=50, z=200をセットしています。実行すると、その位置にCube4は移動します。
(画像7)
なお、ついでながら次のように、Cube4の[詳細パネル]のPhysics (物理) 欄でSimulate Physics (物理をシミュレートする=物理法則を模倣する) にチェックを入れると
(画像8)
移動したCube4は (万有引力の法則という) 物理法則に従って落下します。 (Simulate Physicsにチェックを入れていないためCube4が浮いたままになる画像7と比較してください。)
(画像9)
今回は、移動した位置を分かりやすくするためにSimulate Physicsのチェックは再び外しておきます。
取得した位置データを利用して新たな位置にアクタを移動させる
それでは、上記の2つの応用として、Cube4をその場で空中に持ち上げてみます。もっと詳しく言うと、Cube4の位置データのうち、xとyはそのままにしておき、zに+200してみます。現実世界では200cmほど持ち上げることに相当します。画像で示すと次のようなことを行うことになります。まず移動前の画像を先にご覧ください。
(画像10)
次に移動後です。
(画像11)
ではまずウオーミングアップに、Cube4の位置データを取得してからzの値だけを表示してみます。
(画像12)
GetActorLocation関数から位置データを取得するのは前にやったとおりです。その位置データはx, y, zのセットになっていました (画像4がその様子を示しています)。このように位置データのようにセットになっているデータはベクターと言います。つまり、これからベクターの一つのデータzだけを取り出して表示するのですが、そのためには、一旦ベクターを分解しなければなりません (そういうことになっています) 。
(画像13)
上の画像では、GetActorLocation関数のReturn Value (返り値) は位置データを出してくれます。つまりベクターが出て来るのですが、これを分解するには、BreakVector (ベクターを分解する) を使います。このノードにあるIn Vec (ベクターの入力ピン) にGetActorLocation関数のReturn Valueを接続します。そして、そこにあるzの出力ピンからPrint Stringに接続すると、確かにzの値が表示されます。
(画像14)
ちなみに、この値は当然のことながら画像1や画像4のzの値と同じです (四捨五入されているものもありますが) 。
ここまで来れば、Cube4を200cm持ち上げるのはもう少しです。zの値に200を足して、再度x, y, zをベクターにするだけです (ベクターにしなければ、SetActorLocationに接続することができないので) 。
(画像15)
上の画像では、それを行っています。+ノードはFloat+Floatのノードです。200は確かに整数 (Integer) なのですが、Float+Integerというノードはないので、より精度の高い (位置情報が詳しい) Float型に合わせます。また、MakeVectorは、x, y, zをベクターにまとめるノードです。この場合、xとyはGetActorLocationで得られた値をそのまま使っています (x, yは変えたくないからです)。MakeVectorのReturn Valueからは当然ベクターが出てきます。ベクターの色は黄色です。SetActorLocationのNew Location (新たな位置) の入力ピンも黄色です。つまりベクターを供給する必要があるということなので、今作ったベクターをつなげることができます。これで、Cube4は画像11のように200cm上昇することになります。
なお、SetActorLocationの「ターゲット」ピンにはCubeIns変数 (つまりCube4) を接続しなければなりません。SetActorLocationの対象はCube4だからです。 次のように接続を外すと面白いことが起きます。特に加える数を200ではなく400などにすると「面白いこと」がより分かりやすく見えます。
(画像16)
BreakVectorとMakeVectorとの違いについて、簡単にまとめておきますと、これらはほぼ反対の役割をもつノードです。BreakVectorはベクターが入ってきて、x, y, z が出ていきます。MakeVectorはその逆でx, y, z が入ってきて、ベクターが出ていきます。シンプルですね。
【振り返り問題】
Gキーを押すとCube4がz方向に3倍に拡大するようにしてください。GetActorLocationとSetActorLocationの代わりにGetActorScale3DとSetActorScale3Dを使います。