気づけばツール漬け

3D,2Dのツールを色々使ってみた記録を書いていきたいです。

「マグにゃっト」開発メモ

はじめに

第20回UE5ぷちコン応募作「マグにゃっト」開発メモです。UE5.21を使いました。
ぷちコン20回目。すばらしいです。おめでとうございます。

今回のテーマは「コントロール」ですが、なかなか難しいテーマだと思いました。
プレイヤーがキャラクターをコントロールするのではなく、キャラクターが間接的に何かをコントロールする方法でゲームができないかと考えてみました。

コントロールといえば、手を前に出し何か超能力的なもので動かすというイメージがありますが、そんな不思議な力をシンプルにできないかなと考えていたら、「あるじゃねえか、不思議な力!」てことで磁石を思いつきました。

磁石の引き寄せと反発を使ってキャラクターを振り回すような動きができたらいいなと考えましたが、それをスマートに実現する力が私にはなかったので(物理も数学も苦手……)、強引にそれっぽく動かしました。どうやったかその方法を書きたいと思います。

タイトルの「マグにゃっト」ですが、「にゃ」がひらがななのはその方が可愛いからです。「まぐねっこ」と「まぐにゃっと」で迷いましたが、「にゃ」が勝ちました。

 

応募動画はこちら

www.youtube.com

パッケージ化しました

開くときに警告が出ると思いますが、「詳細」のクリックから許可すれば大丈夫だと思います。

drive.google.com

 

プレイヤーの構造について

プレイヤーはシンプルです。磁石は別アクターにして、チャイルドアクターでアタッチしました。その子にマグにゃっトがくっつくロケーションを得るためのアローを配置しました。

各磁石のアクター内には何も処理は書かず、マグネットのどっちの極かを表す変数だけ持たせました。

プレイヤーの操作の入力は、エンハンスドインプットのLook回転だけ残して、あとは全部削除しました。動ける状態かどうかを判定するboolを間にはさみました。

磁力の入れ替えは、それぞれの磁石チャイルドアクターのトランスフォームを入れ替えているだけです。

パワーアップの流れ

パワーアップ用のアイテムはプレイヤーキャラが受けとりますが、パワーアップの通知はアイテム側から送られてきて、そのアイテムの種類によって処理を分ける流れにしました。

HP回復は決まった量をHPに加算して、エフェクトを表示するだけです。

巨大化とビームを出すやつは、マグにゃっト側で処理するので2匹分に通知を送る流れにしました。(BP上では、Allyという名前にしてます)

マグにゃっトのフレンド召喚は、10秒間だけ新たに2匹スポーンさせるようにしました。

マグにゃっトの構造について

マグにゃっトはベースのBPを作ってほぼ全部の処理を書き、それをチャイルドBPでNとSの二つにわけました。各コンポーネントは下図の感じになっています。2Dのキャラ絵はチャイルド側で付け足しました。Cubeがくっついてますが、これはコリジョンのためでゲーム中は非表示にしています。ナイアガラでつくった、攻撃範囲を示すエフェクトとビームのエフェクトは常に出しっぱなしです。各エフェクトの色はナイアガラから引っ張り出したパラメータで子BPの方で変更しました。

引き寄せられたり、反発したりの動きはスプリングアームのレングスを変えることで実現しました。スプリングアームのラグをかなり緩めにして遅れてついてくる感じにしました。これによって振り回してる感は出たかなと思います。(ただ、少し緩すぎたかもしれないと思います)

スプリングアームを使うまでに、色々と試しました。磁石の動きのシミュレーションも調べましたが、ぷちコン期間内に実現できるかわからなかったのであきらめました。

スプリングアームのレングスは、離れてるときとか引き寄せられるときに、FInterpToを使って変えていく形にしました。これも、「なんだかいじってたらいい感じになったからヨシ」という感じの結果です。完璧に意図したものではないです……。

マグにゃっトには自分がどっちの極になるかの変数をもたせました。マグにゃっトはプレイヤー側の「自分にくっつく極」に向けてトレースを飛ばしていて、つねに引き寄せ方向に動いています。トレースを表示すると下図のようになります(ちょっとわかりにくいですが……)
プレイヤーが回転することで、引き寄せ極へのトレースに反発する極側がわりこんでHitしたとき、反発の動作に変わるようにしました。

マグにゃっトが回転する動きは、プレイヤーの回転値を参照しました。離れている間だけプレイヤーの回転角度を(最大270度にして)受け取り、DeltaSecondsと掛け算してYawの回転値にAddするという処理にしました。これもまた、「なんかいじってたらいい感じ(略」です。マグにゃっトはそれぞれ、時計回りと反時計回りにしてます。マグにゃっトがプレイヤーにくっついた状態から反発させたときに、回転が逆になるようにしました。

攻撃範囲は、スフィアトレースで判定するようにしました。普段は自分の上方に少しだけ伸ばした円柱状になっていますが、ビーム攻撃のときはプレイヤーの方向に伸ばすようにしました。

攻撃範囲をスフィアトレースでとっているので、ビームエフェクトは出しっぱなしにして非表示にしておき、アイテムをとったときだけ表示するようにしました。
なんでそんな方法にしたかというと、最初に試作したビームエフェクトが、エディタ上では表示されるのにパッケージ化すると表示されなくなるという状況が発生したためです。原因の特定まで試行錯誤する時間がもったいなかったため、テンプレートのデフォルトビームから作り直しました。ディアクティベートで消したりするのも不安になったので、出しっぱなしにするという方法にしました。

ボスの構造について

ボスは単体キャラなので専用のBPにしました。コンポーネントの構成は下図のとおりです。ダメージ受けたときに音をだすのでAudioも直接つけました。Bodyというスケルタルメッシュがありますが未使用です(スケルトン使って動くような、もうちょっと凝ったものにしたかったのですが断念しました)

青いArrowは子の敵をスポーンするロケーションです。黄色いArrowは、倒したときにマグにゃっトのフレンドをSpawnするロケーションです。(フレンドのマグにゃっトはボスに囚われてあやつられていた。だから紫色なのです。という強引な設定です)

ボスの動きは少し複雑なのでステートで分けて管理しました。Hurtのステートを作っておきましたが、ダメージはだいたいどの状態でも受けるので、常にチェックするようにしたため未使用になりました。わりと細かくわけましたが、それぞれにDelayノードを挟めば待機時間など簡単に管理できるので楽でした。ただ調整は面倒かもしれません。

ボスの位置は、レベル上にArrowを3個置いて、その位置を順番に取得するようにしました。Idle状態になったときに、取得した位置にMoveToで動かしました。

ボスは、ボスが目を開けてから動いている間の時間を測っていて、倒すまでにかかった時間の範囲でボーナススコアを加算するようにしました。20秒、40秒、60秒で設定しました。20秒で倒すのはよほどうまく行かないと無理かもしれません。

エネミーについて

エネミーもベースのBPを作ってから、種類ごとにチャイルドBPで分けました。基本の構造は下図の感じです。目はターゲットの方を見るために別のパーツに分けました。目を分けたのはいいとして、なぜ縦になっているのかというと、FindLookAtのアップベクトルにあわせるためです。敵の画像は真上から見るために回転させて配置していますが、LookAtでターゲットを見続ける目は、本来マネキンが立っていると想定した場合の頭の上方向に合わせないと正しく動きませんでした。

エネミーは4種類います。応募動画の時点では3種類ですが4種類に増やしました。

  • 緑 ゆっくりプレイヤーに近づいてくる
  • 赤 プレイヤーの周りにまとわりつくように漂う。
  • 黄 マグにゃっトのどちらかをターゲットにしてついて回る。
  • 茶 ゆっくりプレイヤーに近づいてきて、倒すと3匹の子に分離する。

です。
赤はしばらく放置していても大丈夫なのですが、突然つっこんでくるので油断できません。黄色は直接プレイヤーに向かってきませんが、マグにゃっトの位置次第では通り道のプレイヤーにあたってしまうのがよくあるので注意です。

その他

距離ボーナススコア

このゲームでは離れている敵を倒す方が難しいので、敵を倒したときにプレイヤーから離れているほど高得点になるようにしました。倒された瞬間の距離をはかってからゴニョゴニョして、小数点以下を切り落として10倍した値にしました。この値を敵が持ってる基本スコアの300点に加算しました。

スプライト用のマテリアル

2Dスプライトにデフォルトで設定されているマテリアルは、半透明な見た目にならないので、半透明にしたい場合はBlendModeをTranslucentに設定する必要があります(昔ハマったのを思い出して変更しました)これで、SetSpriteColorノードの、アルファ値を変更して半透明にできます。

ゲーム内の声

ゲーム内で色々しゃべっている声ですが、「Narakeet」というサイトを使って作りました。合成音声を作ってくれるサイトです。日本語もあります。

www.narakeet.com無課金でもいくつか作れますが、商用利用には課金が必要です。ぷちコンなら大丈夫だろうと思いましたが、少し不安なので私は最低金額分だけ課金しました。
月額とかじゃなく、作った音声の合計時間の課金なので最低の30分ならお安く使えると思います。作った音声が合計30分になるまで使えるプランです。お高いプランならスライド一個分とか、本一冊分になるくらいの長時間の音声制作も可能なようです。

おわりに

ぷちコンが長く続いてくれていてありがたいと思います。何か作るのは楽しいですし、UEもいじっているだけで楽しいです。UEを触る良い機会になっているので、これからも続いていってほしいと思います。
近年のペースで続くなら、30回目は5年後くらいですかね? できるだけ参加していきたいと思います。