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

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

【日本語】 UE4 ホッケーゲーム part.21 ゴールと得点管理1 (box triggerのイベント利用)【チュートリアル】

自キャラ(プレーヤーのマレット)とパックの動きは設定できた。(あ、マテリアルはまだだった。)残りの課題は、得点処理、敵AI(相手のマレットの動き)、ゲームオーバー処理だ。

今回は、得点処理の前編として、パックがゴールに入った時の処理をやっていく。当然だが、自分のゴールに入った時は相手の得点に、相手のゴールに入った時には自分の得点になるようにする。得点の表示も必要。どちらかが10点とったら、ゲームオーバー処理につなぐ。そんな流れにしていくための下準備をする。

----------

まずは、ゴール部分を追加する。

  1. マレットが出て行かないよう、壁を塞いでいたが、元に戻す
  2. [Box Trigger](カテゴリは [Basic] にある)をドラッグ&ドロップでビューポートに持ってくる
  3. 分かりやすく名前を付け替える。Computer側のゴールなので、"GoalCom" とした
  4. "GoalCom" の位置と大きさを整える
  5. 自分側も同様に設定する。自ゴール側は、"GoalPlayer" とする

f:id:ore2wakaru:20160420192412j:plain

【追加の解説】

[1] 特に問題はないと思う。[Details] の [Transform] で直せばいい。

[2] [Box Trigger] とは、何らかのアクタがこの四角い空間に入った時、または出た時に、何らかの処理をさせるために使うアクタ。ボタンのマークが描いてある通り、この空間に何か入ってきたら(または出たら)、ボタンを押して知らせるという感覚だ。イベントの発生を知らせるということ。実際のゲームでは、ココの空間にパックが入ってきたら、「ゴールしたよー、1点追加ー」という処理をしたいので、この [Box Trigger] を使っている。ちなみに、[Sphere Trigger] は空間が球の場合用。

[3] 後でブループリントに持ってくる時、分かりやすいよう、名前を変えておく。

[4] 位置と大きさを整える時の注意だが、大きさを、ちょっと大きめに設定することだ。特に奥行き。パックのスピードは最大スピードを調節して、一応は壁を抜けないようにしたが、[Box Trigger] の空間を無視して行かないよう、ちょい分厚くしておいた方がイイ。それから、どうも [Box Extent] で設定する数値は、空間が直方体でも、辺の長さではなく、中心からの長さ(半径?)のようだ。

[5] 自分側も同様に壁を直し、 [Box Trigger] を設置。位置・大きさを調整して分かりやすい名前を付けてくれ。位置は、x座標がプラスとマイナスで違うだけ。Alt+ドラッグでコピーしてきてもいい。名前に関しては、別に コンピュータ側を "ComGoal" とし、自分側を "PlayerGoal" としてもいい。ただ、俺が "GoalCom" と "GaolPlayer" としたのは、こうする方が、[World Outliner] 上で2つが上下にピッタリ並ぶからだ。見やすくないか、この方が。

----------

ビューポートに置いたゴールを機能させるため、ブループリントを描いていこう。

  1. ブループリントに素早くちゃんと出すため、リファレンスを出す時みたいに、あらかじめ "GoalCom" を選択しておく
  2. 空いている場所で右クリ
  3. 出てきたメニューの、[Add Event for Goal Com] から [Collision] と下って行き、[Add On Actor Begin Overlap] を選択
  4. "GoalCom" 専用のオーバーラップイベントノードが出る

f:id:ore2wakaru:20160420205828j:plain

【追加の解説】

[1] リファレンスを出すのと同様に、先に選択しておくことが大事。こうすることで、欲しいノードへ素早くアクセス出来る。

[2] 以前もやったが、ビューポートでアクタを選択してから右クリすると、そのアクタ専用のノードが上の方にかたまって表示される。今回は上3行がそのカテゴリに当てはまる。これで、欲しいノードに早くたどり着けるわけだ。

[3] 三角マーク(▷)を開いて下って行くと、[Add On Actor Begin Overlap] がある。これはどんなノードかというと、自身と他のアクタ(actor)が重なった時に、実行線に繋がるノードの処理を開始していくもの。重なっている間ずっとというわけではなく、"begin" とあるように、重なりはじめの最初の1回で、イベントが始まることに注意。また、"overlap" にはちょっとした罠があるのだが、それは後で説明したい。

ゲーム上の処理を簡単に言うと、ゴールアクタとパックアクタが重なった時(オーバーラップした時)にゴールと判断し、この後に色々な処理を追加していきたいわけだ。

[4] [OnActorBeginOverlap (GoalCom)] と、ちゃんと括弧の中に "GoalCom" と書いてあるので、"GoalCom" 専用のものだと分かる。これ、結構ポイント。それから、このノードの出力ピンに [Other Actor] というのが見えるが、ここに、"GoalCom" にオーバーラップした相手の情報が出力される。上でも述べたように、ゴールでは、パックとのオーバーラップがあったかどうかを判定したいので、次に、コレを利用してオーバーラップの相手がパックかどうかを判定していく。

後で、もちろん "GoalPlayer" 専用の方も作る。

----------

では、[OnActorBeginOverlap (GoalCom)] に繋げるノードを作っていこう。それで具体的に、以下、どうするかというと、考え方なのだが、

  1. もし、オーバーラップの相手がパックなら(条件)
  2. ~~という処理をする(条件成立の場合(結果))

と考えればうまくいきそうなので、[Branch] を使えばイイと分かるはずだ。

  1. 相手がパック(スタティックメッシュのシリンダーを変形させて "Puck" と名付けたあれ)かどうかを名前で判定するため、[Get Object Name] を出す
  2. 名前が "Puck" と「イコール」かどうか判定したいので比較のノード(今回は "==")を利用する
  3. "Puck" と書き入れる。これが比較する文字列
  4. Bクリして、[Branch] ノードをだし、実行線、および、[Condition] への線をつなぐ。取り敢えずの処理として、[True] には [Puck Dasu] を繋いでおこう
  5. "GoalPlayer" 側にも同様のノードを繋げる

f:id:ore2wakaru:20160420223251j:plain

【追加の解説】

[1] [Get Object Name] はその名の通り、モノの名前をゲットしてくるもの。アクタに付いている名前を利用したいので、このノードを使う。それから、これは、[Other Actor] から引っ張り出すのがポイント。また、[Context Sensitive] にチェックが入っていると、出てくる選択肢を少なくする効果があるので、常にチェックしておくのがイイ。明らかに、常時「入」がオススメ。

[2] 比較には、前回、不等号 ">" を使った。これは数値の大小を判定する。が、今回は同じかどうかを判定したいので、等号 "=" を使う。これは、数値でなくてもイケる。ただ、古いしきたりで、記号は "=" ではなくて "==" を使うことになっているということだけ注意だ。("=" には、別の意味が割り当てられているようだ。)

[3] 比較する文字列(string)を入れる。パックには、"Puck" と命名したはずなので、そう入れる。細かいことを言うと、ここは、string型同士を比べている。型があるって話、前ちょっとしたから、一応。

[4] [Branch] ノードはBクリ(キーボードの"B"を押しながら、マウスクリック)で出せるので、このやり方は、覚えよう。いちいち、右クリして検索なんてめんどくさすぎる。

条件が成立した場合は、[True] に処理が流れるので、本当は、この後に([True] の後に)得点処理をつなげていきたい。だが、長くなりそうなので、とりあえず、[PuckDasu] をつなげた。[PuckDasu] はどういう処理か忘れてないよな。パックにいくらかの速度を与えて、テーブル中央に出す一連の処理だ。これで、パックがゴール空間に入ったら、その瞬間、テーブル中央に戻って来るはずだ。

[5] "GoalPlayer" も同様に。

----------

ここまでやって、コンパイル、そしてプレイしてみてくれ。どうだろうか、

  パックは・・・

   ・・・ゴールの後・・・

 も進んでいくーーー。

のではないだろうか? 何故かと言うと、先ほどチラッと述べた「オーバーラップの罠」が関係しているのだ。それはまた今度にしよう。

では、また。"Save All"。