俺に解るように説明する "Unreal.Engine.4" 入門+

UnrealEngine4とかチュートリアルとか入門とか

【日本語】 UE4 ホッケーゲーム part.19 パックの上限速度設定1 【チュートリアル】

もう少しだけパックに制限を加えたいと思う。マレットを優しくパックに当てても、結構な確率で、パックが猛スピードで飛んで行くことがあると思う。これは、パックとマレットが表面でぶつかるだけでなく、内部にまで侵入し、互いが重なりあっている間は、そこから抜けだすために、何度もエネルギーを与えてしまっているからだと思われる。(予想です・・・。)

これを根本的に防ぐには、パックやマレットをブループリント化する必要があるかもしれないが、オーバーラップイベントを利用し、移動に関してはスウィープを有効にすることで対処出来ると思う。が、これは俺の能力を超えているので、今回は使わない。その代わりに、パックの最大速度を制限することで、猛スピード化を阻止する。

----------

まずは、パックの速さがどんなもんか確認してみよう。

  1. [Event Tick] から始まるラインの、最終ノードから実行線を伸ばしていってもいいのだが、横に長くなりすぎるのがイヤなので、
  2. [Sequence](シーケンス)で実行線を流す
  3. [Print String] でログ表示するように
  4. パックのリファレンスを追加し、そこから [Get Velocity] を出し [Print String] へ繋ぐ。
  5. [Get Velocity] から [VectorLength] を出し、[Print String] へと繋ぐように変更。より分かりやすい表示へ

f:id:ore2wakaru:20160418114437j:plain

【追加の解説】

[1] パックの速度を常に監視していたいので、[Event Tick] に繋がる実行線(白線)につなげ、横へ横へと伸ばしていくので全然イイのだが、横に長過ぎてしまうのを防ぐのと、見やすさを考慮して、以下 [2] のようにした。

[2] [Sequence] とは、実行線の流れを制御(フローコントロール)するノードの一つ。最初に [Then 0] から繋いであるノードの処理をどんどんする。このラインがが終わったら、次に [Then 1] に繋いであるノードの処理へと進む。で、[Add pin +] のところで、2とか3とかピンを増やしていける。今回は、0でマレットの処理をして、1でパックの処理をすると見やすいのではと思い使用している。

また、フローコントロールのノードは、[Branch] や [Sequence] 以外にもいくつかあるので、ここ"Unreal Engine | フロー制御"を見ておくことをオススメする。

[3] [Print String] は、恐らくこのチュートリアルを発見された方には説明の必要はないと思うが、一応。[In Strirng] の内容をゲーム画面の左上にログ表示するもので、最初は "Hello" とか入っているハズ。デバッグ中、「処理がここに来たよー」ってことを知りたい時によく使うノード。よく使うというか、このノードを知らない人はいない、というくらい当たり前に必須のノード。

[4] 今回は、処理がちゃんとココに来たことを知りたいのではなく、パックの速さを知りたいので、[Get Velocity] を使っている。このノードで対象アクタの速度(velocity)を取得できる結構格好いいノード。まずは、[5] へ進む前にここで一旦コンパイルして [Play] してもらいたい。画面左にパックの velocity がダーーっと流れて表示されるハズだ。ただ、velocity は x,y,z の3つの要素からなっている(vector型)ので、直感的にはパックの速さを掴み難い。

[5] パックのx方向やy方向などの個別の速さを知りたいわけではなく、方向に関係ない速さ(普通の速さのこと)を知りたいので、[VectorLength] ノードを使って vectorベクターorベクトル)の長さを取得する。このベクトルの長さがずばり速さだ。「え?」ってなる人は、高校の時の物理とか数学を思い出すんだ。[4] での表示よりは分かりやすいと思う。

※ [Print String] の前に勝手に出る「型変換ノード」に関しては、変数の知識が無いと意味不明だと思うので、"Unreal Engine | ブループリントのユーザーガイド:変数"を参照。UE4だけでなく、他のプログラミング言語でも、変数の「型(Data Type)」でつまづくとゲームは作れない。が、全部一気に覚えるのではなく、いっぱい型があることは知っておいて、出てきた順に一つひとつ、ゆっくり覚えていった方がいい。特に構造体がどーのこーのとか言われても困っちゃうっていう人は、本当に焦らず、最初は自分の使う分だけ、ゆっくり覚えていった方がイイ。変数は、使う分だけ、、、。そうしている内に、ある時、パッとすべてが開ける日が来る。

今まで出てきたのは、Boolean、Float、Vectorの3種類かな? この3つは必須。

で、[Print String] は文字通り、「String型」でデータを表示するものなので、「Vector型」や「Float型」のデータは「String型」に変換しなければいけないというルールがある。変数には、それぞれに決まった型があって、いちいち指定したり変換したりしないといけないで煩わしいが、ここはUE4が勝手にやってくれるので、便利っていえば便利だ。

おっと、これで4種類になったのかな「型」。

----------

さあ、コンパイルして [Play] してみよう。壁をすり抜けて行く時の速さが大体つかめたのではないだろうか。"9000"とか出てると確実に抜けていくのではと思う。しばらくテストしてみて、結果、"3000~4000"くらいを上限とするのがイイと思うが、どうだろうか。取り敢えず、速さが"4000"を超えた場合には、"4000"になるように変数を使ってセットしてみよう。

----------

まずは、変数を作る。

  1. 変数(variable)を追加するために、[My Blueprint] の [Variable] の横にある [+] をクリックし、名前を付ける。これがパックの最高速度だと分かりやすいよう、"PuckMaxSpeed" とした
  2. Float型にするため、[Details] の [Variable Type] のドロップダウンメニューから、"Float" を選択する
  3. コンパイル(これ、忘れずに!)
  4. [Details] の [Default Value] に数値をセット出来る様になるので、今回セットしたい最高スピードの "4000" を入力。ご希望なら、違う数値でもOK

f:id:ore2wakaru:20160418182014j:plain

【追加の解説】

[1] 別に変数を使わなくても、後述する該当箇所に手入力で "4000" と入れてもいいのだが、そういう箇所が複数ある場合は修正する時に面倒なので、変数化しておく。ブループリントを書く時は、修正する時の便利さを考えて、以前やったように同一処理にまとめたり、今回のように変数を使ったりする方がイイ。簡単に言うと、見やすさも含め、メンテナンス性の悪いブループリントは、ダメなブループリントと考えていい。

[2] 最初、変数の「型」は「Boolean(ブーリアン)」であると思う。これは "True" か "False" の2つの値しか取れない変数の場合の型。欲しいのは、"4000" という数値なので、これではダメだ。変更しよう。変更するには 図のように [Details] の方から変更する方法と、もう一つは、[My Blueprint] の [Variables] で名前を決定した後、左横の色のついた(赤)バーをクリックすることでも変更できる。

[3] 名前を付けて、型を決めたら、コンパイルしよう。そうしないと [Default Value](初期値)に数値を設定できない。数値を入れる前にコンパイルだ。

[4] "4000"。

※ "4000" という数値は少数点を含まない数値なので、知ってる人は、"Integer" でもイイのでは? と思うかもしれないが、その通りで、"Integer" でも良い。ただ、[VectorLength] の出力値がFloat型なので、比べる時に型変換ノードが出る。

----------

では、実際にブループリントを描いていこう。と思ったが、長くなりそうなので、次回。では、また。

"Save All"。