単独でも活用できる！CorgiEngine/TopDownEngineに同梱されているMMFeedbacksの紹介

この記事は、Unity アセットストア 真夏のアドベントカレンダー 2021 Summer のために書かれた記事です。

https://assetstore.info/eventandcontest/adventcalendar/summer-advent-calendar-2021/

Corgi Engine/Topdown Engineに同梱されているMMFeedbacksというアセットが便利なので活用しようという話です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/96248b02-68e9-4410-1cde-2b67e8624424.png)

#Corgi Engine/Topdown Engineとは？

Corgi EngineはパブリッシャーMore Mountainsが作った2D Platformerのテンプレートエンジンです。

https://assetstore.unity.com/packages/templates/systems/corgi-engine-2d-2-5d-platformer-26617?aid=1011l8zf9&utm_source=aff

TopDown EngineはパブリッシャーMore Mountainsが作ったTopDownビューゲームのテンプレートエンジンです。

https://assetstore.unity.com/packages/templates/systems/topdown-engine-89636?aid=1011l8zf9&utm_source=aff

有名なアセットなのでご存じな方も多いと思います。

TopDown Engineについては、「[Unityアセット真夏のアドベントカレンダー2021](https://assetstore.info/eventandcontest/adventcalendar/summer-advent-calendar-2021/)」25日目、のぼるさんの記事でも紹介されるようです。

# MMFeedbacksとは？
![eefn4-e61ms.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/b206dbf5-3b84-4cc7-9641-f80d2ab2e22c.gif)
Corgi Engine/TopDown Engine内でゲームのフィードバックをジューシー（Juicy）にしているコア機能になります。Corgi Engine/TopDown Engine内のフィードバックは全てMMFeedbacksで実装されています。

MMFeedbacksはAssetStoreで単体でも販売されています。MMFeedbacksは最近バージョン2.0にメジャーアップデートされて、FEELという名前になっています。MMFeedbacks 2.0がFEELといえます。

https://assetstore.unity.com/packages/tools/particles-effects/feel-183370?aid=1011l8zf9&utm_source=aff

MMFeedbacksの最新版はCorgi Engine/TopDown Engineに同梱されているので、別途FEELを買う必要はありません。

FEELは以下の４つで構成されています。

- MMFeedbacks
- MMTools
- 20個のデモ
- Nice Vibrationsというアセット

MMFeedbacksとMMToolsはCorgi Engine/TopDown Engineに含まれているので、既にCorgi Engine/TopDown Engineのいずれかを所持している人は20個のデモもしくはNice Vibrationsが欲しいときのみFEELを購入するといいでしょう。

ちなみに、Nice Vibrations は PC、コンソール、iPhone、Android ゲームに振動とハプティックフィードバックを追加するためのシンプルかつパワフルなソリューションです。これも単独で販売されています。

https://assetstore.unity.com/packages/tools/integration/nice-vibrations-haptic-feedback-for-mobile-gamepads-108559?aid=1011l8zf9&utm_source=aff

以上、説明してきたFEELですが「[Unityアセット真夏のアドベントカレンダー2021](https://assetstore.info/eventandcontest/adventcalendar/summer-advent-calendar-2021/)」21日目のxrdnkさんの記事でも紹介されるようです。より詳しくFEELについて知りたい人は是非チェックしてみてください。


# MMFeedbacksを体験する

↓のページにデモがあります。

https://feel-docs.moremountains.com/demos.html#mmfeedbacks

↑のデモには３Dを用いたものもあり2Dプラットフォーマー、TopDownゲーム以外にも様々な用途で活用可能であることが分かります。これらのデモはFEELのアセット内にあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/ab32fb16-738b-3a88-5e8a-5e533ea0be62.png)
↑このデモは特別にCorgi Engine/TopDown Engineにも含まれています。

# MMFeedbacksを使ってみる

では、実際にMMFeedbacksを使ってみたいと思います。

今回はCorgi Engineに同梱のMMFeedbacksを使ってみたいと思います。TopDown Engineに同梱のMMFeedbacksでも、FEELに同梱のMMFeedbacksでも同じことができます。

まずはCorgi Engine内のアセットをMMFeedbacksとMMToolsだけを残し他のアセットを削除してみます。これでMMFeedbacksだけで動作することが分かると思います。MMToolsは、More Moutainsのアセットを支えるユーティリティツール群なので残しておきます。

Packagesも図示しておきます。CinemachineやPostProcessingは、MMFeedbacks内で使うことがあるのでインストールしておいたほうがいいでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/602dd955-269d-7821-dd02-976d0e667c3b.png)
MMFeedbacksフォルダ内のシーンSequencerDemoを見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/6798e04d-ade2-a3c0-7066-a4bdc38d556d.png)
このシーンでは、下図のように立方体がスタイリッシュにジャンプ＋回転＋音＋テクスチャ変更するサンプルが含まれています。
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/f273afdc-4701-d41c-4dde-fcc4d2aabe21.gif)

このジャンプ＋回転＋音＋テクスチャ変更のフィードバック内容は、ゲームオブジェクトMMFeedbacks1にアタッチされているMMFeedbacksというスクリプトに記載されています。

このMMFeedbacksにはPosition、Rotation、Note Sound、Material、Chromatic Aberration ... などのフィードバックがすでに追加されています。Positionは移動フィードバック、Rotationは回転フィードバック、Chromatic Aberrationはポストプロセッシングのフィードバックなどです。これらのフィードバックを右側の数字のタイミングで順次再生することでジューシーな見た目にします。

スクリプトの下にはフィードバックを随時再生して確認できるように再生ボタンが備わっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/18757b72-0f8a-54a6-86a8-b12e3730546a.png)

では、MMFeedbacks内の各種フィードバックの中のPositionフィードバックについて見てみます。

Active, Label, Chance, Timingまでが全Feedback共通の設定項目です。 

 - Active： このフィードバックを実行するかをOn/Offで設定します。一時的にフィードバックをオフにしたいときに便利です。
 - Label：このフィードバックの名前を設定します。わかりやすい名前を付けましょう。
 - Chance：このフィードバックを一定の確率で実行したい場合に設定します。常に実行したい場合は100%にしておきましょう。
 - Timing：フィードバックを実行するタイミングをここで調整します。ここの調整がフィードバックのジューシーさに影響するのでしっかり設定しましょう。（Timingの設定詳細は割愛します。タイミングの調整はInitial Delayで調整します。）

Timingより下の設定項目は各フィードバック固有の設定項目です。Positionでれば物体をどう動かすか、Materialであればどのようなマテリアルを物体に適用するかなどを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/53e2fa7e-333b-f195-df64-bfd68d761459.png)


次に、MMFeedbacks内のSettingsの項目を見てみます。このSettingsではMMFeedbacks全体の設定を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/2c767bbf-1c3d-789a-e8c9-1a0f3a5d1936.png)

 - Initialization > Safe Mode
    - MMFeedbacksが内部的に行っているSerializationのエラーチェックをいつ行うかを表します。Fullが推奨されています。
    
 - Initialization > Initialization Mode
    - Runtime時の初期化をいつ行うかを表します。Awake実行時、Start実行時、Scriptでの3パターンがあります。Scriptを選ぶと自分で初期化する必要があります。

 - Initialization > Auto Play On Start
    - Start実行時にフィードバックを発動させたい場合にオンにします。

 - Initialization > Auto Play On Enable
    - OnEnable実行時にフィードバックを発動させたい場合にオンにします。

 - Direction > Direction
    - 実行方向を指定します。上から下へ（Top To Bottom）、下から上へ（Bottom To Top）の2種類あります。

 - Direction > Auto Change Direction On End
    - チェックを入れると実行ごとに実行方向が入れ替わります。（Top To Bottom ←→　Bottom To Top）

 - Intensitiy > Feedbacks Intensity
    - フィードバック全体の強さを調整します。強さの概念がないフィードバックや強さの意味合いが意図するものと違ったりするので使えないこともあります。

 - Timing > Duration Multiplier
    - フィードバック全体の時間をスケールします。2を指定すると通常の2倍の時間をかけてフィードバックを実行します（スローになります）。
  
 - Timing > Full Duration Details  
    - チェックを入れると、Durationの情報表示がより詳細に表示されます。Delay時間＋再生時間など分かれて表示されます。

 - Timing > Cooldown Duration
    - フィードバック全体が実行された後に、再度実行可能になるまでの時間を設定します。

 - Timing > Initial Delay
    - フィードバック全体を遅延実行するときの遅延時間を設定します。

 - Events > Trigger MM Feedbacks Events
    - チェックを入れると、MMFeedbacksEventsを使ったEvent処理を追加できます。MMFeedbacksEventsはデリゲートベースのEvent処理を提供しています。詳しくはMMFeedbacksEvents.csを参照してください。

 - Events > Trigger Unity Events
    - チェックを入れると、フィードバック実行時にUnityイベントが設定されていれば実行します。チェック項目の下にOnPlay()、OnPause()、OnResume()、OnRevert()、OnComplete()のUnityEventが用意されています。ここにUnityEventを設定すれば実行されます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/28b15e97-b7a9-a95d-ec3a-8d28f89ec5f7.png)


# MMFeedbacksのフィードバックリスト

MMFeedbacksには100以上のフィードバックが既に備わっています。どのようなフィードバックが利用可能なのかは↓のページをご確認ください。

https://feel-docs.moremountains.com/list_mmfeedbacks.html

# MMFeedbacksをスクリプトから実行する

MMFeedbacksをスクリプトから実行するには、MMFeedbacksの関数PlayFeedbacks()を実行するだけです。

以下の様なコードを書くことで実行可能です。

```c#:MMFeedbacksTest.cs
using UnityEngine;
using MoreMountains.Feedbacks;

public class MMFeedbacksTest : MonoBehaviour
{
    [SerializeField]
    private MMFeedbacks mmFeedbacks;
    
    public void Test()
    {
        mmFeedbacks.PlayFeedbacks();
    }
}
```

# MMFeedbackの機能を自作する

自分が作った機能や他のアセットをMMFeedbacksに組み込みたいということもあるでしょう。そのような場合は自分でMMFeedbackを自作します。

MMFeedbackの自作はとても簡単です。MMFeedbackを継承したクラスを作り（**MMFeedbacksでないことに注意。sはつけない**）、必要な関数をオーバーライドすればいいだけです。

```c#:qiita.rb
using UnityEngine;
using MoreMountains.Feedbacks;

[AddComponentMenu("")]
[FeedbackPath("ChosenPath/MyFeedbackNameGoesHere")]
public class MMFeedbackMyFeedbackNameGoesHere : MMFeedback
{
    // declare your variables here
    // TODO:ここにフィードバックに必要な変数を定義する

    protected override void CustomInitialization(GameObject owner)
    {
        base.CustomInitialization(owner);
        if (Active)
        {
            // Put custom initialization code here
            // TODO:ここにフィードバックの初期化コードを書く
        }
    }

    protected override void CustomPlayFeedback(Vector3 position, float attenuation = 1.0f)
    {
        if (Active)
        {
            // Put custom play code here
            // ここにフィードバックの実行内容を書く
        }
    }

    protected override void CustomStopFeedback(Vector3 position, float attenuation = 1)
    {
        base.CustomStopFeedback(position, attenuation);
        if (Active)
        {
            // Put custom stop code here
            // ここにフィードバックが停止した時のコードを書く
        }
    }

    protected override void CustomReset()
    {
        base.CustomReset();
        if (Active)
        {
            // Put custom reset code here
            // ここにフィードバックをリセットした時のコードを書く
            // リセットはフィードバックをPlayした直後に呼ばれるようです
        }
    }
}
```

# まとめ

というわけでCorgi Engine/TopDown Engineに同梱されているMMFeedbacksというアセットについて解説してみました。

Corgi EngineやTopDown Engineを持っているけどまだ使ってないという方でも、MMFeedbacksだけでも3Dのプロジェクト等のどんなプロジェクトでも活用できますので是非使ってみてください！

「[Unity アセット真夏のアドベントカレンダー 2021 Summer!](https://assetstore.info/eventandcontest/adventcalendar/summer-advent-calendar-2021/) 」明日はたなかゆうさんによる「Voxel ImporterでMagicaVoxelのボクセルを読み込んで透過させたり光らせたり」です。