ブループリント クイックショット③ カスタムのプロジェクタイル (発射物)

ビデオの内容紹介 
ブループリントでプロジェクタイル (発射物) を作る方法を学びます。前半ではプロジェクタイルの発射をシミュレートします。後半では、キャラクターからプロジェクタイルを発射できるようにします。

原題 Unreal Engine 4 Blueprint QuickShot – 3 – Custom Projectile

作るもの①
スタティック メッシュをプロジェクタイル (発射物) に仕立てます。Simulate によって、プロジェクタイルが発射されるようになります。

スロー 
コンテンツ ブラウザで New → Blueprint → Actor → 名前を付ける (Projectile) → そのファイルをダブルクリック → ブループリントエディタが開くので Components タブの Add Component (コンポーネントの追加) をクリック → Sphere (球体) を選択

300[Sphere を選択]

301[Sphere が表示される]

→ Details タブの Shape で Sphere Radius (球体の半径) を 15.0 にセット

302

→ Add Component (コンポーネントの追加) をクリック → Static Mesh (スタティック メッシュ) を選択

303

→ Details の Static Mesh でドロップダウンメニューから SM_CornerFrame をクリック

304

→ スタティック メッシュが Sphere の中央に位置するように調節する

305

スタティック メッシュを選択している状態で Details の Collision (コリジョン) セクションで、Collision Presets のドロップダウンメニューから NoCollision (コリジョンなし) を選択

306[NoCollision を選択]

→ Add Component (コンポーネントの追加) をクリック → Projectile Movement をクリック

307

→ Details タブの Velocity (方向付き速度) セクションで Velocity を X=1.0 にセットする (Y、Z はそのまま)

308

→ 同じく Details タブの Projectile セクションの Initial Speed (初速) を 4000 にセットする

309

→ レベルエディタに戻り、コンテンツ ブラウザの Blueprint フォルダ内にある Projectile をビューポートにドラッグアンドドロップ

310

→ ツールバーで Simulate をクリックして発射のテストを行う。 (終了時は、Stop をクリック)

ブループリントの意味
①今回コリジョンはプロジェクタイルの動作に関係がないため NoCollision にセットしています。Sphere と Projectile の位置合わせも、見栄えの問題だけで動作には直接関係ありません。

②ProjectileMovement1 というコンポーネントで、Velocity と Initial Speed の 2 つの速度をセットしましたが、実は、Initial Speed だけでも構いません。たとえば

311

のように Initial Speed =0、Velocity の Y=4000 とすると、Y 軸方向に 4000 の速度で飛んで行きます。これは、Initial Speed =4000、Velocity の Y=1 と同じです。Initial Speed は 0 よりも大きくなると、Velocity の値をオーバーライドします (上書きします)。その場合、Velocity の値は方向だけを示すようになります。だから、

Initial Speed =4000、Velocity の X=2、Y=3、Z=0

の設定でシミュレートして、上からの視点で眺めると Y 軸寄りに飛び、

Initial Speed =4000、Velocity の X=3、Y=2、Z=0

では X 軸寄りに飛んで行きます。
また、

Initial Speed =4000、Velocity の X=0、Y=0、Z=0

のようにすると、ただ下に沈んで行くような感じでどこにも飛びません (物理法則をシミュレートしているので、落下していく)。

作るもの②
次に作るものは、キャラクターから発射されるプロジェクタイルです。

スロー 
コンテンツ ブラウザで Blueprint フォルダ内の MyCharacter をダブルクリックして、空いているスペースに次のようなグラフを組みます。

完成グラフ

312

注意すべき点は、
① ビデオで使用されている Spawn Actor from Blueprint がないので、それと同等の Spawn Actor from Class を使用する点。

② SpawnActor において、Class の横のドロップダウンから、先に作っておいた Projectile_C を選択する点。

ブループリントの意味
Left Mouse Button (左マウスボタン) イベントノードは、左マウスボタンが Pressed (押される) と、それにつながる SwawnActor が発動します。SwawnActor は、その名のとおり、アクタ (レベル内に配置できるもの) を Spawn (スポーン=出現させる) します。これが大きな流れです。

SwawnActor の Spawn Transform (アクタがスポーンされるトランスフォーム=位置、角度、スケール) は、次のようにして値が供給されています。すなわち、Get Actor Location で self (この場合、キャラクター) の Location (位置) を取得しておきます。それと並行して、Get Actor Rotation でキャラクターの Rotation (角度) を取得し、さらに Get Forward Vector (前向きのベクタを取得) につなげます。

この Get Forward Vector (前向きのベクタを取得) は、Get Actor Rotation で取得した回転に基づいて 、キャラクターの前方方向を表すベクタを取得します(後の実験を参照)。キャラクターを特に回転させていない場合は、Get Forward Vector の値は (1,0,0) であり (キャラクターがX 軸の正方向に向いていることを表す)、それに 100 を掛けると (100,0,0) になり、それを、Get Actor Location で取得した値に加えることによって、新たな Location を作っています (キャラクターから前方に向かって 100 離れたところからプロジェクタイルを発射させるために)。

この新たな Location と、すでに取得済みの Rotation を Make Transform (トランスフォームを作る) に供給することによって、新たなトランスフォームを作ります。この新たなトランスフォームを Spawn Actor に供給することによって、そのトランスフォームからアクタ (プロジェクタイル) がスポーンされることになります。

実験
Get Forward Vector の働きを知るために、次のようなグラフを作りました。

319

これは、中マウスボタンを押すと、Set Actor Rotation (アクタの回転をセットする) によって、キャラクターを 180 度回転させます。さらに、アクタの位置 (Location) と回転 (Rotation)、前方ベクタ (Forward Vector) が表示されます (画面での順番は下から)。次のように表示されます。

316

Forward Vector (前方ベクタ) は、(-1.000, -0.000, 0.000) となっています。これは、X 軸の負の方向にキャラクターが向かっていることを表しています。180 度回転させたのですから当然の結果です。Rotation (回転) は、pitch(ピッチ, Y のこと)=0.000000, yaw(ヨー, Z のこと)=-179.999999, roll(ロール, X のこと)=-0.000000 となっています。また、Location (位置) は、(-896.000, 298.000, 223.150) です。

さらに、次のようなグラフを作りました。

321

これは、「完成グラフ」とほぼ同じですが、Get Forward Vector で得られた値に 300 を掛けていることと、Get Actor Location で得られた値との足し算の結果を表示している点が異なります。結果は次のようになります。

326

(-1196.000, 298.000, 223.150) が足し算の結果です。つまりここにプロジェクタイルがスポーンされます。これは、キャラクターの Location である (-896.000, 298.000, 223.150) に、Forward Vector である (-1,0,0) に 300 を掛けたもの、すなわち (-300, 0, 0) を加えたものです。X の位置だけを考えると、キャラクターの位置が -896.000 であり、プロジェクタイルがスポーンされるのは -1196.000 であり、かなり離れているのが画像からも分かります。

さらに、次のようなグラフも作りました。

320

これは、Get Forward Vector が有効ではありません。ワイヤが途中で切れています。その代わり、Get Actor Location で得られた値の X に 300 を加えています。するとどういうことになるかというと、

327

のように、プロジェクタイルのスポーン位置は、(-596.000, -298.000, 223.150) となります。これは、キャラクターの Location である (-896.000, 298.000, 223.150) の X 要素すなわち -896.000 に 300 を加えているので、-596.000 となっています。Get Forward Vector が有効でないため、正面方向が分からず、結果的に正面とは逆方向に 300 を加えることになりました。そのためプロジェクタイルはキャラクターの後方から (X 軸のプラス方向から) スポーンされています。Forward Vector が考慮されていないためです。

もし、キャラクターを 180 度反転させないで、X 軸のプラス方向に向かわせると、Get Forward Vector が有効であろうと無効であろうと、結果はまったく同じになります。なぜなら、Get Forward Vector が有効な場合は、Forward Vector が (-1,0,0) ではなく (1,0,0) となり、(-300, 0, 0) ではなく (300, 0, 0) を加えることになり、Get Forward Vector が無効な場合も、300 を X に加えているのですから。

では、マイナス方向に向いている時は、マイナスを付けて加えたりすれば、Get Forward Vector は不要かというと、もちろんそういうわけにもいきません。その理由は次をごらんください。

Get Forward Vector (前方のベクタを取得) が返す値は、当然のことながらアクタの回転によって決まります。たとえば

324

のように、Set Actor Rotation (アクタの回転をセット) で Z → 41.0 などにすると、

325

というように、Get Forward Vector で得られる値は (0.755, 0.656, 0.000) となります。この時、先のように Forward Vector を取得せずに適当に Location に +300 などとすると、次の画像のように、あらぬ方向からプロジェクタイルがスポーンされることになります。

328

ここに Get Forward Vector の意義があります。つまり、「ちゃんと正面に向かって、ある一定の距離を置いて何かを位置づける」ことができるのです。

今回はここまでです。お読みいただき、ありがとうございました。



シェアする

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

フォローする

コメント

  1. 匿名 より:

    詳細な解説ありがとうございます。
    ビデオを見て腑に落ちなかった点がよく解りました。

    • なつのや より:

      そう言って頂けると、何よりです!
      今後もこのサイトを可愛がってあげてください。