
【初心者向け】Unreal Engineで3本目のゲームを作った話
めためたです。今回は『【初心者向け】Unreal Engineで3本目のゲームを作った話』をしていきます。よろしくお願いします。
このnoteは、ゲーム制作に興味があってUnreal Engine(UE)を触りたいと思っている方を対象としています。
2本目はこのようなゲームを作りました。
作ったゲーム
BOSSを倒すとゲームクリアのゲームを作りました。
Lv1では与えるダメージは0でBOSSを倒すことはできません。

なので、モンスターを倒して経験値を獲得してレベルアップしてステータスを強くする必要があります。
モンスターを倒すと経験値を獲得します。コインもドロップします。獲得経験値がレベルアップに必要な経験値を超えるとレベルアップします。レベルアップするとステータスの各パラメータを上げるステータスポイント(SP)が得られます。このゲームではコインの使い道はありませんが、今後作っていくであろうゲームのドロップシステムのために試しに実装しました。

MaxHPを上昇させるHP、物理攻撃力を上昇させるATK、物理防御力を上昇させるDEFの3つのステータスのパラメータにSPを割り振ることが出来ます。

具体的にはATKを1上げると物理攻撃力が4上がり、DEFを1上げると物理防御力が4上がり、HPを1上げるとMaxHPが25上がります。また、レベルアップでMaxHPは50ずつ上がります。
レベルアップしてパラメータにSPを割り振り強くなることでBOSSを倒すことが出来るようになります。

2本目とのゲームの違い
2本目は、その時の自分が実装できる限界でゲームを作りました(今回も実装できる限界で作っていて余裕はありませんでしたが)が、4本目以降でも利用できるような汎用的でモンスターの拡張も可能なシステムを作りたいと思いました。
以下で実装したシステムを紹介していきます。
まずは、レベルアップシステムです。
レベルアップシステムとステータスポイントシステム
以下の動画を参考にレベルアップシステムを組みました。
この動画のレベルアップシステムでは、経験値テーブルを作り次のレベルの経験値をPreExとして要求していました。

僕はステータスポイント(SP)システムでATKにSPを振ると物理攻撃力が上がるようにしたいと考えていたため、AtkPowerをLv依存にはしたくありませんでした。
また、経験値や攻撃力をレベルアップと共にデータテーブルに記載するシステムはレベルの上限が低くダメージのバランスをとる必要があるMOBAなどのジャンルでは有効だと思いましたが、上限が100超えるようなMMORPGのようなゲームでは適さないと考えました。なので、1Lvずつ経験値テーブルに要求経験値量を記載するのではなく、以下の記事を参考にレベルアップシステムを作りたいと思いました。
この記事では、
経験値A=前のレベルでレベルアップに必要だった経験値×1.1
経験値B=今のレベル×15
レベルアップに必要な経験値=(経験値A+経験値B)÷2
のようにすると経験値Aだけの指数関数的に要求経験値量が増えてしまうのを防ぐことが出来ると述べています。
データテーブルから持ってきているPreExをこのように変えました(レベルアップシステムの全体像は動画を参照してください)

PreExに1.1倍、Player Level×15したものを足して2で割って、それをRoundで四捨五入しています。
経験値テーブル作りに失敗しないためには・・・?
経験値テーブルの作成に失敗しないためには、以下の点を守るべきだと私は思います。
・レベルアップに必要な経験値の量は、前のレベルでの必要経験値量の+10~30%ぐらいに留めておく。
・ゲームバランスを確認する時、直前(適正レベル以下)のステージでレベル上げが行えるか確認する。
もちろん、これが最適解とは限りませんが、「ゲームのユーザーが、適正レベル以下のステージに行く意味があると思えるか」をバランス調整の時にチェックするだけでも、ゲームのプレイ感が大分違ってくると思います。
3作目は記事のように経験値Aと経験値Bを混ぜる考え方で作りましたが、最終的にバランスをとるために経験値テーブルを動画のように作るようになりブループリントも改良するかもしれません。
次に、ダメージシステムです。
ダメージシステムとダメージ表示
UEのダメージ処理では以下のような関数が用意されています。

この動画の09:25の「5.エネミー防御値の実装部分」で、ブループリントインターフェイスを用いて複数の防御力を持ったモンスターのApply DamageとEvent Any Damageを使ったダメージ処理方法を知ることが出来ます。また、ダメージ表示はこの動画を参考に実装しました。
僕は、Apply DamageとEvent Any Damageを3本目では使いませんでした。汎用的なダメージシステムを組んでいきたいと考えたからです。以下の動画を参考にダメージシステムを組みました。
この動画は汎用的なダメージシステムを組むことを目的としています。初学者には難しいですが、挑戦に値する難しさで自身の考え方のレベルアップにはちょうどいいと思っています。初めは全く分かりませんでした。
この動画の簡易版のダメージシステムを3本目では利用しています。
ブループリントアクターコンポーネントを用いて、BPC_Damage_Systemとしています。以下に簡略化したダメージシステムを置いておきます。

Return Nodeに動画にはないDamage Amountを加えて、ダメージ表示を出来るようにしています。
前半部分にダメージに乱数を入れたり、

確率でクリティカルダメージになる処理を加えました。

ダメージ計算式の基本的な考え方はこの記事が参考になります。
次に、ロックオンシステムです。
ロックオンシステム
以下の動画を参考にロックオンシステムを組みました。
この動画でも使われているようにロックオンのために以下のPlugInを用いています。

導入が簡単すぎて感動しました。
僕は、ロックオンに関しては以下のようなことを考えていました。
・敵キャラクターをロックオンボタンでロックオン
・ロックオンされていない場合、プレイヤー攻撃時にロックオン、その時ロックオン対象の名前とHPbarをプレイヤーの画面上部に出す。
・敵が倒れた時やプレイヤーが操作することでロックオン対象を切り替えることができる。


これを少ないノードで実装することができます。

・敵キャラクターをロックオンボタンでロックオン
これは中央にあるターゲットシステム内のここではPボタンで処理されています。ノード1つでロックオン&解除をすることが出来ます。
・ロックオンされていない場合、プレイヤー攻撃時にロックオン、その時ロックオン対象の名前とHPbarをプレイヤーの画面上部に出す。
ロックオンされていない場合、プレイヤー攻撃時にロックオンはNextTargetの処理です。Is Lockedされていない場合、Target actorの処理でターゲットするようになります。また、この処理で攻撃で、敵が倒れた際に次の近い敵にロックオンするようになるのでおすすめです。
ロックオン対象の名前とHPbarをプレイヤー上部に出す処理はターゲットシステムに書かれています。On Target Locked OnとOn Target Locked OffでUIを切り替えています。
・敵が倒れた時やプレイヤーが操作することでロックオン対象を切り替えることができる。
敵が倒れた時は上の処理です。プレイヤーが操作するは、Camera InputにTarget Actor with Axis Inputを挟むことでカメラ移動時にターゲット対象を変えることが出来ます。

また、ターゲット強制解除は何かというと、On Target Locked OnでTarget Actorを変数に入れておき、Break Hit Resultで持ってきた攻撃対象のHit ActorとTarget Actorが異なっている場合、強制的にロックオンを外すというものです。これと後の処理により、一番近いモンスターがターゲット対象になります。
次に、データテーブルです。
データテーブルの利用
データテーブルの基本的な考え方はこの記事が参考になります。
また、UEでのデータテーブルの利用方法はこの動画が参考になります。
以下のようにモンスターの情報をデータテーブルに格納しました。

そのデータテーブルの情報をBP_Enemy_Baseという親を作って、子にモンスターのブループリントを作りました。


ゲームではモンスターが赤いGem付近から3体ずつスポーンするようにしていました。するとDisplay NameがBP_0001_Goblinに0, 1, 2と数字が付きます。

なので、BP_Enemy_BaseでGet Display Nameだけではそれぞれのモンスターに情報がゲーム内で設定されません。そこでMidを用いて4文字目から4文字の処理で「行の名前の0001」と「BP_0001_Goblinの0001」を対応させることで、それぞれのモンスターに情報を設定しました。このやり方があっているかどうかは分かりませんが、僕はこの方法でモンスターの拡張性を確保しました。
ダメージシステムやデータテーブルの利用からゲームを汎用的に作ることの目的は達せられたのかなと思います。よかったです。
ここで少し話はそれますが、僕が有料アセットを買うようになって経験した体験から有料アセットの買い方について注意してほしいことを述べます。
有料アセット購入時の注意点
有料アセットを購入するにあたって注意してほしいことは、有料アセットを買おうとすると、不正利用の可能性があるので一部機能を制限しましたとのメールがメインではなく新着に届いている場合があり、その場合、本人であることを確認しなければ買えませんのでご注意ください。
例えば「Unreal Engine クレカ使えない」などと検索するとネット専用クレカを推奨する古い記事が出てきますが、

マーケットプレイスガイドラインの4.2.2.cを見ると、逆にプリペイドのクレジットカードが使えない可能性があるのでご注意ください。
僕はネット専用クレカを推奨する記事を見て、クレジットカードが使えなくなる場合新しいカードを作らないといけないなという先入観を持ってしまい、海外のサイトだからAmerican Expressなら大丈夫だろうとクレジットカードの申し込みの手続きを終えたところで、海外サイトだから「不正利用の可能性があるので一部機能を制限しました」の可能性あるなと気づき、メールの新着を見ると一部制限のメールが存在しており本人にチェックを入れることで利用できるようになりました。
UEのマーケットプレイスは半額セールなどを開催しており、アセット買えないとセールが終わっちゃうかもと焦る気持ちもあるかもしれませんが、購入画面でクレジットカード会社に連絡してください等のメッセージが出た場合は、落ち着いてメールの新着をのぞいてみてください。
話を戻して「3本目を作って分かったこと」について最後に話します。
3本目を作って分かったこと
クオリティを上げるためにテンプレートアセットを使っていきたいなと考えています。具体的にはAction RPGを作るために『Dynamic Combat System』のような定番のアセットを使いたいと考えています。

テンプレートアセットは時間短縮しつつクオリティを上げることが出来るなと1作目の途中に『Dynamic Combat System』を知った瞬間からテンプレートアセットの有用性には気付いていましたが、3本目にもなると作るゲームの規模も少し大きくなり、また、だんだんとUEも分かってきて、よりテンプレートアセットの有用性をひしひしと肌で感じています。
『Dynamic Combat System』の解説はこの方が分かりやすいです。
テンプレートアセットの有用性をより感じられるぐらい、なにも分からなかった状態から成長できているので嬉しいです。
有料アセットを買うのに初めは技能がないのに買って適用できなかったらどうしようとも思っていましたが、その不安が3本目を作った今は薄くなっています。
有料アセットを買うのに値段以外で躊躇しなくなるが初級者から中級者になりかけの合図なのかもしれませんww
今のところ、中途半端なアセットを買うなら『Dynamic Combat System』のような信頼できるテンプレートアセットを買って、ブループリントを理解&実装して足りないところをピンポイントで買う方法が効果的だと考えています。
なぜなら、例えば、有料のロックオンシステムはマーケットプレイスに存在していますが『Dynamic Combat System』の中にもロックオンシステムは存在しているからです。

2個とも買ってしまうとどちらかのロックオンシステムを活かすことが出来なくなります。このようなことがロックオンシステム以外のアセットでも起こりえます。
なので、有料アセットを買うならテンプレートアセットをまず買うことが効果的だと思います。
また、アセットは『Dynamic Combat System』以外にも『Boss AI Toolkit』が気になっています。

魅力的なBOSSがゲームの面白さに直結すると考えているためです。
『Dynamic Combat System』と『Boss AI Toolkit』の両方を買って組み合わせればいいじゃんと考えられた方はこちらが参考になります。
『Dynamic Combat System』+『Boss AI Toolkit』を使った経験談から初心者への注意喚起をなされています。
この方はソウルライクのゲームを『Dynamic Combat System』を使って作成する過程を動画にされている方です。
内容は『Boss AI Toolkit』の『Dynamic Combat System』への適応は初心者には難しいとのこと、それぞれが独立したシステムであるため結合が難しいらしいです。
具体的には、HPなどの値が重複していたり、当たり判定の設定の違いからお互いに攻撃が当たらないなどの問題を独力で解決する必要があるそうです。
この注意喚起の動画の次の動画でソウルライクでのボス戦の動画も挙げられています。『Dynamic Combat System』+『Boss AI Toolkit』の組み合わせが実際にどうなるかを知るのに適していると思われます。
〆
自分の作りたいジャンルのなんらかのテンプレートアセットを買って勉強していきたいと思いました。
考えが変わりました。
以上が今回のnoteです。