ゲーム制作⑱ ガード基本
久しぶりにDeadCellsをプレイしましたが、やっぱり面白いです
ゲームを作る側の視点を持ってプレイすると新しい発見が色々あります
やはりアクションゲームならガード/パリィをしたいと思い、今回はガードの実装をしてみたいと思います
残念ながらcorgiengineにはガードという概念は無く、自分で新しい能力として実装する必要があります
ガードアビリティを作るまでの手順(詳細末尾)
- CharacterAbilitiyクラスを継承してCharacterGuardクラスを作りキャラにアタッチ
- 新しいキー(ボタン)の登録
- アニメーションの作成&アニメーターへの紐づけ
ガードアニメーションは即席です
肝心のガード処理ですが、corgiの理解が足りずどう実装するのが最適かまだ分かっていません
敵の攻撃を完全無効にすると攻撃をすり抜けるようになってやや不自然です
敵が弾かれてよろめくようなモーションにしたり、弾くようなエフェクトを付ける必要がありそうです
ガード中にダメージだけ無効にするとノックバックが適用され、一時的に宙に浮いてしまいます
ノックバックの力を軽減すると良さそうです
(本来はガードクラスに実装したいですが現在方法が分からず、各武器のインスペクターで設定可能なのでそちらで擬似的にノックバックを減らしています(y方向0、x方向も減少))
このぐらいがガードらしくちょうど良さそうです
次回はガード機能を仕上げつつ、パリィも実装したいです
メモ
DeadCellを見て取り入れたいと思った要素
・敵の攻撃前に頭上に!が点灯→初見でもガードや回避タイミングが分かりやすい
・攻撃の自動振り向き(右を向いてるときに左側近くに敵が居る時、左を押さなくても自動で振り向いて攻撃してくれる)
・攻撃エフェクトを半透明&発光→攻撃範囲が分かりやすい&見た目が良い&視界を大きく邪魔しない
・敵キャラ自体に接触ダメージ判定はなく、重ならないよう弾かれるだけ→素早く動き回る中で接触に気を使わなくて良い
ガードアビリティを作るまでの手順(詳細)
- CharacterAbilitiyクラスを継承してCharacterGuardクラスを作りキャラにアタッチ
- アニメーション用のパラメータを登録 InitializeAnimatorParameters() { RegisterAnimatorParameter("Guarding", AnimatorControllerParameterType.Bool, out _guardAnimationParameter); }
- ガードの入力処理
- HandleInput() { if (_inputManager.GuardButton.State.CurrentState == MMInput.ButtonStates.ButtonDown) { StartGuard(); } }等
- StartGuard() ProcessAbility() StopGuard()でそれぞれ開始時・ガード中・終了時の処理を書く
- IsGuarding(アニメーション用パラメータ)の有効&無効
- フィードバックの処理(PlayAbilityStartFeedbacks();)
- ガード機能の実装部分
- アニメーターの更新処理をオーバーライド UpdateAnimator() { MMAnimatorExtensions.UpdateAnimatorBool(_animator, _guardAnimationParameter, IsGuarding, _character._animatorParameters, _character.PerformAnimatorSanityChecks); }
- 新しいキー(ボタン)の登録
- プロジェクト設定からInputmanagerを開きサイズを増やす
- 「Player1_Guard」を登録(PlayerX_が必要)
- アニメーションの作成&アニメーターへの紐づけ
- アニメーションを作成
- コード上で記述したアニメーションパラメーター(Guarding)をアニメーター上のパラメーター欄でも登録
- アニメーター上で新しいステートGuardを作り、遷移を作成(条件は"Guarding"がtrueなら遷移、falseなら戻る)
- アニメーションセット(.aseprite)をインポート、アニメーションクリップ群を複製し、その複製したクリップをGuardに登録
- ※アニメーションのlooptime(=「時間をループ」や他のプロパティ)がグレーアウトして選択・編集できない→アニメーションクリップを複製する必要がある
ガードに関して追加する機能
・エフェクト
・敵の弾かれモーション
・ノックバックの軽減(y方向0、x方向激減)をガードクラスに実装
・100%ダメージ無効ではなく80%など任意の軽減率にできるように(パリィ成功時のみノーダメージ)
パリィ機能
・ガードボタン入力から数フレーム分だけパリィ判定
・エフェクト
・敵の攻撃中断よろけ(気絶)機能、モーション
・ノックバック無効
・100%ダメージ無効