Meiryo’s blog

やってみて詰まったことを備忘録として残すブログ

アンリアルクエスト5の備忘録(3日目、4日目、5日目)

1・2日目の記事はこちら

先日アンリアルクエスト5に参加いたしました。

提出したゲームはこちら

www.youtube.com

3日目

前転する仕組みを作ろう

以下の記事と動画を参考にして実装しました。

[UE5] Motion Warpingでアニメーションによる移動量を自由にコントロール!|株式会社ヒストリア
【UE5ゲーム制作】ルートモーション使っているのに移動量調節できるんですか!?【motion warping】 - YouTube

前転中に移動をしないようにDisable Inputを使用しました。

問題点

向いている方向にしか回転しないので
操作が気持ちよくないです。
例えば後ろ移動キーを入力して前転を実行したら
後ろを向いて前転をしてほしいのですが
これだと前にしか進みません

プレイヤーのHPが削られたら負け(敵にHPを付けよう)

必殺技を入れよう

GameplayAbilitySystem(GAS)を使用して実装しました。

HPとダメージ処理はGameplay AttributeとEffect、
必殺技はAbilityを使用しています。
詳細は別の記事にまとめました。

ちなみに必殺技は1日目の「敵を倒せるようにしよう」と
同じことをしています。

連続攻撃をしよう

こちらを参考にしました。

【UE5】Gameplay Ability Systemを用いたコンボ攻撃の実装方法【逆引きUE】 - YouTube

雑感

この辺でGASの便利さと難しさを感じました。
Tagを使うことで簡単に制御ができますが
雑にTagを作って使っていると後々どこで何をしているか
わからなくなりそうです。
AbilityとEffectも同様です。
以下は今回作成したプレイヤーと敵のAbilityとEffectとCueの画像です。

既にこんな量になっているので誰が何を使用しているかは
設計書なりwikiなりにまとめておいたほうが良さそうな気がします。

4日目

ステージを作って飾ろう

こちらを参考にして
LandscapeとFoliageを使用してステージを作成しました。
ステージに散らばっている小物はMegascansです。
コンセプトは戦場でエルデンリングのラダーンステージや
Fateの無限の剣製などの砂地になにか刺さってる感じを
イメージして作りました。

DirectionalLightを少し赤に、
SkySphereをのSun Heightの値を下げて夕日にしています。

回復アイテムを入れよう

回復アイテムは倒した敵がランダムで落として
拾ったらストックし、使いたいタイミングで使えるものにしました。

敵がランダムで落とす処理

敵が死んだらDrop Item Abilityが実行されます。
Random Bool with Weightを使ってアイテムをドロップするか抽選し

trueだったら敵が持つアイテムの中からランダムでアイテムを選び
Spawnします。

プレイヤーが拾う処理と回復する処理

回復アイテムの所持数Attributeを追加すべきでしたが
余裕がなかったのでプレイヤーBPに持たせました。

これは回復アイテムのBPです。
プレイヤーが触れたらプレイヤーのGetPotionEventを呼び出します。

プレイヤーのGetPotionEventでは所持数の上限を越えていなければ
取得し、UIの表示を変更する処理をしています。

回復アイテムの効果Effectです。
使用したら全回復するようにしました。

回復Abilityが実行されたらデータを詰め込んで
ApplyGameplayEffectToTargetに渡して…
をすると思ったのですが
ApplyGameplayEffectToSelfというものがありました。
これで自分にEffectを適用できました。

爆弾を作ろう

アンリアルクエスト4の模範解答を参考にしました。

ほとんど同じことをしているのですが時限式にしたので
爆弾がSpawnされたら爆弾の位置を知らせるため
導火線が燃えている音を出し

なにかに触れてから3秒後に爆発するようにしました。

転がりすぎ防止にPhysical Materialと
StaticMeshのPhysicsの値を調整して
あまり転がらないようにしました。

この時極め本を読み直して効きそうな
値を手当たり次第いじってテストして
できたものなのでおかしな設定があるかもしれません。

ちなみに爆弾の見た目は武士の時代に合わせて
Megascansから縄のMaterialを取得し
球体に貼り付けてそれっぽい見た目にしました。
焙烙玉というものが使われていたそうです。

敵のバリエーションを作ろう

爆弾を投げてくる敵

こちらの動画を参考にしました。

行っていることはBTで攻撃Taskが選ばれたら
投げAnimationを再生し

爆弾を離してそうなタイミングでAnimation Notifyから
投げAbilityを呼び出します。

投げAbilityでは手の位置に爆弾をSpawnして
プレイヤーに投げています。

投げる力(爆弾の速度)の計算は
雑にですが敵とプレイヤーの距離によって変えています。

動画を見ていただきたいのですが一番遠い距離の時の
プレイヤーの手前に落ちてコロコロ転がってくるのを
全距離で行うのが理想でした。
が、それを作っているとかなり時間を持ってかれそうだと
判断したのでこれで終わりにしました。

行動が早い+必殺技を使ってくる敵

1日目の「ビヘイビアツリーを使って敵を賢くしよう」で
書き忘れたのですが近接攻撃の敵は3種類の攻撃をしてきます。

ランダムで攻撃の種類を選択する処理はこのようになっています。

この敵の行動を早くして更に必殺技を使ってくる強敵を
追加しました。

処理は先程のものに必殺技を使うかどうかを
追加しました。

記事を書いていて気づきましたが
強敵にこのAblityを設定するのを忘れていました。
そのため提出した動画では強敵ではなく「行動が早い敵」に
なっています…。

5日目

SE・BGMをつけよう

BGMはGameModeBPで実行しています。

SEは回復アイテムを取得する時に鳴らしたり

切った(切られた)時に鳴らしたりしています。
こちらは音を鳴らすCueを作成して Cueを呼び出す用のEffectを作成し

ダメージEffectの後で呼び出しています。

エフェクトを入れよう

こだわりのヒットストップを作ろう

「攻撃を受けたアニメーション」の再生中に
血のエフェクトを発生させています。

このエフェクトを取得する方法はこちらから

ヒットストップは「攻撃を受けたアニメーション」を再生する
Cueを作成してダメージEffectに設定するだけで
いい感じのヒットストップができました。

余談 斬った場所からエフェクトを出したかった

これは別のゲームの動画です。
このように当たった場所から血のエフェクトが
出るのが理想でした。

Hit Eventだとこのようにして当たった場所の座標が
取得できて
取得した座標をSpawn Emitter at Locationに渡すと
当たった場所からエフェクトを出せます。

これと同じようなことをOverlap Eventで行ってみたのですが
座標の取得ができませんでした。

こちらも試してみましたがうまくいかなかったため
エフェクトを大きめに出して誤魔化しました。
UE4でSweepResultのLocationに0,0,0が格納される
On Component Begin Overlap Sweep Result not populated - #9 by amcofi - Blueprint - Epic Developer Community Forums

UIを実装しよう

公式チュートリアルを一通り行うとできることしか行っていないので
あまり書くことが無く…。
一応値はパフォーマンスが良いイベント駆動で変更をしています。

敵の頭上にHPを表示する方法はこちらを参考にしました。

実装したかったけどできなかったこと

次回までの課題集です。

  • ガードをさせたかった
  • ダメージを与えたらダメージ量を数字で表示したかった

プレイヤー

  • 必殺技を増やしたかった

AS_Attack02のアニメーションを改造して
貯めから突進をする必殺技を
作ろうと思っていましたが諦めました。

  • 必殺技にクールタイムを付けて表示をしたかった

必殺技アイコンをUIで表示して
その必殺技を使ったらアイコンが暗くなり
時間経過で元の明るさに戻るという
MMORPGでよくあるような処理を実装したかったです。

演出など

  • ステージを作り込みたかった
  • 敵と味方の見た目を変更したかった

以上です。
今回はGASを使えるようになったことが大きな収穫でした。
前回に引き続きやはりエフェクトやアニメーションなどの
表現力?が課題なので次回のぷちコンの期間中までには
どうにかしたいと思っています。