Raspberlyのブログ

Raspberlyのブログ

Unityネタをメインとした技術系ブログです。にゃんこ大戦争や日常なども。そろそろブログタイトル決めたい

【アセット紹介】Feel でヒットストップを作る【Unity】

今回はアセット「Feel」を使ってヒットストップを実装する方法についてまとめます。

 

 

どんなアセット?

音やエフェクトなどゲームに様々な演出を簡単に実装するアセットです。
過去に紹介記事を投稿しています。

 

基本的な概要や使い方はこちらの記事をどうぞ

raspberly.hateblo.jp

今回は、発展的な内容として、ヒットストップを実装する手段をまとめます

 

 

開発環境

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を編集せずに実装できますね。
参考資料にある動画も、タメになるのでぜひどうぞ。

以上です。

 

 

参考資料

youtu.be

youtu.be

wikiwiki.jp

 

 

 

 

他のアセットの紹介記事はこちら↓

raspberly.hateblo.jp

 

 

 

※本記事にはAssetStoreアフィリエイトリンクが含まれています。

他、間違っている箇所、わかりにくい所がありましたらコメントにお願いします。