ブロック崩し編最終回。
今回やるのは「ステージセレクト」「パッケージ化」。
《パッケージ化後のexeファイル起動時のゲーム画面》
バグもいっぱいあるので、ゲームとして成り立ってるとはいえないですが、パッケージングまで出来たということで今回の企画はこれで終了とします。
なんとかそれっぽいものを作れるところまで行けて一安心。
カーソル消し忘れてたり、ボールリスポーン時に運動エネルギー加算しそこねてたり、最高得点が全ステージで1つだけだったりしますけど…
使用しているバージョン
Unreal Engine 5.3.2
GameInstanceでレベルを跨いだデータ共有
今までは1つのレベルで完結していましたが、今回はタイトル画面のレベルを作ります。
ブロック崩しはステージ使いまわせるので、分けなくてもレベルブループリントとwidgetを使うことで1つのレベルで完結する作りにもできるとは思いますが、一般的にはステージ毎にレベルを作ることになるのではないでしょうか(素人感)。
各レベルの関係性はというと
こんな感じになっていて、レベル毎に1つのレベルブループリント、ゲーム全体でのGame Instanceというブループリントがあります。
今まで使ってたレベルブループリントの範囲がさらに広がった感じ。
レベルブループリントは上部にあるボックスが3つ並んでるようなアイコンから「レベルブループリントを開く」で設定可能。
Game Instanceは新規ブループリント作成時にGame Instanceで作成するか、作成したブループリントの親をGameInstanceに変更して作成。
最後に上部タブの「編集」⇒「プロジェクト設定」から上画像のGame Instanceのところに作成したブループリントを登録すれば完了です。
GameInstanceで設定した変数は
どのクラスからでも、Get Game Instanceで引っ張ってこれる。
もちろんレベルを跨いで必ず必要になる初期設定などもイベントグラフに記述できるので、ゲームを作る際はまずGame Instanceで行うべき処理、持っておく変数などの設計をすべきかもしれません。
所謂グローバル変数格納エリアとして重宝しそうですが、なんでもかんでも格納してしまって最適化に影響がないかは気になるところです。
ステージセレクト画面の実装(送り手側の処理)
タイトル用のMAP(TitleMap)を作成
と言っても、今まで使ってたStageMapをコピーしただけです。
レベルブループリント
Create Widget Add to Viewport | メインメニュー画面(次項目)を画面に表示 |
Set Show Mouse Cursor | マウスカーソルを表示する(レベルが変わるまで) |
Get Actor Of Class Destroy Actor | ゲーム画面をコピーしただけなので、ボールを消してます。 |
他にも細々とした調整をしています。
例えばBP_BarControl(Default Pawn Class)では得点表示などのWidgetを呼び出していましたが、TitleMapレベルではそれをしないようにしたりなど、不具合の出る場所を調整。
Default Pawn Classは全レベル共通なので、BP_BarControlに初期設定を頼りすぎるのはゲーム設計としてよくなかった。
タイトル画面用のwidget(WBP_MainMenu)作成
処理としては、どのステージのボタンが押されたかをステージ用のレベル(StageMap)に伝える役割。
苦手部分なので軽めに…
Set Visibility | Collapsedを指定 自身(WBP_MainMenu)を非表示 |
Create Widget Add to Viewport | ステージセレクト画面(WBP_StageSelect2)を表示 |
Quit Game | ゲーム終了 |
ステージセレクトに使用するボタンのwidget(WBP_StageSelectButton)作成
見た目は適当ですが、処理は重要。
最高得点などのデータも表示しようとも考えましたが、今回は見送り(逃げ)。
見た目ももっとカッコよくできると思います…
Event Pre Construct | widgetが作成されたタイミングで動作(初期から配置済) |
SetText (Text) | Stage Name(is variabeされたパーツ)に対し、LocalStageName(変数)を設定する。 is variabeしてもSet はできないのだが、SetText (Text)ならテキストセットできる(ナンデ?)。 LocalStageName(変数)は、次のステージセレクト画面(WBP_StageSelect2)で設定される。 編集可能(目のマーク)を忘れずに。 |
On Clicked~ | Button_StageSelectの詳細パネルから作成 |
Cast To BP_Game | Game InstanceのStage Num(ステージ番号)にステージ番号をセット。 ステージマップ(StageMap)側でステージ生成時に使用します。 |
Open Level (By Name) | ステージマップ(StageMap)を開く |
選択ボタン背景変更
ボタンの子widgetのBorder_135のBrush項目からバインドで「バインディングを作成」を選択
GetBackGroundはウィジェット作成時に動くイベント
Switch on Int | 入力値(integer)により処理を分岐 ピンは増やせるが分岐は0,1,2…と固定なので、使うためには入力値の調整が必要 今回はLocalStageNameはステージ番号(1,2,3..)が格納されている |
Set Stage Image | StageImage(Texture型)にステージにあった背景画像を設定 背景画像は最後に用意しました(ステージ生成後のjpg画像) |
Return Node | そのままだと背景画像のセットが出来ないので「ピンを分割」 |
ステージセレクト画面用のwidget(WBP_StageSelect2)作成
「ユーザーが作成」からWBP_StageSelectButtonを配置しています。
イベントグラフなし。
各widgetにLocal Stage Nameを設定することで、ボタンが押されたときにLocal Stage Nameに1~4の数値が入るようにする。
ステージセレクト画面の実装(受け手側の処理)
ステージ作成用のDataTableを作成
データテーブルに関しては、座標データは1つだけ(前回作成)。
ブロックの配置データは前回作ったS00以外に1~4ステージ用を作成。
前回がんばったおかげでステージの作成自体は簡単。
ステージ生成
BP_BarControl(プレイヤーPawn)
送り手のレベル(TitleMap)で設定したStage Num(Game Instanceの変数)によって、使用するDataTableを選択。
DataTableはData Table型の変数(名前変えた方がよかった)
Create Stageで読み込みにいくブロックの配置データに使用。
パッケージング
ワンボタンで出来ると思ったりしたらそんなことはなかった(涙)
Visual Studio 2022(コミュニティ版)の入手&インストール
公式ページから
コミュニティ版の無料ダウンロードをします。
Visual Studioって無料版あったんですね(無知)
終わったら、VisualStudioSetup.exeをダブルクリック。
デスクトップとモバイル/ゲームの項目をインストールしました。
オプションではGitHub Copilot/Windows11SDK/Windows10 SDKにチェックしました。
Unityはいつか触ることがあるかもしれないので…
GitHub Copilotってバージョン管理とかに使うやつかな?とか思ってたら全然違ってた。いらなかったかも。
多い分にはいいだろうと選択したのですが…重いw
無事インストール完了
パッケージ化の実行
プロジェクト設定>パッケージ化
「完全に再ビルド」にチェック
「配布用」にチェック
あとはプラットフォームから「プロジェクトをパッケージ化」を押すだけ。
右下に作業中のログが出てきましたね。
はたしてどのくらい時間がかかるのか。
出力ログを表示を押すと何やら動いてる。
VisualStudioの作業自体はないようで一安心です。
あとは待ってれば完了
とはいきませんでした。がーん
ログ出力フォルダのLog.txtをerrorで検索して原因をさがしてみます。
warningはとりあえず無視して、原因となってそうなところを探す。
Shinbiはキャラクタープラグインなんですが、今回のプロジェクトでは未使用のはず…
レベル上に配置していなくてもパッケージングに影響が出るんですか。
プラグインいれてから1回も使ってないのに…無駄にプラグインを入れてはダメということですね。
ライブラリから、「ローカルコンテンツから削除する」だけではダメなようで、きちんと問題になってるファイル(できればフォルダごと)手動で削除する必要がありそうです。
未使用だったParagonShinbiの「ローカルコンテンツを削除する」をしてから、手動でParagonShinbiのフォルダを削除(エクスプローラーから)したら成功しました!
はじめて作ったのゲームパッケージ@@b
えぇ。。。2.3Gもあるw
オールインにしたので環境周りがほとんどだと思いますが。
物理演算を全く使わないパッケージとかだと軽くなるのでしょうか。
最後に
最初は2回くらいで終わらせるつもりでしたが、結局5回までかかってしまいました。
今回思ったのは、ステージセレクト(レベル毎のつながりのデザイン)は本来最初にやるべきことだということ。
そういう知識がなかったので、私の場合無理でしたが。
特に自分の場合、プレイヤーキャラ(Default Pawn Class)にレベルの初期設定を入れていたのがよくなく、これは本来やってはいけないことでしたね。
第5回が終わってもゲームとしてはまだまだで、バグとり/ステージ毎の高得点表示とか含めてまだまだ手直しした方が良い部分はありますが、今回はあくまでUE5練習用のブロック崩しなのでこれにて目的達成としたいと思います。
技術面で今回の一番の収穫は運動エネルギー系のノードに触れたこと
・Add Impulse(運動エネルギーを与える)
・Set Physics Linear Velocity(運動エネルギーを設定)
向き+運動エネルギーを変化できるこの2種は使いこなせば自分の思い描いたような起動で物を動かしたりできそうです。
他に類似ノードとしてAdd Force/Add Radial Forceなどというのもあるようです。
ブロック崩しは大半の部分は物理演算がやってくれるので、UE5初心者の勉強としては確かにいい教材だったと思います。
できるなら、私と同じようにパッケージング(exe化)までの流れを勉強することをオススメ。
今回の全5回のうち、内部に関しては1~3回で大体終わっており、第4回/第5回は環境周りがメインでしたが目的がないとその部分は面倒で触る機会があまりとれない(内部処理を作って満足してしまう)ことが多いと思いますので。
個人的にはwidgetがかなり苦手意識がありますが、widgetの作り方でゲームの品質が何段階も変わるのでどんどん理解度を上げる必要があるのを感じました、あまり触りたくないんですが(笑)
あとはBlenderや、効果音作りなど、最初は見えなかった山がどんどん見えてきてる気がします。
一通りのプロジェクト完了までの流れを追うことができたのは自信になりましたが、次は自分がやって楽しめるレベルのゲームを作ることを目標にしたいと思います。かなり厳しいw
いままでC++コーディングはまったく触れずにゲーム作りしてきましたが、やはりC++も触った方がいいんでしょうか…
ではでは、ここまで読んだ下さった方、ありがとうございました。
次はボールを使ったソニック・ザ・ヘッジホッグぽいスピードレースゲームとか作りたいかな。
もしくは、流行りのヴァンサバ系か…
モバイル対応にするなら、一度最小構成でモバイル用のパッケージングを試した方がよさそうです。
コメント