FINAL KNIGHT DEMO を作りました:使用アセット編

先日、レトロスタイルなベルトスクロールアクションゲーム(の体験版)、
FINAL KNIGHT DEMOをunityroomにて公開しました

環境によっては重くてまともに動かないかもしれませんが、数分で終わる内容なのでぜひ遊んでみてください。

もし最近の3Dゲームが動く環境で動作しない場合は、お便りをいただけたら調査します。

今回はゲームシステムを軽く説明して、使用技術やアセットの紹介などをしたいと思います。
制作振り返りもするつもりですが記事が長くなりそうなので別記事で。

2021/08/06追記 振り返り記事書きました。

縦長になってしまったので複数記事に分けました。

ゲームの説明

  • 上下左右スティック(または十字キー)で移動
  • X(□)ボタンで攻撃
  • A(✕)ボタンでジャンプ
  • XA同時押しで無敵範囲攻撃のメガクラッシュ(ただしHP減少)

というオーソドックスな操作系です。

少し特殊なのがパリィとチャージ攻撃で、チャージ攻撃は名前の通り攻撃ボタンを一定時間長押しして離すと発動する強力な攻撃で、確定でダウンを取れます。

パリィは、攻撃が発生した直後に攻撃ボタンを押したままキャラが向いている方向と逆にスティックを倒すと、一定時間防御体勢に入ります。

この間に敵の攻撃を正面から受けると、敵の攻撃を弾き、プレーヤーは一定時間無敵になり、チャージ攻撃を即時発動できるようになります。

一部の敵は離れた距離から強力な攻撃を放ってくるので、予備動作を確認してしっかりパリィを入れることで、戦闘を有利にすることができます。

使用技術・アセット

今まで使っていなかったUnityの機能を使って知識を深めつつ、外部アセットも使えるものは何でも使って楽をしようと考えて作ったので、かなりの数のアセットを使っていますのでここで紹介したいと思います。

使用技術

制作に使用したUnityのバージョンは、Unity 2020.3.9f1です。

今回新たに使用したUnityの基本機能は以下のとおりです。

  • Timeline
  • Cinemachine
  • Universal Render Pipeline (URP)
  • ShaderGraph

TimelineとCinemachineは主にタイトル画面のカットシーン、URPはグラフィック全般、ShaderGraphは既存のURP向けグラフをブルームエフェクト用に少し書き換えた程度です。

この中で特にURPについては、既存のアセットが未対応だったり、対応していたとしてもドキュメントが不十分であったり、中にはドキュメント内で作者がURPの仕様についてご不満を表明しているものもあったりして結構大変でした。

でも今後はURPやHDRPが主流になっていくとのことだし、ShaderGraphや、VFX Graphを使うためにはこれを使う必要があるため、触る価値のあるシステムだと思います。

なお、VFX Graphは2021年7月現在だとWebGLに対応していないため、今回は使用しませんでした。

TimelineやCinemachineはこれまでなんとなく触っていませんでしたが、カットシーンを作るのにかなり便利だったので今後はどんどん使っていこうと思います。今までずっとDoTweenのSequenceでそれっぽく動かしてたゼ…。

使用アセット

有料・無料問わずかなりの数のアセットを使用しています。

50音順で主要な物をさらっと紹介していきます。

なお、リンクはアフィリエイトとなっています。もしゲームの内容が良くて続きを作って欲しい、記事が面白かったなど、応援していただけるならリンクからアセットを買っていただけると幸いです。

A* Pathfinding Project Pro

敵AIの経路探索で使用しています。後述のBehavior Designerのノードから処理を呼び出しています。

使用したGraphはRecast Graphです。このGraphはNavmesh Cutという、特定の形状に限定されますが動的にNavmeshに穴を開けられるので、樽などの消滅する可能性のある障害物を、それが存在する間は避けて消滅したらその上を通れるようにする、といったことができるようになります。

青いのが歩行可能エリアで、穴が開いているのがNavmesh Cutで歩行不可能にしているエリア

Behavior Designer

ビヘイビアツリーという技術で敵のAIを組むために使用しています。

画像のようにノードを組み合わせてツリーを作っていくことで、視覚的にAIの動きを制御することができます。

たまに勘違いされている方がいる気がするのですが、このビヘイビアツリーというのは一見Unreal EngineのBlueprintといったビジュアルプログラミングのような物に見えますが、実際の用途はAIの構築に向けたもので、「コードを書かなくてもプログラムができる!」といったものではないです。むしろ、コードを書かないと複雑なことはできない。

経路探索をして移動をしたり、キャラクターが今どういった状態かを確認したりといったノードを独自に作っています。あとは、Random Selectorというツリーの子をランダムに実行するSequenceがデフォルトで存在するのですが、80%の確率で攻撃、20%で待機、といった重み付けを行うことができないため、Weighted Random SelectorというSequenceノードも制作しました。

Chronos

ゲーム内の時間を制御するアセット。
以前は有料だったのですが、サポート終了と共にいつの間にか無料になっていた…。

Unityで時間制御(スローモーション、一時停止など)というと、Time.timeScaleを変更するのが一般的ですが、このアセットを使うと、特定のオブジェクトのみ、特定のエリアのみにスローモーション・一時停止をかけることが可能になります。Rewindという逆再生も可能とか。(今回は使ってません)

主に攻撃時のヒットストップと、終了時の画面停止に使っていたのですが、ヒットストップは斬撃系の攻撃だと逆効果だな~と感じたので最終的には無くして、画面停止のみに使っています。

基本的には便利なのですが、Animatorが特定状況でスローモーションにならなかったり、特定オブジェクトに紐付いた複数のパーティクルシステムに対応していなかったりと若干困ったことが多かったです。サポートが終了しているので、自分で中身を改造して使ってみるのも良いかもしれません。(自分も一部改造しました)

DoTween Pro

説明不要な有名アセット。色々なものにTweenアニメーションをつけることができます。

キャラのダメージ時の振動や、テキストを一文字ずつ表示したりするアニメーションなどに使っています。

UniTask2と連携して、Tweenアニメーションの終了待ちをして次の処理へ、といった使い方ができるようになり、便利さがより増したと思います。(OnCompleteを書く必要がなくなった!)

Dynamic Bone

おっぱいとかおっぱいなど色々なものを揺らせるアセット。

プレーヤーのマントを揺らすために使ってます。簡単・便利でした。

Editor Console Pro

これはゲームの内部ではなくデバッグ用のコンソールを拡張するアセット。

こんな感じでフィルタで分けると、特定文字列が含まれる場合色分けしてログを表示できたりして便利です。

そして今まで知らなかったのですが、Debug.Log()って、第2引数にGameObjectを指定することができるんですね。

Debug.Log("何らかのエラー", gameObject);

などと指定しておくと、どのゲームオブジェクトで発生したログなのかを確認できるようになっています。

なぜ今まで知らなかったんだ…わざわざログテキスト内にgameObject.nameとか入れてたぞ…!

Favorite Tab[s]

これもエディタ拡張系。

よく使うフォルダやアセットに☆をつけると、一つのタブにまとめてくれるので後から簡単にアクセスできるというシンプルなツール。

Feel

様々なものにちょっとしたエフェクトを加えられるアセット。比較的新しい。

今回のゲームではHPバーの増減時のエフェクトに使用しています。

Master Audio: AAA Sound

BGMや効果音の再生制御に使っています。定番アセット。

個人的に便利だと思っている機能は、ランダムにピッチを変えたりちょっとした揺らぎを入れられるところ。

MessagePipe

Pub/Sub的なメッセージの受け渡しをするライブラリ(超ざっくり)。

今回はダメージ情報やゲームオーバーイベントなど、不特定多数に対するグローバルなイベントの通知に使っています。正直UniRxに含まれるMessageBrokerでも良かったのですが、新しいもの使ってみたかったので。

このライブラリを使うにはZenjectやVContainerなどのDI Containerを使う必要がありますが、BuiltinContainerBuilderという簡易的なDI Containerが用意されているのでこれを使っています。

Modern UI Pack

ゲームオーバー時の画面レイアウトやボタンのデザインに使用してます。付属のスクリプトは使用していません。

Odin – Inspector and Serializer

Inspectorビューを大幅に使いやすくしてくれるエディタ拡張。定番。

個人的に便利だったのが、MonoBehaviourをSerializedMonoBehaviourに変えるだけで、InterfaceをInspector上でアタッチできるところ。せっかくInterfaceを使ってるのにクラスで宣言してるんじゃ意味ないよ~ってところがこれで改善されました。まあでも、今風にやるならDI Containerとかで突っ込むんでしょうね。

他にも、一部のコンポーネントを視覚的にわかりやすくなるようレイアウト変更するのに使っています。

Pro Camera 2D

名前の通りカメラの制御に使っています。

Railという機能を使って、Playerを追いながら左端から右端までの移動範囲を制限しています。途中の敵が出現してきてカメラが停止する部分は、Custom Triggerという独自のトリガー(指定オブジェクトが特定エリア内に入ってきたら処理を実行する仕組み)を作って制御しています。

Rewired

コントローラなどの入力全般を管理する定番アセット。

今回のゲームにおいて、キャラクターの入力制御やUIの操作など、入力全般を担ってます。

少しとっつきづらい見た目ではありますが、理解できればとても有用なので、Unityで複数種類のコントローラに対応したい人は使用してみてはいかがでしょうか。

UniRx – Reactive Extensions for Unity

これも(一部界隈では)説明不要の定番アセット。

今回のゲームでもあらゆるところで使用している根幹技術です。基本的にはほぼ全てのコンポーネントはStart()内で色々Subscribeして、Update()は全く使わないといった書き方をしています。

UniRxは、ざっくり表現すると”何らかの操作や値の変更を監視して、条件を満たす時この処理を実行する”、といったイベント駆動的な動きを要する時に使用しています。

UniTask

“Aが終わるまで待った後Bを実行し、Bが終わったらCを実行”といった手続き的な処理の中で待機したいときに使っています。

前述のDoTweenとの連携など、使用の幅は広く、もはや汎用的な技術だと思います。ただ、CancellationTokenの扱いだけは気をつける必要がありますね。(その部分だけちょっととっつきづらい印象があります。アセットというよりC#のasync/awaitの仕様の話なのだと思いますが)

VeryAnimation

3Dモデルのアニメーション設定をUnityのシーンビュー内で行えるアセット。

ちょっとしたアニメーション付けなら簡単にできますし、既存アセットのアニメーションの一部を変更したりするのにも便利です。

無の状態から作ったアニメーションの中で一番良く出来たと思うのはこれ。これもVeryAnimationのおかげです。

その他3Dモデルなど

3Dモデルやパーティクルエフェクト、サウンドなどはこんな感じ。できるだけ統一感を持たせるためにSynty Studioのアセットを中心に、ローポリアセットで統一してます。

使ってるアセットの羅列だけであんまり面白い内容ではなかったと思いますが、とりあえず今回はこのへんで。

次はtwitterのtweetなどを元に制作の振り返りをしたいと思います。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする