ベルトスクロールのキャラクター状態を整理する ― 硬直を状態として分ける理由
待機・移動・攻撃・被弾・ダウンといったキャラクターの状態を、どう分けてどう遷移させるか。ガード硬直や打ち上げ、起き上がりを独立した状態にした理由を説明します。
- ゲーム設計
- アクション
- 状態管理
アクションゲームのキャラクターは、いつも何かの「状態」にあります。 待機している、歩いている、攻撃している、攻撃を受けてのけぞっている。 この状態をどう分けて、どう切り替えるかは、 アクションゲームの設計の中でも最も基礎になる部分です。
基本の流れ
このプロジェクトのキャラクターは、次のような流れで状態が移り変わります。
- 待機から、移動の入力で歩き・走りへ
- 攻撃の入力で攻撃へ。受付時間中に入力があれば、次の段の攻撃へつながる
- 攻撃を受けると被弾へ。硬直が終わると待機に戻る
- 体力がなくなるとダウンへ。そこから倒れるか、起き上がる
これに加えて、ガードとジャンプが、待機から分岐する状態として存在します。 ガードは攻撃を受けるとガード硬直を経て待機へ、 ジャンプは空中攻撃に派生するか、着地して待機に戻ります。
ここまでは多くのアクションゲームに共通する、ごく標準的な形です。
硬直を独立した状態にする
この設計でこだわったのは、硬直を独立した状態として扱うことです。
「攻撃を受けてのけぞっている」状態と、 「攻撃をガードして動けない」状態は、どちらも「操作を受け付けない時間」 という意味では同じです。一つの状態にまとめてしまうこともできます。
しかし、この2つは中身がまったく違います。 のけぞりの硬直中は、次の攻撃を受ければコンボがつながります。 ガードの硬直中は、次の攻撃もガードで受け止めることができます。 硬直が終わった瞬間に何ができるかも、状況によって異なります。
これらを一つの状態で扱うと、「今はのけぞりの硬直なのか、 ガードの硬直なのか」を別の変数で管理することになり、 条件分岐がどんどん複雑になっていきます。 別の状態にしてしまえば、それぞれの状態の中で 何ができて何ができないかを、素直に書けるようになります。
硬直の長さは、状態の側ではなく、攻撃の側が決めます。 技のデータに「当たった相手の硬直時間」と「ガードした相手の硬直時間」を それぞれ書いておき、その値だけ硬直の状態にとどまる、という形です。 技ごとに硬直時間を変えられるので、有利な技、不利な技といった 性格づけもデータだけでできます。
打ち上げと起き上がり
同じ考え方で、次の2つも独立した状態にしました。
打ち上げは、攻撃で空中に浮かされた状態です。 ベルトスクロールでは、浮いた敵にさらに攻撃を当てて 空中でコンボを続けることが、爽快感の大きな源になります。 浮いている間の落下の仕方や、追撃を受けたときの挙動は、 地上でのけぞっているときとは大きく違うので、専用の状態にしています。
空中コンボは強力なので、無制限に続けられると一方的になってしまいます。 そのため、技ごとに「空中コンボにどれだけ負担をかけるか」という値を持たせ、 それが上限に達したら追撃を受けなくなる、という制限を設ける設計にしています。
起き上がりは、ダウンした状態から立ち上がるまでの状態です。 起き上がりの最中は、攻撃を受けない無敵の時間を持たせます。 これが無いと、倒れた相手が起き上がる瞬間に攻撃を重ね続けることができ、 一度ダウンしたら何もできないまま倒される、という理不尽な状況が生まれます。 起き上がりを状態として独立させておけば、 その間は無敵、というルールを一箇所で確実に守れます。
状態を分けすぎないこと
状態を細かく分けることには利点がありますが、分けすぎると 今度は遷移の組み合わせが爆発的に増えてしまいます。
判断の基準にしているのは、その状態の中でできること、 受け付けることが明確に違うかどうかです。 のけぞりとガード硬直は、受けた攻撃への反応が違うので分けました。 一方、弱攻撃と強攻撃は、どちらも「技を実行している」という点で同じなので、 状態は一つにまとめ、違いは技のデータで表現しています。
状態の設計は、ゲームの手触りを支える骨組みです。 骨組みがしっかりしていれば、その上に技や演出をいくら足しても崩れません。