アクションゲームの手触りについて

![blog_2023_programmer_tech05-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565954/671ff5d5-f293-e544-28be-cda204bf4e1a.jpeg)
こんにちは、トイロジック プログラム課のＫです。今回はアクションゲームの手触りについてお話したいと思います。弊社のアクションゲーム[『warlander』](https://playwarlander.com/ "『warlander』")を例として出します。

# ゲームの手触りって何？
**「このゲームは手触りが良い」** という言葉を皆さんも聞いたことがあるかと思います。「動かしているだけで気持ちが良い」みたいな事も良く言われます。
ゲームをプレイしていて **「手触りが良い/悪い」「動かしていて気持ちが良い/悪い」と感じるのは何故でしょうか？**

+ モーションが格好良い
+ エフェクトが派手
+ キャラクターがかわいい

などなど、色々と要因はあると思いますが、一番大きいのは、 **「入力に対するレスポンスが良い」** 事かな、と思います。「ユーザーの入力（コントローラー、キーボード、マウスなどの操作）」を受けて「プレイヤーキャラクターが動き」、その動きが「敵など外の環境に影響を与える」、この一連の流れがユーザーの思った通りに流れると、「手触りが良い」と評価されるわけです。


例えば、プレイヤーが剣で目の前の敵を攻撃するとして・・・


+ 入力に対してすぐに反応する
⇒ ボタンを押したら即攻撃する

+ 思った通りに動く
　⇒ 思った通りの攻撃が、思った通りの相手に向かって出る

+ 適切なリアクション
　⇒ 攻撃がヒットして鈍い音と共に敵が吹き飛ぶ


このように、 **ユーザーの操作によって、キャラクターが思い通りに動き、思い通りの結果に繋がれば、ユーザーは「気持ち良い」と感じてくれる**はずです。
それでは、それぞれの要素を少し細かく見ていきましょう。
 

# 入力に対してすぐに反応する
「ボタンを押したら、すぐにキャラクターが行動する」。当たり前の様ですが、そう出来ない事も結構あります。

よくある例としては、ジャンプの踏切りモーションがあります。ジャンプを行う場合、現実では一度屈んで、力を溜める必要があります。そのため、ゲームで何の予備動作も無しでジャンプすると、「リアルじゃない」と感じられたりします。それを避ける為、ジャンプモーションは予備動作として屈む動きが入る事が多いかと思います。

ただ、普通に屈むのを待ってジャンプすると、実際の上昇開始までに数フレーム間が開いてしまい、操作感としては若干もっさりした感じになります。この辺りは、ゲームの求めるリアリティラインとの兼ね合いで決定する必要があります。ちなみに『Warlander』ではプロジェクト初期には数フレームの踏切り待ちを入れていましたが、結局即ジャンプするように変更されました。

他の例としては、動作の硬直時間が挙げられます。例えばダメージを受けてダメージモーションを再生している間に、いつでも即反撃を出せてしまっては、ゲームとしての駆け引きに問題が出ます。このような場合、通常は大きなダメージほど、大きな硬直時間を設けて、ユーザーの操作不能時間を設定すると思います。

ただ、この際常に「ダメージモーションが終了するまで行動出来ない」、としてしまうとユーザーの操作出来ない時間が長く、操作感が悪くなります。ここで **「キャンセルフレーム」** の概念が出てきます。

「キャンセルフレーム」とは、 **「特定の動作を中断して次の行動が開始できるフレーム」** の事で、格闘ゲームなどで良く聞くかと思います。先ほどの例だと、ダメージモーションが「120フレーム」の長さだったとして、ガードだけは「80フレーム」からダメージモーションを中断（キャンセル）して発動出来る、ような事です。

この設定は一律ではなく、この行動中は「攻撃は〇フレーム」「ガードは〇フレーム」「移動は〇フレーム」の様に、行動毎に細かく設定する必要があります。『Warlander』ではキャンセル許可フレームの設定は１０以上の分類に細かく分かれています（移動、攻撃、ガード、射撃、スキル等々）。この設定は手触りに大きく影響するので、時間をかけて細かく調整する必要があります。
 

# 思った通りに動く
さて、キャンセルフレームを入れて全て解決かと思えばそうはいきません。如何にキャンセルフレームを設定したところで、駆け引きの問題から、操作不能時間の発生は完全には防げません。では、その操作不能期間の間にユーザーがボタンを押した場合、どうすれば良いでしょうか？

<dl>
<dt>・許可フレーム外なので無視する？</dt>
<dd>⇒ ユーザーはボタンを押して行動したつもりなので、思った通りに動かず気持ち悪く感じる</dd>
</dl><dl>
<dt>・いっそ全ての行動をいつでもキャンセル可能に？</dt>
<dd>⇒ ゲーム性の崩壊（特に対戦ゲームではバランスが取れない）。モーションの補完も破綻する</dd>
</dl>

これを解決するために、「行動の予約」が必要になります。つまり「行動不可状態の時でも、ボタンが押された事を記憶（予約）しておいて、 **行動可能になったら、即記憶しておいた行動を実行する** 」ようにします。

これによって、ユーザーはボタンを押した事に対するレスポンスがあるため、思った通りに動いたと感じる事が出来ます。但し、あまりに長い予約は逆効果になる事もあります。操作してから何秒も経ってから動いても、それはユーザーの意図とは違う、という事です。『Warlander』では60FPS換算で大体10~20フレームが予約期間です。

# 適切なリアクション
リアクションとしては、特に「モーション」・「エフェクト」・「ＳＥ」が大切になります。
例えば、ユーザーが攻撃を敵に当てた際の敵のリアクションとしては、

<dl>
<dt>・適切なモーション</dt>
<dd>⇒ 攻撃の重さに対するリアクションとして適切な動きか</dd>
<dd>⇒ 攻撃の向きとダメージモーションの向きは合っているか</dd>
</dl><dl>
<dt>・適切なエフェクト</dt>
<dd>⇒ エフェクトの内容、出る位置、向きは攻撃に合致しているか</dd>
</dl><dl>
<dt>・適切な音</dt>
<dd>⇒ 攻撃の重さ、ヒット位置の材質等にあった音が適切なタイミングで呼ばれるか</dd>
</dl>

のような事が重要になります。ゲームによっては、他にも「カメラ揺れ」や「パッド振動」などのリアクションが重要な事もあるかもしれません。

![blog_2023_programmer_tech05_01 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565926/1fbedd04-14b7-61b6-68ae-980a6da5965f.jpeg)
▲ダメージを受けた時のエフェクト発生例

また、 **「リアクションが無い」状況はなるべく避ける事が望ましい** です。いわゆる「スーパーアーマー」のような、ダメージを受けてものけぞらないような状態の時にも、ダメージを受けたらエフェクト、SEは発生させ、場合によっては現在の行動を阻害しない「加算モーション」を再生するような形でダメージを受けた動きを追加してあげる事も効果的です。

また、無敵状態で完全に攻撃が無効、というような場合も、攻撃は当たったが「効かない」事を表現するエフェクトやSEを発生させる必要があります。何もリアクションが無いと、行動が成功したのか失敗したのかがユーザーに伝わりません。 **失敗なら失敗のリアクションを返す事が重要です。** 

# 最後に
以上、簡単ですがアクションの手触りについてお話しました。

手触りの良いアクションを作るには、フレーム単位の細かな調整が必要になります。このあたりの調整を楽に行える仕組みを、早い内に整備しておくと、後々楽になるのでオススメです。調整はどうしても時間がかかり、手間ではありますが、手間をかける事で手触りはどんどん良くなっていきますので、最初から調整工数を見込んだスケジュールを立てておきましょう。