読者です 読者をやめる 読者になる 読者になる

エディトリアルデザイナーのアプリ制作日記

Unityで遊ぶ個人開発者のメモ書き

Unityアクションゲーム制作記 その16 ボスらしい動きをするロジックを組み込む

 

youtu.be

  ようやく懸案となっていたボスの挙動の目処が、ある程度立ちました。本当は昨年内に終わらすつもりだったもの……ここまで引っ張ってしまった原因として、ゲームとして盛り込んだアクションのシステムにありました(要は根幹に関わる部分)。

 まず、今回制作しているアクションゲームは、1対多の戦闘がメインになっています。敵の数が多いということは、それだけプレイヤーが囲まれることも多くなり、下手をするとすぐ多数の敵にボコボコにされてしまう危険があります。そうなるとプレイヤーは、敵からボコられないために集団から離れて攻撃をする、ヒットアウェイ戦法を選択し、チクチクと戦うことに……これではゲームとして爽快感に欠けてしまいます。

 せっかく多くの敵と戦っているのだから、バッタバッタと敵をなぎ倒すような、より気持ちいい戦闘にするにはどうしたらいいんだろう? そこでひねり出したのが、攻撃を受けた相手の動きを封じるようなリアクションをさせるというものでした。

 今回用意したのは、以下の4つ(プレイヤー・敵ともに設定可能)。

  • ノーマル:ダメージのみを与える
  • ブロウ:相手を一瞬ひるませる(相手の攻撃をキャンセルする)
  • ノックバック:相手を一定距離吹き飛ばす(相手の攻撃をキャンセルする)
  • ブラックアウト(気絶):一定時間、行動不能状態にする

 基本的にプレイヤーが連続攻撃を使った際には、初弾(ノーマル)>二段目(ブロウ)>三段目(ブロウ)>フィニッシュ技(ノックバックなど)と設定してあります。初弾をノーマルにしたのは、さすがに出合頭で敵の攻撃をつぶせてしまうと、本当に一方的な無双状態になってしまうので、ここは敵にも反撃できる余地を残してあります。結果として、プレイヤーが積極的に攻めることで敵の動きを封殺でき、いい感じの無双アクションを楽しめるようになったかな? という具合です。攻撃の間合いが違ったり、遠距離攻撃をしてくる敵などバリエーションを用意して、いっぺんに登場させれば、それなりに緊張感のある戦闘バランスになっていたりしました。

 ただし、ボス戦のときに問題が起きました。雑魚の場合は、数の暴力でプレイヤーへの反撃の余地はあったのですが、ボス単体とのサシ勝負では、ブロウによって攻撃がつぶせることが仇になってしまったのです。極端な話、あまりに簡単に敵の攻撃がつぶせてしまうので、ボスを一方的に殴るだけで戦闘が終わってしまうということも……結果、ボス戦がすげーつまらないものになってしまったのです。ボスの行動自体、雑魚と同じくプレイヤーとの状況(攻撃されたとか、見つけたとか)などに応じて、幾つかの行動を選択し、ループさせているだけなのも原因の一つだったといえます。

 じゃあ、ボスでは「ブロウ」を無効化すりゃーいいじゃん? 対プレイヤー用にロジックを組み直せばいいじゃん? と思わなくもないのですが、単に「ブロウは無効」としてしまうだけでは、あまりにゲーム的な都合が見え見えになってしまいますし、ボスごとにロジックを組むのは、ボスを量産する際にかなりきつそう……。

 そんな感じで、攻撃し続けていると、いい感じに敵が判断して回避して反撃したりできないかと、ここ数ヶ月ず〜〜〜〜っと頭を悩ませていたのです。まぁ、プレイヤーに対するリアクションを逐一判定し、対応する反撃方法を組み込んでやるのが王道なんでしょう、きっと。ただ、ロジックそのものを組み込んでしまうと、どういう反撃をしてくるのかすぐプレイヤーにバレるだろうし、後々、敵の強さを調整したいときにすげーめんどくさそうだったので、ない知恵絞ってうだうだと考え込むことに。どーしよっかなーと、どうすればいいかなーと悩み続けたのですが、結局やりたいことは、

  • 状況が悪化したら、有利な状況に変化するように自律的に行動してほしい

これに尽きます。これができれば、ボスとの戦闘も駆け引きのあるものになるはず! そして、状況が悪化するということは、敵にとって不利な状況に追い込まれることにほかなりません。今回のゲームで敵にとって不利な状況とは、

  • 壁際に追い詰められる
  • プレイヤーからダメージを受け続ける

単純化すれば、この2つに集約されるかなーと。そしてこの2つそれぞれにストレス値を用意して、敵にとって不利な状況を明確に数値化することにしました。

  • 壁際に追い詰められる = 地形ストレス上昇
  • プレイヤーからダメージを受け続ける = 攻撃ストレス上昇

 ボスが壁に近づけば近づくほど=プレイヤーに追い詰められる=地形ストレスは上がる。プレイヤーから攻撃を受ければ受けるほど攻撃ストレスは上がっていく。それぞれがある一定のしきい値を超えた時に、ボスへ回避や反撃する行動を起こさせるという具合です。

 しかし、これだけでは地形・攻撃ストレスで2パターンしかバリエーションを作れません。そこでさらにストレスレベルを用意して、そのストレスレベルに応じて回避や反撃行動を設定できることにしました。ストレスレベルはひとまず5段階。ストレスレベルが上がる条件は、ストレス値がしきい値を超えた時で、ストレスレベル下がる条件は時間経過のみとしました。かなり単純な仕組みですが、しきい値(レベルに関係なく固定)とストレスレベルを下げる時間(レベルごとに設定)をうまく調整することで、敵の攻撃をより激しくできたり、いったんレベルが上がってしまったら下がりにくくしたりできるので、これによってボスの個性も出せるようになっています。

 さらに、ボスに対して有効な攻撃をするプレイヤーに対しては、常にストレスレベルが高くキープされ、激しい反撃を多くするようになり、アクションが苦手なプレイヤーに対してはストレスレベルの上昇が抑えられるといった、難易度調整も自動でできるようになりました。

 結局のところ、ボス固有の攻撃のバリエーションを考えなきゃいけないし、各種数値の設定もちゃんとしないといけないしで、今回の方法でボスの制作が楽になったわけではありません。とはいえ、ある程度の共通な仕組みでボスの量産ができそうな感じになってきました。あとはちゃんと忘れずにドキュメントを整理するだけ……なんですけど、めんどーなことはいつも後回し。これまでも、メモとしていろいろ書き残しているのですが、たまーに間違ったコマンドとか変更前の仕様とか書いてあったりして、油断がなりません(常に過去の自分と戦っている…)。

 とはいえ、大きな問題が一つ片付いて一安心。次は、テストプレイしていう間にず〜っと気になっていたダッシュとチャージの使い勝手の悪さ(=操作性の悪さ)を、少しでも良くしなければ……そろそろちゃんと考えなきゃいけないゲームそのもののデザインとともに悩むとします。がんばろっと。