前回はボールとバーの動作の実装をしたので、今回は実際にブロックを配置して遊べるようにしたいと思います。
今回の実装後テスト
今回の企画で初めてゲームっぽいものが出来た気がする!
ステージセレクトどころかクリア判定もないですけど。
使用しているバージョン
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 Event | Time毎にEventを発行する。 Looping チェックは大体の場面で必須。 |
Add Custom Event | Timer Eventという名前のカスタムイベントですが、他からコールされることは今のところありません。 |
Update Score | 左で定義している関数。 1秒毎にスコアを-1します。 |
Enhanced Action Events IA_Spaceに処理追加

スペースキーは移動速度3倍モードですが、使用中-1ずつ得点が追加で減少(1フレーム毎⇒1秒間に-60?)
制約なしにダッシュできるとゲーム性が落ちるので得点減少させることに。
次回に向けた課題
残った課題
①クリア画面
②拾い損ねた時に玉消滅&次の玉出現&スコア減少(今は裏から跳ね返ってる)
③ステージの生成(DataTableでいける?)
④ステージセレクト画面
どれも重そう…①④は理解が浅いwidget、③はかなり大変そう。
ステージ自動生成とかできたらいいですねぇ。
これ次回で終われるのか…今回はさっくりすぎたので、もう少し残業した方がよかったかも…
一応ゲームらしきものになったのでキリがいいと思ったんですけど。
コメント