17.調整:ノックバックを実装する
アクションゲームには欠かせないといってもいいノックバック演出。攻撃を当てた瞬間に、敵やプレイヤーの動きが止まってからリアクションが始まるというもの。
実装に当たって改めてノックバックについて調べてみると、様々なタイプがあるようです。ゲーム内の時間を丸ごと止めるもの、敵だけ、プレイヤーだけ止めるものなどなど。どのようなノックバックがあるかについては、下記の動画が大変参考になりました。
なんでもチャージショットで決めてしまうサムスが強すぎる【スマブラWiiU】
格闘でなく射撃であることを考慮すると「敵だけを止める」タイプのヒットストップが適しているかと思いました。以下、ヒットストップについての考え余談。
ヒットストップとはなんぞ
せっかくのアクションゲームだしヒットストップとか入れてみるか(開発延長)
剣とか格闘のゲームでは欠かせない演出だけど、銃とかシューティングではあんまり見ない気がする?サムスのチャージショットくらいしか例が浮かばない
射撃攻撃とヒットストップについて
仮説1:ヒットストップとは「吹っ飛ばし」の再現である
なので、ライフルとかサブマシンガン、レーザーみたいな貫通の攻撃とはあまり相性が良くない
逆に射撃であっても、ミサイルとか波動拳とかかめはめ波みたいな、衝撃の攻撃とは相性が良い
仮説2:ヒットストップとは「抵抗」の再現である
サンドバックを蹴れば、かならずサンドバックからの跳ね返りが存在し、無抵抗で振り抜くことはできない
その抵抗の感覚を再現するのがヒットストップであるため、自分の体から離れてしまった攻撃からは抵抗を受けないため、射撃とは相性が良くない
ここまで書いてて思ったけど、要するに現実世界に存在する「作用反作用」のフィードバックをいかにしてプレイヤーに与えるか、という問いに対する1つの答えってことかな
逆に言えば、ヒットストップを設けることで、射撃攻撃であっても「吹っ飛ばし」や「抵抗」のような作用反作用のフィードバックをプレイヤーに与えられる、ということだろうか
あとカメラシェイクか
こっちは実装したことあるからすぐいけるはず
ひとくちにヒットストップといってもさまざまなパターンがある模様
それらの挙動を比較してくれているこの動画がかなり参考になる。まずはこれを見て方向性を決めよう
やっぱり格闘と射撃とでは、適切なヒットストップの種類異なってくる気がするなぁ
射撃は自分に反作用のフィードバックがないわけで、自分が止まるタイプのヒットストップはおかしいよなあ
撃つ瞬間に自分だけ硬直⇒当たった時に相手だけ硬直して吹っ飛ぶ なら自然かな?
サムス:撃った瞬間反動でちょっと後ろに下がってる。ヒットストップというよりその反動で重量感を出しているもよう
ベヨネッタ:当たった瞬間その場で硬直してから吹っ飛んでる。硬直中は完全に動きが止まるわけじゃなくて、やられモーションのままぶるぶるしてる?それともエフェクトでそうみえるだけ?
こっちで見ると、食らったほうはその場で上下に細かく揺れたり震えたりしてるのがわかる
撃ったほうはストップしてるというか反動で後ろに下がるor硬直してるだけだな
ていうか格闘でも、攻撃したほうにはヒットストップ入れてないな
不利になっちゃうから当たり前か
ヌルっと止まると気持ちよくない、パキッとその場で止まって欲しいのでWaitForSecondsをつかうか。
WaitForSecondsの間に、別の変数やオブジェクトを格納してしまいNullReferenceエラー
LineRendererの終点
WaitForSeconds後にLineの終点を更新していたため、更新される前にLineが描画されていた
ノックバックの時に操作するNavmeshAgent
WaitForSeconds中に壁など敵以外のオブジェクトを打つと、shootHitの対象がエネミーからそのオブジェクトになってしまい、NavMeshAgentを見つけられるNullエラー
実装したけど削除しました!!!
一度実装してみたけど、思ったよりも爽快感に寄与せずゲームプレイがダラけただけだったので削除しました!
攻撃が当たった瞬間=ノックバック処理の実行直前に、NavMeshのVelocityを0にするStopMotionメソッドを事項してます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public void StopMotion() { //アニメを止める animator.speed = 0f; //追跡を止める defaultAgentVelocity = agent.velocity; agent.velocity = Vector3.zero; //speedをゼロにするやり方は、減速してから止まるので気持ちよくない。ピタッと止まらないと。 //agent.speed = 0f; } |
がんばって作ったけど削除しました!!!
あと、これを実装するときにPlayerShootingクラスが超でぶになって見づらかったので、リファクタリングを一緒にしてます。これについては次回まとめます。
次回はコチラ
Unity公式チュートリアルSurvival Shooter WITH PK Chapter.17.5「リファクタリング」
前回はコチラ
Unity公式チュートリアルSurvival Shooter WITH PK Chapter.16「調整:攻撃中の移動速度を遅くする」
「Unity公式チュートリアルSurvival Shooter WITH PK Chapter.17「調整:ノックバックを実装する」」への1件のフィードバック