Help us understand the problem. What is going on with this article?

【UE4】ゲーム制作事例(The Rolling Ball)

More than 1 year has passed since last update.

Unreal Engine 4 (UE4) Advent Calendar 15日目の記事です。

ゲーム制作事例記事第2弾でございます。第1弾はこちら

「1週間ほどで出来るゲームを作ろう。モデルは全部基本形状で。ほんのり物理を感じるやつ。」という目標でゲームを作ってみました。

スーパーモンキーボール風なゲームとなっています。

ダウンロードはこちらから

プレイヤーボールクラス

ステージを傾ける

このゲームはボールを直接回転させてはおらず主にステージを傾ける事でボールを動かしています。これはプレイヤーボールクラスで行っています。
2017-11-03_23h58_20.png
レベル上での階層はこのようになっておりBP_StagePvotとムーバブルに設定したスタティックメッシュアクタを親子構造としています。プレイヤーの入力でBP_StagePvotを回転させることでステージを傾けています。
スタティックメッシュアクタはムーバブルに設定しておかないと一切回転してくれません。自分はこれに気付かず随分と時間を取られてしまいました。

2017-11-04_00h09_43.png
ステージの回転処理部分です。WSキーを押したときにはピッチ回転(前後に傾ける)ADキーを押したときにはロール回転(左右に傾ける)としています。
しかし入力された数値をそのままSetActorRotationに入れてしまうとカメラの向きに関わらず常に決まった方向にしか傾きません。そこでカメラの前方と右方のベクトルから回転を作成し合成することでWキーを押した時はカメラの向いている方向にステージを傾けるようにしました。
この処理により狙っている方向に転がれるようになり遊びやすくなりました。

ボールを転がしやすくする

ステージを傾ける処理によりボールは転がり出しましたが動き出しはゆっくりで転がり始めると中々止まらず気持ちのよい操作感とはかけ離れた転がり方でした。
Massを0.0001kgと変更しても変わらずLinear DampingやPhysics Materialで摩擦の数値を小さくしてもほとんど変化しませんでした。
そこで物理設定の調整は早々に諦め、ステージの傾きによる回転に加えて更にボール自身にも回転を加えることにしました。
2017-11-04_19h29_48.png
ステージを傾ける処理と同様にカメラの前方と右方のベクトルにトルク量と入力量を掛けてAddTorqueしています。
これにより重たい金属玉が木製の玉くらいには軽く良い感じに転がってくれるようになり、より大きく操作性が向上しました。

画像ではAddTorqueにWARNINGが付いていますがUE4.18で非推奨のノードとなったためです。推奨版は以下になります。
2017-11-04_19h50_29.png

フェードインアウト

ゲーム中のフェードインアウトはUMGを使っています。
2017-11-04_22h58_08.png
イメージパネルを画面を埋めるサイズに調整し、アニメーションでカラーを変更しています。
2017-11-04_23h01_18.png
あとは呼び出したいタイミングでフェード再生関数を呼び出せばフェードインアウトさせることが出来ます。フェードインのアニメーションを作りフェードアウトの場合は逆再生すると必要なアニメーションは1つだけになりますので少し楽に実装できます。

2017-11-04_23h11_34.png
PlayFade関数でウィジェットアニメーションを返り値としていますが、こうすることで呼び出し側でアニメーション終了時のディスパッチャイベントを定義出来るので「フェードアウト後にシーン遷移処理を呼ぶ」という一連の流れが書きやすくなります。

3,2,1,GO!

ステージ開始時はカウントダウンされ「GO!」のテキストと同時に始まります。
この機能はSet Timer by Eventを使って実装しています。
2017-11-04_23h37_13.png
1秒毎にCountDownイベントが呼び出され「GameStartRemainTime」を減らしています。これが0以下になった時に「GO!」の表示とカウントダウン表示テキストをHiddenにしています。
しかしこのままではカウントダウンは終了したのにも関わらずCountDownイベントは1秒毎に呼ばれ続けます。ですのでSetTimerByEventから取得したTimerHandleを以下のようにClearすることでSetTimerByEventを停止させています。
2017-11-05_00h27_21.png

ステージ作成

ステージ1以外はBPSブラシからスタティックメッシュ作成機能を用いてステージを作成しています。
この機能はDCCツールを使わずエディタ内で作業が完結するのでテストレベルを作成するのにはうってつけの機能です。自分がモデリングをする際に使用しているBlenderでは扱うスケール単位が異なるため製作したモデルをインポートした時「あれ?思ってたより小さい(大きい)」となることが多々あります。この機能によりエディタ上で作業が完結しますからサイズ感の確認もしやすくインポートや再インポート等の作業がゼロになるので試行錯誤しやすくなります。

複数のBSPブラシからスタティックメッシュを作成する手順は以下のようになります。
2017-11-05_23h13_34.png
この時最後に選択したBSPブラシの中心がメッシュの原点になる事に注意してください。
BSPブラシを配置した時点でマテリアルを適用しておけばそのマテリアルが適用されたままスタティックメッシュが作成されるのでここも注意点です。

おわりに

物理演算の設定は当初想定していたよりも多くの時間を取られました。狙ったとおりの挙動(転がり方等)をさせるのが難しく最終的にはBlueprintで補正するような形になってしまいましたが望んでいた操作感は実現出来たので良かったかなと。これを機に物理周りはしっかり勉強したいと思います。

BSPはやはりプロトタイプにはかなり有用ですね。ブラシからメッシュ生成もブラシを組み合わせた複雑な形状からもメッシュが生成出来ますので今回のプロジェクトでは大助かりでした。

明日はもんしょさんによる『UE4の描画パスの流れを4.18バージョンにアップデートしたい』です!

Dv7Pavilion
※はてなブログに引っ越しました。今後Qiitaの方では記事を書く予定はありません。 https://paviliondv7.hatenablog.com UE4についての記事が主になります。 何かご不明な点があれば Twitter : https://twitter.com/Dv7Pavilion?lang=ja や記事のコメントにでも書いていただければ幸いです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away