第23回 トランスフォームを利用してみよう (2)

関数を使ってアクタの位置を取得する

前回は、トランスフォームとはどのようなものかをざっと学びました。今回はそれを受けて、トランスフォームのデータを利用する方法を学びましょう。すでにレベルに配置済みのCubeのインスタンス (Cube4) を使って、その位置データを取得する方法について学びます。

なお、このCubeのインスタンスは、第18回 クラスの基本を学ぼうの「クラスからいくつでも作れるインスタンス」で作られたものです。また、そのようなインスタンスを変数に入れて利用する方法については、第19回 オブジェクト型の変数を使ってみようで学びましたので、忘れてしまった場合はそれらのページを振り返りましょう。

さて、Cube4の位置データはもちろん[詳細パネル]で確認できますが、今回はブループリントのグラフを使ってそのデータを取得してみます。 (そうすることによって、取得してから他の処理にも利用できるからです。)
b23-1(画像1)
なお、第19回 オブジェクト型の変数を使ってみようで行ったように、CubeIns変数にCube4が割り当てられるようにしておきます。キャラクターを選択状態にすると、「デフォルト」欄のCubeInsがCube4になっているのが分かります。
b23-2(画像2)
グラフは簡単です。GetActorLocation (アクタの位置を取得する) 関数を使うだけです。この関数の「ターゲット」という入力ピンに先ほどのCubeIns変数を接続します。つまり、CubeIns変数に入っているCube4の位置を取得することになります。
b23-3(画像3)
これを実行してみましょう。
b23-4(画像4)
例によって左上に取得したデータが表示されています。このデータは画像1の位置データと同じです (四捨五入はされていますが) 。 後ほど、この位置データを利用してCube4の位置を変える方法についても学びましょう。

関数を使ってアクタを任意の位置に動かす

単純にアクタの位置を変更するためには、Cube4をMovable (移動可能) にしてから (こうしなければ動きません) 、
b23-5(画像5)
SetActorLocation (アクタの位置をセットする) 関数を使うだけです。
b23-6(画像6)
上のグラフでは、SetActorLocation関数のNew Location (新たな位置) にx=50, y=50, z=200をセットしています。実行すると、その位置にCube4は移動します。
b23-7(画像7)
なお、ついでながら次のように、Cube4の[詳細パネル]のPhysics (物理) 欄でSimulate Physics (物理をシミュレートする=物理法則を模倣する) にチェックを入れると
b23-8(画像8)
移動したCube4は (万有引力の法則という) 物理法則に従って落下します。 (Simulate Physicsにチェックを入れていないためCube4が浮いたままになる画像7と比較してください。)
b23-9(画像9)
今回は、移動した位置を分かりやすくするためにSimulate Physicsのチェックは再び外しておきます。

取得した位置データを利用して新たな位置にアクタを移動させる

それでは、上記の2つの応用として、Cube4をその場で空中に持ち上げてみます。もっと詳しく言うと、Cube4の位置データのうち、xとyはそのままにしておき、zに+200してみます。現実世界では200cmほど持ち上げることに相当します。画像で示すと次のようなことを行うことになります。まず移動前の画像を先にご覧ください。
b23-10(画像10)
次に移動後です。
b32-11(画像11)

ではまずウオーミングアップに、Cube4の位置データを取得してからzの値だけを表示してみます。
b23-12(画像12)
GetActorLocation関数から位置データを取得するのは前にやったとおりです。その位置データはx, y, zのセットになっていました (画像4がその様子を示しています)。このように位置データのようにセットになっているデータはベクターと言います。つまり、これからベクターの一つのデータzだけを取り出して表示するのですが、そのためには、一旦ベクターを分解しなければなりません (そういうことになっています) 。
b23-13(画像13)
上の画像では、GetActorLocation関数のReturn Value (返り値) は位置データを出してくれます。つまりベクターが出て来るのですが、これを分解するには、BreakVector (ベクターを分解する) を使います。このノードにあるIn Vec (ベクターの入力ピン) にGetActorLocation関数のReturn Valueを接続します。そして、そこにあるzの出力ピンからPrint Stringに接続すると、確かにzの値が表示されます。
b23-14(画像14)
ちなみに、この値は当然のことながら画像1や画像4のzの値と同じです (四捨五入されているものもありますが) 。

ここまで来れば、Cube4を200cm持ち上げるのはもう少しです。zの値に200を足して、再度x, y, zをベクターにするだけです (ベクターにしなければ、SetActorLocationに接続することができないので) 。
b23-15(画像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などにすると「面白いこと」がより分かりやすく見えます。
b23-16(画像16)

BreakVectorとMakeVectorとの違いについて、簡単にまとめておきますと、これらはほぼ反対の役割をもつノードです。BreakVectorはベクターが入ってきて、x, y, z が出ていきます。MakeVectorはその逆でx, y, z が入ってきて、ベクターが出ていきます。シンプルですね。

【振り返り問題】
Gキーを押すとCube4がz方向に3倍に拡大するようにしてください。GetActorLocationとSetActorLocationの代わりにGetActorScale3DとSetActorScale3Dを使います。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする