今回はアセット「Feel」を使ってヒットストップを実装する方法についてまとめます。
どんなアセット?
音やエフェクトなどゲームに様々な演出を簡単に実装するアセットです。
過去に紹介記事を投稿しています。
基本的な概要や使い方はこちらの記事をどうぞ。
今回は、発展的な内容として、ヒットストップを実装する手段をまとめます。
開発環境
Unity 2021.3.12f1
Feel ver3.12
やりたいこと
Feelを使ってヒットストップを実装します。
以下の3種類の方法を用いて解説します。
・Time.timeScaleを0にする
・Animator.speedを0にする
・Animator.speedを遅くする
下準備
アセットとかの準備
プレイヤーにSD ユニティちゃん、敵にCubeを用意。
攻撃モーションとエフェクトも用意します。
モーションとエフェクトは下記のアセットを使用しています。これはなんでもいいです。
プレイヤーの作成
シーンに空のGameObjectを作成、名前をPlayerにしてユニティちゃんを配置、手のボーンに剣を持たせます。
剣には攻撃判定用のColliderをアタッチしておきます。
PlayerのAnimator
Animatorを作成。
ステートを2つ作成し、待機モーションと攻撃モーションを持たせます。
bool型パラメータattackを追加し、attackのオンオフでステートが切り替わるようにします。
PlayerのScript
以下のFeelPlayer.csを作成し、Playerにアタッチ。
キーボードのスペースキーを押すと、登録したFeedbacksを再生する単純なScriptです。
using UnityEngine; using UnityEngine.InputSystem; using MoreMountains.Feedbacks; public class FeelPlayer : MonoBehaviour { [SerializeField] MMFeedbacks attackFeedbacks; void Update() { if(Keyboard.current.spaceKey.isPressed) { attackFeedbacks?.PlayFeedbacks(); } // 旧InputManagerでやりたい人用 //if(Input.GetKeyDown(KeyCode.Space)) //{ // attackFeedbacks?.PlayFeedbacks(); //} } }
攻撃Feedbacksを作成
空のGameObjectを作成、名前をAttackFeedbacksに。
MMFeedbacksコンポーネントをアタッチし、各種Feedbackを実装していきます。
攻撃時にAnimatorのパラメーターを書き換えるAnimationと、
攻撃判定用ColliderのActiveを切り替えるSetActiveを追加。
Animationの方は、対象のAnimatorとパラメータを設定。
Feedbackの紐づけ
PlayerにFeelPlayer.csをアタッチし、AttackFeedbacksを紐づけます。
これでゲームを開始しスペースキーを押すと攻撃します。
わかりにくいですが、攻撃モーション中ColliderもActiveになっています。
これでPlayerは完成。
敵の作成
空のGameObjectを作成、名前をEnemyにしてCubeを配置します。
EnemyのScript
以下のFeelEnemy.csを作成。
OnTriggerEnterで登録したFeedbacksを再生する単純なScriptです。
using UnityEngine; using MoreMountains.Feedbacks; public class FeelEnemy : MonoBehaviour { [SerializeField] MMFeedbacks hitFeedbacks; private void OnTriggerEnter(Collider other) { hitFeedbacks?.PlayFeedbacks(); } }
ヒットFeedbacksを作成
攻撃が当たったときにエネミーが呼び出すFeedbacksを作成します。
空のGameObjectを作成、名前をAttackFeedbacksに。
MMFeedbacksコンポーネントをアタッチし、各種Feedbackを実装していきます。
Cubeの大きさが変化するScaleと、攻撃時にエフェクトを出すParticlesPlayを追加。
ヒットストップとは直接関係ない賑やかしなので、特になくてもいいです。
ここはお好みで。
最後、EnemyにFeelEnemy.csをアタッチ、ColliderとRigidbodyもアタッチします。
HitFeedbacksも紐づけます。
これでEnemyの準備を完了。
後はヒットストップを追加していくだけです。
MMTimeManagerを配置
最後に空のGameObjectを作成し、MMTimeManagerをアタッチします。
これはFeelで時間を制御する時に必要なコンポーネントです。シーン内に必ず存在する必要があります。
これで下準備は終わり。
次からヒットストップを実装していきます。
ヒットストップを実装
TimeScaleを0にする
一番手早いヒットストップ。Time.timeScaleを0にします。
特徴は時間が止まるため、他のオブジェクトやエフェクトも全て停止するという点です。
HitFeedbacksに、Time/FreezeFrameを追加します。
これは指定の秒数、時間を止めるFeedbackです。
今回は0.2秒止めてみます。FreezeFrameDurationに0.2を設定。
これで完成、攻撃ヒット時0.2秒間Time.timeScaleが0になります。
プレイヤーのアニメーションを止める
攻撃ヒット時、プレイヤーのアニメーションを一瞬止めます。
HitFeedbacksに、GameObject/AnimatorSpeedを追加します。
これはAnimatorの再生速度を変えるFeedbackです。
今回は0.3秒止めてみます。
Bound AnimatorにユニティちゃんのAnimatorを紐づけ、
ModeをInstant Then Resetに、Durationを0.3にします。
これで完成、攻撃ヒット時0.3秒間アニメーションの再生速度が0になります。
プレイヤーのアニメーションを遅くする
攻撃ヒット時、プレイヤーのアニメーションを遅くします。
やり方はさっきとほとんど同じです。New Speed Minに0.05を設定します。
これで完成、攻撃ヒット時0.3秒間アニメーションの再生速度が0.05倍になります。
まとめ
今回はアセット「Feel」を使って、ヒットストップを実装しました。
Time.timeScaleを0にする方法、Animatorの再生速度を0にする方法、
Animatorの再生速度を遅くする方法の3つを紹介しました。
プレイヤーに爽快感や良い手触りを与える演出ですが、FeelならScriptを編集せずに実装できますね。
参考資料にある動画も、タメになるのでぜひどうぞ。
以上です。
参考資料
他のアセットの紹介記事はこちら↓
※本記事にはAssetStoreアフィリエイトリンクが含まれています。
他、間違っている箇所、わかりにくい所がありましたらコメントにお願いします。