FINAL KNIGHT DEMO を作りました

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

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

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

2021/12/09 追記

元々複数投稿に分けてtwitterへの開発tweetを追っていく形で振り返りを行っていたのですが、トータルで4ページくらいになってとても見づらいと思ったので、tweetの内容はモーメントにして、振り返り記事も1ページに纏めることにしました。

ゲームの説明

  • 上下左右スティック(または十字キー)で移動
  • 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のアセットを中心に、ローポリアセットで統一してます。

制作のきっかけ

前の記事にあった、twitchのチャンネルポイントをUnityに連携させる仕組みを利用したゲームを作ろうと思い、何にしようか考え始めたのが制作のきっかけです。

で、いつもどおりScapleというツールで叩き台づくり。

去年ファイナルファイトを結構遊んでいたこともあって、ベルトスクロールアクションゲームなら自分の理解度も高いだろうということで、ジャンルはベルトゲーとすることに。

twitch連携機能自体は以前作ったツールで動作確認できているため比較的簡単に実装できそうだったので、とりあえずデモ版に関しては、それ以外のベルトゲー部分の操作を確認できる物を作ろうと最初から考えていました。

制作中のツイート

以下のモーメントに纏めました。興味があったら見てください。

https://twitter.com/i/events/1468627422643994625

なお、制作は3月末~7月中旬までかかりました。

完成した感想

Twitchとの連携を目的としたゲームなので、そもそも完成なのか?という部分はありますが、そこは以前別のプログラムで動作検証済みなのでとりあえずヨシ(体験版として人に遊んでもらう形にし辛いという理由もあります)として、一応目指した物は出来たのでその感想を。

個人開発は時間がかかる

まず、全て一人でそれなりの規模のゲームを作るのは大変だな~というのが一番の感想でした。3Dモデルも音もほぼアセットを使っているとはいえ、できるだけ違和感を感じないように調整したり、アニメーション作ったり、エフェクト作ったり、レベルデザインしたり、タイトル画面のカットシーンを作ったり、演出考えたりしていると、本職(?)のコード書く時間と精神力が削られて、一部、強引なドリブルで自分でも満足できない品質のコードを書いてしまいました。折を見てリファクタリングすれば良いのでしょうが…。

一人でもクオリティの高いものは作れるとは思うんですが、私のような凡人だと、一つ一つを商業でも恥ずかしくないようなクオリティに持っていくためには相当な時間が必要だと思います。一本作るだけでおじいちゃんになっちゃう。

自分はゲームを作る以上は、それでお金をいただけて、満足してもらえる物を作るのが夢であり目標です。

複数人での開発も各々のやる気やスキル、感性の違いなどでスムーズに行かない事も多いとは思いますが、一人では実現できないクオリティのものを現実的な期間の中で実現するためには、チームを組んでの開発も視野に入れていく必要があるのではないかと思いました。

継続は成長に繋がる

とはいえ、開発中に自分の成長を実感できることも多々ありました。

これまでに公にリリースしたゲーム以外に、それと同じかそれ以上に表に出る前に開発が頓挫したゲームがあります。

世の中では、(ゲームに限らず)作品は完成させることに意味があり、完成させないと成長に繋がらない、といった意味合いの発言をよく聞きます。

自分も概ねそう思います。

ゲーム開発では、自分が表現したいメインゲーム以外の部分(UI操作といったアウトゲームなど)が開発においてそれなりの規模で存在し、頓挫するとその部分に手を触れる事無くお蔵入りしてしまうため、その部分を制作する能力が身につかない、という意味合いで考えています。(また、宣伝などのゲームを遊んでもらうためのノウハウも完成しないと身につかないと思います)

自分の場合はゲームの土台となるものを完成させてから、何に手をつけたらいいかわからなくなって辞めるというケースが結構多くて、このせいで、面白いと感じさせる仕組みを作るためのゲームデザイン経験が不足していると思っています。

それを理解した上で、自分はお蔵入りしたゲームの開発経験は無駄ではなかったと感じます。もちろん完成させたら経験値は2倍、3倍になっていたかもしれませんが、完成しなかったゲームでも継続して開発を続けた結果、以前は実現の仕方がわからなかった物を作れるようになったり、理解できなかった概念を理解できるようになりました。

ここで最も大切なのは、完成したかしなかったかではなく、継続してものづくりを行えたか、なのではないかと思います。ゲームを完成させてもその間2年間何もしなければ成長しないし、ゲームを完成できなくても2年間試行錯誤を続けていたら、それなりの成長は得られるのではないかと思います。

もし作っていたものを継続するのが難しくなった時、頑張って続けられるのが一番ですが、すぐに切り替えて新しい物を作り続けるというのも、そこまで悪いことではないのではないか、もし何度もゲームづくりを投げ出してきた自分と同じような人が居ても、着実にスキルは身についてるから頑張ってね、ということです。

明確なマイルストーンの必要性

上述のゲームの完成と関連する話ですが、個人で適当に開発をしていると、ゴールの設定をせずにふんわりと作ってしまうことが多々あります。今回も漠然としたイメージはありましたが、明確なゴールは設定せずに開発を進めてしまい、途中でどこに手を付けたらいいか分からなくなりました。

しかし今回は、「これを実装したら最低限ゲームとして成立する」という要素をリストアップして、それを一個ずつ実装するという方法で停滞を打破できました。

マイルストーン的なもの(再掲)。実際には実装してないものもある。

当たり前のことではありますが、何かを完成させるためには、何をもって完成とするかの線引きをしっかりとすることが重要です。そうしないと無限に作ってしまうと思います。何を実装して何をしないのかの取捨選択については、期日の設定が役に立つと思います。(今回はあんまり守れなかったけど)

アセットの利用について

自分はドット絵を描く能力や3Dモデルを1から作る能力が現状無いので、必然的に有料の3Dモデルを買って、それを使ってゲームを作ることが多いのですが、制作の風景を動画配信している時に、心無い人がやってきてちょっとした誹謗中傷を受けることがありました。

主に昔の2Dゲームをなんで3Dでやってんだというドット絵至上主義的な話と、他人のアセットを使ってゲーム作って恥ずかしくないのか的な事でした。2Dと3Dは個人の趣味の問題なので別に良いのですが、アセットを使うことについては、まあ品質が低いゲームに品質が低いアセットが使われているから、そう言われるんでしょうね。自分としては、限られた時間で最大限の効果を得られるように、品質が低く感じられないように頑張りつつ、今後も使っていきたいと思ってます。

最後に

1面だけの体験版的な内容ではありましたが、今作は多分自分が作った中で一番複雑なゲームでした。DEMOと銘打った為、今後も開発を続けていく可能性はありますが、今は別のアイデアがあるので、ちょっとそっちに労力をかけようかと思っています。

もしコロナが一段落してオフラインの個人ゲーム展示会などが開かれるようになったら、もうちょっと作り込んで展示などもしてみたいですね。

自分がゲームを作る理由は、本質的に新しいもの好きで、制作を通して新鮮な体験を得るためなので、これまでに挑戦していなかった事もどんどん挑戦していきたいところです。

遊んでいただいた方ありがとうございました。攻撃のヒット感とパリィした時の爽快感、いいね!と思っていただけたら幸いです。

ガンジー先生の次回作にご期待ください!(未完)

シェアする

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

フォローする