【Unreal Engine5】初めてのゲーム開発 <第13回> ブロック崩しを作ろう②

前回はボールとバーの動作の実装をしたので、今回は実際にブロックを配置して遊べるようにしたいと思います。

今回の実装後テスト

今回の企画で初めてゲームっぽいものが出来た気がする!
ステージセレクトどころかクリア判定もないですけど。

使用しているバージョン

Unreal Engine 5.3.2

目次

ボール挙動に関する調整

この章に関しては、挙動の自己満足的な調整なので、必須ではありません。
つまりこの章は飛ばしても問題ありません

ブロックの設置に行く前に、前回やった部分にはなりますが、もう少しだけ調整したいと思います。

挙動の問題点

ボール挙動が真横(X=0)に近くなってしまうと、なかなか下に落ちてこない場合がある
最悪ずっと左右往復してしまうこともある。
②左右のバーに当たるとX運動エネルギーが-1000されるので非常に遅くなってしまうケースがある。

今回はこの2つを改善したいと思います。

本題に行く前に、今回作成するブロック崩しにおける運動エネルギー(XY)がどの方向を示しているかを記載しておきます。

これはあくまで、今回の配置における運動エネルギーの方向を示したもので、ブロックの置き方によって変化します。
分かりやすく言うとAdd ImplseでXに100を入れると赤Xへの運動エネルギーが100増加(速度が上がる)

具体的にはボール(BP_NGBall)のOn Component Hit (Sphere)の部分を修正しました。

全部みるとやばいので、主に大きく追加した処理だけ見ていきます。
中央付近のも結構分岐処理とか入っているのですが、そこは文章で記載します。

左上
Get Physics Linear Velocity (Sphere)targetが保有する運動エネルギー(XYZ)を取得する。

Get Physics Linear VelocityノードはSet Physics Linear Velocityノードの対で、対象のStatic Meshが保有する運動エネルギーを取得することが出来ます
この関数はボールが何かに衝突した際にコールされ、最初にGet Physics Linear Velocityで運動エネルギーの数値を取得しています。
Hit後のベクトルであり、跳ね返った際は今から進行する方向への運動エネルギーとなります。

取得した運動エネルギーのうちX値のみをXVelocityというローカル変数(Float)に格納します。

右下

ボールが当たった相手がバー以外だった時の処理を追加しました。
Xが正なら、X方向に100の運動エネルギーを加算
Xが負なら、X方向に-100の運動エネルギーを加算

つまり、バー以外の何かに当たると進行方向(X/-X)への運動エネルギーが加算される処理で、左右の壁の往復でなかなか落ちてこない状態を防止します。

それ以外の変更した処理

中央あたりのごちゃごちゃした部分の処理を箇条書きで
・バーの中央に当たった場合
X方向に運動エネルギーを100加算
・左バーに当たった場合
Y方向に運動エネルギーを-1000加算(左方向へ加速)
X方向の運動エネルギーが4000を超えていた場合、X方向に運動エネルギーを-1000加算(減速)
・右バーに当たった場合
Y方向に運動エネルギーを1000加算(右方向へ加速)
X方向の運動エネルギーが4000を超えていた場合、X方向に運動エネルギーを-1000加算(減速)

減速に条件をつけることで、過度にボールが減速してしまう問題を修正しました。

また、グラフは特に載せませんが(Event Begin Play)初速用のAdd ImplseのX設定値を8000⇒4000にしてボールの初速を落としました。

壊れるブロックを作成&配置してみよう

壊れるブロックを作る

といっても、第11回で当たると破壊されるブロックは作っているので流用します。

ブロックは3種類、100点/400点/1000点用を作りました。
点数に応じてHPも増えるので壊すのに1回/2回/3回のHitが必要になります。

BP_TargetBlock100P

Cast Toの先をBP_Ballから、今回用のBP_NGBallに変えたりとかその程度。
点数の違いはUpdate Score(BP_BarControlのカスタムイベント)に引数として渡す。

壊れるブロックをステージに配置

配置してみました。
横サイズについてはおおよそですが、配置ブロック最大は6で左右に0.5ブロック程度の隙間を想定。

ゲーム的にはもう少しブロックのマテリアルは凝った方がいいですね。

得点の調整条件を追加してゲーム性を上げる

今のところブロックを壊して得点というだけですが、ゲーム的にはもう少し多様性を持たせた方がやり込み要素になります。
というわけで得点関係の処理を少し追加。

こちらも第11回で作成したBP_ThirdPersonCharacterのwidget関連の処理を流用

BP_BarControl(Event Begin Playの一部)

前半(widget関連)は完全にそのままなので、後半だけ。

Set Timer by EventTime毎にEventを発行する。
Looping チェックは大体の場面で必須。
Add Custom Event   Timer Eventという名前のカスタムイベントですが、他からコールされることは今のところありません。
Update Score左で定義している関数。
1秒毎にスコアを-1します。

Enhanced Action Events IA_Spaceに処理追加

スペースキーは移動速度3倍モードですが、使用中-1ずつ得点が追加で減少(1フレーム毎⇒1秒間に-60?)
制約なしにダッシュできるとゲーム性が落ちるので得点減少させることに。

次回に向けた課題

残った課題
①クリア画面
②拾い損ねた時に玉消滅&次の玉出現&スコア減少(今は裏から跳ね返ってる)
③ステージの生成(DataTableでいける?)
④ステージセレクト画面

どれも重そう…①④は理解が浅いwidget、③はかなり大変そう。
ステージ自動生成とかできたらいいですねぇ。
これ次回で終われるのか…今回はさっくりすぎたので、もう少し残業した方がよかったかも…

一応ゲームらしきものになったのでキリがいいと思ったんですけど。

コメント

コメントする

目次