もくじ
目標
ゲームという体裁をギリギリ保ったクソしょぼゲーを作るつもりで作る。
目標をできるだけ低く設定することで、未完成になることを避ける。
そのためにできるだけ労力をかけず、ゲーム内容・要素をできるだけ削ぎ落とす。
制作上のルール
- 極力こだわらない。
- できるかぎり既存アセットを使う。
- アセットを自分で作らない。
自キャラ
キャラクターの3Dモデルや歩行・ジャンプなどの基本的な動作は、UEのテンプレートを利用できる。
ひとまずこれを使う。
横スクロールカメラ
カメラ設定の調整
- カメラをキャラの横視点に移動する。
- Camera BoomのTransform > RotationのZを90にする。
- 3Dビューに配置されている"Player Start"の回転Zを、-180にする。
- Use Pawn Control Rotationを無効化する。
- キー移動での奥行きを削除し、左右操作だけにする。
- キャラのブループリント内のMovement Inputの部分をノード編集する。
- カメラの、キャラクターからの回転の影響を無視する。
- RotationをRerativeからWorldにする。
- 方向転換の速度を早くする。
- Rotation RateのZ値を720程度にする。
- Y軸(奥行き)への移動を禁止する。
- Constrain to Planeを有効化する。
- Plane Constraint Nomalの2番目の値を1.0にする。
- カメラの衝突回避を無効化する。
- デフォルトの設定では、キャラとカメラの間に遮蔽物があるとカメラを近づけて調整する機能がある。
- 横スクではこれは不都合なので、これをオフにする。
- キャラ > 左コンポーネントリストのCameraBoom > カメラコリジョン > Do Collision Testを無効化する。
- キャラとカメラの距離を調整する。
- Target Arm Lenghを調整する。
キャラ設定の微調整
- ジャンプ後の落下速度を自然にする。
- Gravity Scaleを3.0にする。
- ジャンプ距離を上げる。
- Jump Z Velocityを1200程度にする。
- 移動速度を上げる。
- Max Walk Speedを800程度にする。
- 二段ジャンプを許可する。
- Jump Max Countを2にする。
- ボタン長押しでのジャンプ強度調整。
- selfの方にて、Jump Max Hold Timeに0.5など値を設定する。
- 押している間上昇値を付与し続ける。
そのため、ジャンプ距離(Jump Z Velocity)で設定した値より高くジャンプするので適宜調整が必要。
スーパーマリオのようにもったりとした不自然なジャンプになるのは好みが分かれる。
カメラの追従をブループリントで制御する
テンプレのキャラデータでは、カメラは親子関係だけでキャラに追従しているが、より高度なことをしたい場合はブループリントでカメラを制御する。
ジャンプではカメラを追わないようにしたり、少し遅れてキャラを追ったり、より詳細なカメラ制御ができる。
高度なので一旦無視してもいい。
構造
- プレイヤーキャラのBP
- ビュー視点をカメラマネージャーのものに設定。
- カメラマネージャーBP
- プレイヤーキャラ内から切り取ってペーストしたカメラオブジェクトが入っている。
- UpdateCameraPos関数をフレームごとに実行して位置を更新。
- UpdateCameraPos関数
- カメラ位置とキャラ位置をスムーズにミックスする。
- FollowTarget変数
- キャラの位置を受け取るための変数。
- キャラBPのSpawn Actor from Classノードから、データを受け通る。
リスポーン時にカメラが追従できない問題
リスポーンすると一旦キャラが消えるので、その際にキャラ位置を取得できない。
これが原因でエラーが出てしまうので、キャラが存在しない場合は何も処理しないようにする。
キャラの死亡とリスポーン
トゲ
【STEP4-3】「触るとゲームオーバーになるトゲ」を作ってステージに配置しよう|ゲームメーカーズ
死亡判定の基礎として、よくあるトゲのステージギミックを作る。
円錐にコリジョンを追加し、ダメージ判定を付けて配置する。
トゲのピボットが底面になるように上に移動する。トゲブループリントのビューポート「前」から見たワールド0位置になるように、円錐を移動しておく。
リスポーン
ブループリントで「ゲームオーバーからリスポーンまでの流れ」を作ってみよう|ゲームメーカーズ
ダメージ判定を受けると、全身が脱力し、操作を受け付けなくして、3秒後にステージ初期位置に戻るようにする。
これだけで一気にゲームぽさが出た。
スタートメニュー
新規レベルと、2Dメニュー用のデータ(ウィジェット)を作成する。
ウィジェット
ウィジェット編集画面では、右上のデザイナー/グラフボタンから2Dパレットビューとノードビューの切り替えができる。
- 背景画像
- 使う画像はひとまずなんでもよい。
- ちょうど作っていた3Dモデルがあったのでそれのレンダリング画像を使用。
- タイトル
- パレット > テキストを追加し、サイズ調整して配置。
- ボタン
- ボタン内にテキストを追加。
- 詳細 > イベント > On Clickedをクリック
- グラフにOn Clickedノードが追加されるので、そのボタンがクリックされたときの動作を指定できる。
- Open Level(by Object Reference)ノードを追加・接続し、移行先のステージを設定する。
- ゲームの終了ボタンでは、Quit Gameノードを追加・接続する。
アスペクト比を固定
[UE5]アスペクト比が一定になるウィジェットを作成する #UnrealEngine - Qiita
UEのエディター内プレビューだとアス比固定されずないので、アス比が一定になるようにした。
下記のような構造になるように作る。
- スケールボックス - サイズボックス - キャンバスパネル - テキストやボタンなど
タイトルメニュー用ステージとウィジェットを関連付ける
- 作った新規ステージを開き、ステージのブループリントを開く。
- ヘッダー > "レベルブループリントを開く"
- Set Input Mode Game And UIノードを追加し、作ったタイトルのウィジェットを設定する。
- Add to Viewportでビューポートに表示する。
- Set Input Mode Game And UIは、ウィジェットをすぐさまマウス操作できるようにしている?
- セットでマウスカーソルを有効化する。
ゲームモードを作成する
タイトル画面を表示する|Unreal Engine 5で動かす C++ & Blueprint
新規作成したレベルはなにもデータがないが、専用のゲームモードを設定しておかないと、普通のゲームプレイと同様にプレイヤーキャラがスポーンしてしまう。
(キャラに効果音やエフェクトを付けると、効果音やタイトル画面枠外にエフェクトが出るのがわかる)
そのため、専用のゲームモードを作成する。
- コンテンツブラウザで右クリック > ブループリントクラス > ゲームモードベースを作成する。
- タイトルのレベルのワールドセッティング > Game Mode > ゲームモードオーバーライドに、作成したゲームモードを設定する。
HUDも作成する。
- コンテンツブラウザで右クリック > ブループリントクラス > HUDで検索し、HUDを作成する。
- タイトルのレベルのワールドセッティング > Game Mode > HUDに、作成したHUDを設定する。
ポーズメニュー
最初は実装簡単に思えたが、ノード組みが結構難しかった。
ノードでのIF文やBoolプロパティの扱いに慣れる必要がある。
ポーズメニューノードの作り方
- ポーズメニュー用の新規キーマップを追加する。
- プロジェクト設定 > 入力 > バインディング > アクションマッピングに、"OpenPauseMenu"というID名で追加する。
キーは、ひとまず押しやすいように"Q"キーにした。
- プロジェクト設定 > 入力 > バインディング > アクションマッピングに、"OpenPauseMenu"というID名で追加する。
- 追加したOpenPauseMenu入力ノードを追加する。
- 右クリックからのノード追加で"OpenPauseMenu"と検索すると、先程追加したインプットが表示される。
- ノード選択状態で、右の詳細メニューの"Execute when Paused"を有効にする。
(これでポーズモードでもキーが動作するようになる)
- 上記動画と上記ノード画像の通りに作る。
- 下記のノードの仕組みを理解してから作るとわかりやすい。
ノードの仕組み
- ポーズキーが押された →
- ウィジェットがあるかどうか確認 →
- ある → 特に処理なし。
- ない → ウィジェットを表示し、ウィジェットが作られたことを示すBoolを作る。
- ポーズ状態かどうか確認 →
- ポーズじゃない → ゲームを一時停止(ポーズ状態に)して、マウスカーソルを表示する。
- ポーズ状態 → 再度ポーズキーを押した場合は、ポーズを解除。
完成
ゲームとして書き出す
作ったプロジェクトを単体で遊べる実行ファイルとして書き出す。
簡単なプロジェクトなら1分程度で書き出しできる。
Visual Studioをインストールする
Windows向けに書き出す場合は"Visual Studio"のインストールが必要。
(※10GBほど空き容量が必要)
VSを入れていないとエラーが出て失敗する
VSを入れていないと下記のようなエラーが出る。
データの生成に必要なWindowsのSDKは正しくインストールされませんでした。
メインツールバーの起動メニューのSDKのセクションを確認し、SDKを更新してください。
躓いたエラー
リダイレクターが問題で失敗する
パッケージ化 (Windows): LogInit: Display: LogCook: Error: GlobalDefaultGameModeにはリダイレクトされた参照’/~~~が含まれます。目的のアセットはパッケージビルドにロードできません。プロジェクト設定で目的のアセットを再び選択して、この問題を修正してください。
上記のようなエラーでパッケージ化に失敗した場合、リダイレクターが原因。
怪しいフォルダーを右クリック > "リダイレクタ参照を更新"を実行することで、不要なリダイレクタが消える。
リダイレクタとは?
UEプロジェクト内のファイルをエクスプローラーで操作すると、リンク切れを起こしてしまう。
そのため、ファイル操作は必ずUE内で行う必要がある。
その時にUEは、リンク切れが起こらないように元のデータがあった場所に、「変更後のリンク先を教えるためのデータ(リダイレクタ)」を残す。
これが膨大になるとゴミデータが増えるので、定期的にきれいにした方が良い模様。
[UE4] リダイレクター ~消えないゴミファイルの謎~|株式会社ヒストリア
なにかしらのエラー解決方法
エラーが出ても下記の場所にあるファイルを削除することで、エラーが出ずにプレイできる場合がある。
C:\Users\<ユーザー名>\AppData\Local\<プロジェクト名>\Saved\<プロジェクト名>_PCD3D_SM6.upipelinecache
書き出し後のゲームデータが大きい
特に設定を変えず書き出した所、485MBになった。
スターターコンテンツが含まれているとかなり容量が大きくなる模様。
レベル内の使っているデータだけを新規の別プロジェクトに送ることで、不要なアセットをすべて切り捨てることができる。
- 最上階層の"すべて"フォルダーを選択する。
- フィルタ > レベルにし、すべてのレベルを表示し、それらを選択する。
- 右クリック > アセットアクション > 移行を実行する。
あとがき
「ゲーム内容」は存在しないが、メニューやキャラ操作・リスタートなど、操作可能な実行ファイルとして、書き出しすることはできた。
これをクソしょぼゲーver1.0として完成ということにする。
ここからステージを複雑化したり3Dモデルを差し替えたりして、ブラッシュアップは好きなだけできる。
次作るなら、自キャラの攻撃/回避や、動いて攻撃してくる敵を作りたい。