前回までで基礎的なステージ構成は作り終えましたが、少しだけ手直ししてからUI周辺の処理を行います。
今回の実装後テスト ※少し音量注意
前回からの追加機能
・デッドゾーンの作成(ボール消失&再生成)
・クリア判定&クリア画面
・セーブによる高得点データの引継ぎ
使用しているバージョン
Unreal Engine 5.3.2
スポーンポイント&デッドゾーンを作成
方針
バーで拾い損ねた場合、既存のボールは破壊し新しいボールをリスポーンします。
ボールに関してはいままではビューポートにそのまま配置していましたが、スポーンポイント(BP_BallStartPoint)を配置しそこにスポーンさせるよう変更。
デッドゾーンは新しく作ったBox型のアクタを使用。
コリジョンプリセットをOverlapAllにしてOn Component Overlapを使い判定。
イベントグラフ
ボールの生成
BP_BallStartPoint
シンプルなので説明は省略。
ボール破壊&再生成
BP_NGBall
On Component Begin Overlap (Sphere) Cast To BP_DeadZone | ボールがBP_DeadZoneをオーバーラップした時に処理開始 |
Play Sound 2D | ボール消滅時のSE |
Update Score | BP_BarControlのカスタムイベント |
Set Physics Linear Velocity | ボールの運動エネルギーをリセットし、-100(X軸)をセット。 |
Delay | 生成までの猶予時間(2秒) |
Create Ball | BP_BallStartPointのカスタムイベント |
Destroy Actor | 自身を破壊 |
Destroy Actorは最後がいいと思います。
一応途中にDestroy Actorを記述してもその後の処理は動きますが、Delayを設置するとそこで処理が止まりました(Destroy Actorで自身が消滅したのが原因)。
Delayを設置しない場合でも、ラグなどが発生して思わぬ挙動が起きる可能性があるので、自身を消滅させるDestroy Actorは最後に記述するのが無難。
Set Physics Linear Velocityを使用したのは、ボールが消滅するまで(2秒)にボールにあまり動いて欲しくない為、ですが溶岩に沈むような演出になったのはラッキーでした。
クリア判定
全てのブロックを破壊した時にクリアとし、レベルを再開。
ターゲット用のブロック群(BP_TargetBlockXXXX)を一括カウントできるようにする
Get Actors of Class ⇒ Lengthで残存数を確認したいのですが、このままだと上手くいきません。
BP_TargetBlockParent(親 Actor)のBPを作成し、そちらを親クラスにすることでGet Actors of Classで一括でクラスインスタンスの配列を入手できるようにします。
イベントグラフ
BP_BarControl
Get All Actors Of Class | BP_TargetBlockParentのインスタンス配列を取得 |
Stop Score Count | 自身のカスタムイベント Continue Score(ローカル変数)にFalseを入れ、Update Scoreの際にContinue ScoreによるBranch判定でスコアの更新を止める。 |
Open Level (by Name) | 自身のレベルを再スタート(とりあえずの処理) テンプレートを使ってる場合はThirdPersonMap |
BGMの切り替え方法
今まで使ってきた方法(Play Sound 2Dノード)の問題点
BGMの切り替えにはいくつか方法がありますが、今まで使用していたのはPlay Sound 2Dというノードで開始時に再生を開始するというもの。
SEならいいのですがループ再生をするBGMでは、Stopを行うことが出来ないので別の方法に変えてみます。
SPawn Sound 2Dという似たようなノードだと、返り値(Audio Component)に対しStopを発行すると音の再生を止めることが可能。
Play Sound 2D
SPawn Sound 2D
ですが、こちらの場合レベルを再度開始(Open Level)した時にSpawn Sound 2Dが走るとエラーが発生してしまいました。
これはおそらくOpen Levelで新たにステージを開始した時にもAudio Componentが残っているため発生していると考えられます。
調べれば完全に停止する方法もありそうですが…
プレイヤーキャラ(BP_BarControl)のコンポーネントとしてBGM登録しておく方法
プレイヤーキャラと言っても、今回のケースでは画面には登場しない仮初のプレイヤーキャラであり、1つしかインスタンスを作成しない分かりやすいBPならどこでも。
コンポーネントに音楽をそのまま登録しておく
Auto ACtivateをOFFにしておく(デフォルトON)
Is UISoundをチェック(ON)にすると一時停止(pause)中も音楽が流れるようになります。
今回はクリア画面で一時停止を使用するので勝利時BGMはONにする必要があります。
これで新たにAudio Componentを作成する必要はなくなります。
BGM開始時にPlay
BGM終了時にStop
あとは開始(Play)、終了(Stop)で管理してあげればいいだけ。
1回使うだけのSEならPlay Sound 2D、と使い分けも。
BGMが増えるようであれば、BGM管理用のBPをレベルに配置した方がいいかもしれませんね。
ステージクリア画面の実装
ウィジェット(WB_StageClear)外観
ウィジェットはあまり使いこなせてないです。
表示部は中央に集まっているので、全てのアンカーを中央にしてできるだけズレないように。
枠はフリーのpng透過素材。
<使用パレット>
Canbas Panel
Scale Box
Border
Text
Button
BackGround Blur
ウィジェットグラフ
今回バインドしたのは
スコア表示⇒Score
クリアタイム表示⇒ClearTime
最高得点表示⇒MaxScore
いずれもIs Variableはチェックしていません。
というかBindするのにIs Variable(参照のみの変数化)する意味はあるのでしょうか?
色々やってますが、上側ではウィジェットが呼び出された時に表示部分を作成。
変数(Int Score/Clear Time)はwidgetを呼び出す側(BP_BarControl)でセットします。
下はリスタートボタンが押されたときの処理。
ウィジェットをコールする処理(BP_BarControl)
クリア判定
上でやったクリア判定を一部変更しています。
Stop Score Count(クリア後にスコアを止める)はなくしました。
代わりに後述の処理でSet Game Pausedを発行してゲーム自体を一時停止するように変更しました。
Stage Clearノードはカスタムイベント(後述)。
クリア処理(前半)
Set Game Paused | ゲームの一時停止 |
Create Widget | クリア画面(WB_StageClear)を生成 ・スコアをメイン画面のintScoreから設定 ・クリタイムをメイン画面のTestTimeCountから設定 |
クリア処理(後半)
Remove from Parent | メイン画面(ウィジェット)を削除 |
Set Show Mouse Cursor | マウスカーソルを表示 |
Stop/Play | 音楽(Audio Component)の停止/再生 通常BGMを止めて、勝利BGMに |
Add to Viewport | クリア画面(ウィジェット)をビューポートに表示 |
クリア画面を表示してみるとこんな感じに。
最高点は次の章で実装します。
セーブデータによる最高得点の保存
公式ドキュメントみたり、自分で色々いじったりしてみたのですがピンとこず。
そんな中こちらのサイトで丁度やりたかったことの解説がされてました。
参考にさせて頂いたサイト様
[UE4]閉じても消えないスコアランキングを作ろう
https://historia.co.jp/archives/24018/
UE4用ですが、UE5.3.2でも問題なく動きます。
ワイヤーもきちんと分かるように丁寧に解説して下さっています。
記述するファイルだけ間違えないように(①はsavedataクラス、②③は出力するwidgetクラス)。
ほぼそのままなので解説は省きますが、ウィジェット(WB_StageClear)の実装部分のみ画像をのせておきます。
マクロ部分は同じなのでカット。
ごちゃごちゃしてますが、最初にStart(カスタムイベント)を呼んで、あとはバインドした変数に出力文字を入れ込んでるだけです。
これで過去3位までのデータが残ります(プロジェクトを起動しなおしても残っています)。
最後に
この3回である程度形になったと思います。
ステージクリア画面で花火くらい打ち上げたいと思いましたが別ソフトのBlenderに手を出すのは少し早い気も…
使えると便利そうなのでいつかは勉強したいですけど、Blender。
あとは、ステージ生成(datatableから?)と、ステージセレクト画面、コンフィグ画面、解像度調整をどうするか。
最後にパッケージングでしょうか。
一通りの製作過程としてはまだ結構ありますね…
「ブロック崩しを作ろう」シリーズをひとまず完了にするかは悩み中ですが、残課題を軽く触ってみて目途が立ちそうであれば④をやるかもしれません。
コメント