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

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

【日本語】 UE4 ホッケーゲーム part.22 ゴールと得点管理2 (overlapのワナとGameModeのグラフ利用)【チュートリアル】

ゴールで [Box Trigger] が反応しない理由は、パック側のプロパティ [Generate Overlap Events] にチェックが入ってないから。[Collision] のカテゴリにあるから、下の図を見てね。トリガでイベントを発生させるためには、空間に入ってくるアクタの方に設定しなければいけない項目があるので注意だ。結構、罠だったりするよね、これ。以前、スタティックメッシュが動かないという罠があったが、その時は [Movable] への設定が必要だった。共に見落とさないで欲しいワナ。

f:id:ore2wakaru:20160421165221j:plain

これで、ゴールが決まった瞬間に、パックが中央に戻るハズだ。試してみてくれ。それが確認できたら、次は得点の処理に入っていこう。

----------

得点は、どう処理するか。表示はUMGを使って行いたい。そこで大事なのは、

  1. 得点を貯めておく場所が必要
  2. 表示のため、ウィジェットブループリントからアクセス出来る必要性あり

ということなのだが。

f:id:ore2wakaru:20160422094431j:plain

結論から言うと [GameMode] を使う。

  1. [GameMode] の中に、得点管理用の変数を作り得点をためておく場所とする
  2. ウィジェットブループリントからその変数にアクセスする

こうして、得点をゲーム画面に表示させる方法をとる。

ではなぜ、[GameMode] を使うか。本当は、そんなことをしないで、1.「レベルブループリントに変数を作って得点を管理し、ゴールが決まったら得点に+1して」、2.「ウィジェットにデータを送ればイイ」と思うはずだ。だが、なんとコレは使えない。ナニ!?

どうも、レベルブループリントに作った変数をウィジェットブループリントは参照出来ないようなのだ。つまり、1.は出来ても、2.が出来ない。残念。というわけで、[GameMode] を仲介させる方法を選んだということ。

もちろん、コレ以外の方法でやっても構わない。ウィジェットから変数を参照できるならなんでも可。ご自分で、他のいい方法を発見して、どんどんトライだ。結果がよければどんな方法でも構わない。一つの結果(表現)を出すには色々な方法があるからな。

----------

2面に入ってから使うことにした自作のゲームモード [ZZ_GameMode] を使う。

  1. コンテンツブラウザの [ZZ_GameMode] をダブルクリックで開く
  2. [Open Full Blueprint Editor] をクリック
  3. 見慣れた感じのモノに戻る

f:id:ore2wakaru:20160422140917j:plain

【追加の解説】

[1] [GameMode] と言ってもEpicさんが用意したデフォルトのものを使うのではなく、2面に入ってから使うことにした自作のものを使う。当たり前だが、2面に入ってお取り替え(オーバーライド)したからだ。

[2] びっくりしないように。見慣れた表示に戻るから。

[3] 戻ったでしょ。

----------

敵陣にゴールが決まった場合を考えよう。つまり、プレイヤー側の得点を加算する流れだ。

  1. 変数を追加 "ScorePlayer" とした。型は "Integer" を選択
  2. カスタムイベントを作成。名前を "PointPlayer" とした
  3. 変数 "ScorePlayer" に "1" を加えたものを、"ScorePlayer" にセットする

f:id:ore2wakaru:20160422160053j:plain

【追加の解説】

[1] プレイヤーの得点を管理する変数を作る。分かりやすく、"ScorePlayer" とした。得点は、1点、2点、など、少数点を含まないので、整数型(Integer)とする。[Components > DefaultSceneRoot] という変な変数が入っているが、これはデフォルトで [View] に追加されているもの。消せないので、このまま。

[2] 得点を加えるのは、何時か考える。始めの1回だけ(Event BrginPlay)でもなければ、毎フレーム(Event Tick)でもない。ユーザーがやってほしいと考えたタイミング(ゴールが決まった時)で行いたい。ということで、以前やったようにカスタムイベントを作る。カスタムイベントは、ユーザーが指定したタイミングで発生させられる便利イベントノードだった。

これも分かりやすい名前を付けよう。プレイヤー側のポイント管理なので、"PointPlayer" とした。

[3] ここが一番大事な箇所。"ScorePlayer" の値を+1させる方法。変数をドラッグして持ってきて、[Get] [Set] するやり方は大丈夫だと思う。加算のノードは "+" で検索すれば出てくる。注意するのは、ここで、[integer + inerger] を選ぶ所。型が違うと思い通りの結果が得られない。

慣れないと、上下で加算するこのノードが変な感じだと思うが、足し算も掛け算も引き算も割り算も、全部上下だからね、UE4は。

それから、デフォルトで "1" が入っていると思うが、ちゃんと "1" か、確認しておいて。2点入れたかったら、"2" にしてもイイぞ、別に。

簡単に流れを説明すると、現状の "ScorePlayer" の値を持ってきて、それに "1" を加え、再度 "ScorePlayer" にセットする。これで、"ScorePlayer" を+1させているのだ。最終的に "ScorePlayer" に新たな値が入ったということだ。大きな流れは、ちゃんと左から右になっているので、分かりやすいと思う。

----------

これで、「呼ばれる側」 が出来た。次に「呼ぶ側」に手を加えていく。前にも書いたような気がするが、呼ばれる側を作ってから、呼ぶ。「作ってから、呼ぶ。」この順番が大事だ。書いたかな? 無いものは呼べないとか何とかそんなことを。

まあいいや。それで「呼ぶ側」は、もちろんレベルブループリント。パックが敵ゴールに入ったことを知らせる [Box Trogger] のイベントのところだ。[OnActorBeginOverlap (GoalCom)] って作ったろ。この後ろのところから続けて・・・、

と思ったが、キャスト(cast)の説明をしなければならないので、長くなりそうだ。またにさせてくれ。では。

"Save All"。