Raspberlyのブログ

Raspberlyのブログ

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

【アセット紹介】Feel で演出を作る【Unity】

今回はアセットの紹介をしていきます。
紹介するのはFeel
ゲームにおける演出を実装し、よりよいゲーム体験を作り出せるアセットです。

f:id:Raspberly:20210610035853p:plain

f:id:Raspberly:20210610034011p:plain

パブリッシャーはCorgi EngineTopDown EngineでおなじみのMore Mountainsさんです。

 

 

お得なセール情報

現在アセットストアでは、2021年上半期にリリースされた新作アセットのセールが開催中!

f:id:Raspberly:20210610010428p:plain

今回紹介する「Feel」もセール対象アセットです。
詳しくは上のバナーからどうぞ。

 

※この記事にはgifが多く含まれています

 

 

どんなアセット?

一言でいうと「ゲームの感触を向上させるアセット」です。

f:id:Raspberly:20210610033534g:plain

プレイヤーのアクションに合わせて、エフェクトや音が出たり画面が揺れたりオブジェクトが動いたり、
演出が発生するだけでゲームの見栄えや体験の質が大きく向上しますよね。
Feelを使うとそれらの演出が簡単に実装できます

Feelは、オンデマンドのゲーム感覚を Unity ゲームに提供するための、すぐに使用できるソリューションであり、できるだけ摩擦やセットアップを最小限に抑えます。これはモジュール式でユーザー フレンドリーで、非常に簡単に拡張できるシステムです。

演出のことをFeelではフィードバックと表現しています。

 

 

 公式Webサイトはこちら

feel.moremountains.com

 

 

 

開発環境

・Unity 2020.3.0f1

・Feel Ver2.2

 

以下のパッケージは必須ではないがFeelを最大限発揮するために必要なものです

・2D Animation ver3.2.9

・Cinemachine ver2.6.5

・PostProcessing ver3.0.3

・TextMeshPro ver2.1.6

 

 

 

 

インポートの確認

インポート

Feelは、Animation 2DCinemachinePostProcessingTextMesh Proがあると最大限の力を発揮します。
UPMからインストールしておきましょう。(Animation 2Dは一部デモでのみ使われる)

 

 

アセットインポート完了時はこんな感じです。

f:id:Raspberly:20210610013433p:plain

  • FeelDemosは、多くのデモを含むフォルダーであり、それぞれが独自のフォルダーとサブフォルダーに含まれています。これらのデモでは、Feel のさまざまな機能を紹介しています。詳細については、ドキュメントのデモ セクションをご覧ください。
  • MMFeedbacksは、アセットの主要部分です。これには、MMFeedbacks システム、すべてのフィードバック、およびデモ シーンが含まれています。MMFeedbacks を使用する場合に保持する必要がある唯一の必須フォルダーです。その中の Demos フォルダーを安全に削除できます。
  • MMTools : MMTools は、さまざまな便利なツールが詰まった素晴らしいライブラリで、アセットに含めると良いと思いました。驚きが満載です。
  • NiceVibrations : Feel にギフトとして含まれています。Nice Vibrationsは、iOS または Android ゲームに触覚フィードバックを追加するための最良の方法です。専用の Web サイトで詳細を確認できます。

 

デモシーンの確認

デモシーンはAssets/Feel/FeelDemosにあります。
(URPとHDRPでデモを開く場合、一部レンダリングがおかしくなることがあるそうです)

f:id:Raspberly:20210610013457p:plain

様々なゲームを想定したデモシーンが用意されていて、演出の参考になりますね。
フィードバックの具体的な設定方法も参照できます。 

f:id:Raspberly:20210610015839g:plain

f:id:Raspberly:20210610020226g:plain

f:id:Raspberly:20210610020332g:plain

エフェクトなど素材も豊富なのでいろいろ活用できそうです。

 

 

フィードバックの確認

Assets/Feel/MMFeedbacks/Demos/MMFeedbacksDemoにフィードバックの動作確認が行えるシーンがあります。

f:id:Raspberly:20210610015310p:plain



 

 

 

 

実際に試してみる

チュートリアルに従ってこの「Cubeがぴょんぴょんジャンプするシーン」にFeelで演出をつけていきます。

f:id:Raspberly:20210610023431g:plain

※細かいセッティングは割愛します

ステージとプレイヤーの作成

ステージとしてPlaneを配置します。

f:id:Raspberly:20210610021057p:plain

プレイヤーとしてCubeを配置します。
CubeにはRigidbodyと以下のFeelPlayerコンポーネントをアタッチします。

using UnityEngine;
using MoreMountains.Feedbacks;

public class FeelPlayer : MonoBehaviour
{
    public KeyCode actionKey = KeyCode.Space;
    public float jumpForce = 8f;
    public MMFeedbacks jumpFeedback;
    public MMFeedbacks landingFeedback;

    private Rigidbody rb;
    private bool isJump;

    void Start()
    {
        rb = gameObject.GetComponent<Rigidbody>();
    }

    void Update()
    {
        if (Input.GetKeyDown(actionKey) && !isJump)
        {
            Jump();
        }
    }

    private void Jump()
    {
        rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        isJump = true;
        jumpFeedback?.PlayFeedbacks();
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (!isJump) return;
        isJump = false;
        landingFeedback?.PlayFeedbacks();
    }
}

フィードバックが設定されている場合PlayFeedbacksで再生します。

 

さらにSkyboxを適用なものに変えておきます。Feel付属のSkyboxがいくつかあるのでオススメです。

ゲームを再生してスペースキーを押すとCubeがぴょんぴょんジャンプします。

f:id:Raspberly:20210610023431g:plain

まだ何もフィードバックがないので演出はありません。

 

 

Cameraの設定

CinemachineとPostProcessingの設定をします。

Cinemachine

Cinemachine/Create Virtual CameraでVirtual Cameraを作成します。

f:id:Raspberly:20210610021621p:plain

PostProcessing

3D Object/Post-process VolumeでPost-process Volumeを作成します。

f:id:Raspberly:20210610021647p:plain


isGlobalにチェックを入れ新しいプロファイルを作成、Vignetteなどいくつかエフェクトを追加します。

f:id:Raspberly:20210610021923p:plain

 

Main CameraオブジェクトにPost-process Layerコンポーネントをアタッチし、
LayerをEverytingにします。

f:id:Raspberly:20210610022102p:plain

 

フィードバックの作成

ここからがメインです。
このCubeにフィードバックを追加し演出をつけていきます。

 

Cubeの子オブジェクトとして空のGameObjectを2つ作成し
名前を「JumpFeedback」と「LandingFeedback」にMMFeedbacksコンポーネントをアタッチします。
それぞれジャンプした時・着地した時に呼ばれるフィードバックです。

f:id:Raspberly:20210610022224p:plain

作成したフィードバックはCubeのFeelPlayerコンポーネントに紐づけます。

f:id:Raspberly:20210610022243p:plain

 

フィードバックの追加

最初はシンプルにジャンプした時Cubeを回転させてみます。
JumpFeedbackオブジェクトのMMFeedbackコンポーネントを編集します。
MMFeedbacksのAdd new feedback...からTransform/Rotationを選択。

f:id:Raspberly:20210610022316p:plain

 

Rotation Targetに親のCubeを指定して、Animate Rotation Durationを1に
AnimateをXだけにしCurveを変更します。

f:id:Raspberly:20210610022701p:plain

 

この状態でゲームを再生しジャンプさせるとクルクル回転します。

f:id:Raspberly:20210610023343g:plain

 

 

フィードバックを追加2

もっと演出を追加してみます
JumdFeedbackに続けてフィードバックを追加します

音を出す

Audio/Soundフィードバックを追加、MethodをChachedにしSfxにオーディオファイルを紐づけます。

f:id:Raspberly:20210610023321p:plain

スローモーションにする

Time/Timescale Modifierフィードバックを追加。
Initial Delayを0.5にし少し遅れてスローモーションに入るようにします。
Time Scaleを0.1、Time Scale Durationを1.2にします。

f:id:Raspberly:20210610023645p:plain

最後にJumpFeedbackオブジェクトにMMTimeManagerをアタッチして完成です。
(Timeに関するフェードバックを使うときに必須のコンポーネントです)

f:id:Raspberly:20210610023747p:plain

これでジャンプして0.5秒後に1.2秒間Timescaleが0.1になります。

f:id:Raspberly:20210610024117g:plain

 

 

 

フィードバックを追加(着地時)

次は着地時の演出を追加します
LandingFeedbackオブジェクトのMMFeedbackコンポーネントを編集します

画面をゆらす

Camera/Cinemachine Impulseフィードバックを追加。
Raw Signalの右側にある歯車ボタンからPresets/6D Shakeを選択。

f:id:Raspberly:20210610024224p:plain

一番下のVelocityを2に。

f:id:Raspberly:20210610024439p:plain

 

 

最後にCinemachineの設定を変えます。
Virtual CameraのCinemachineVirtualCameraコンポーネントのExtensionsに
Cinemachine Impulse LintenerをAddします。

f:id:Raspberly:20210610024302p:plain

 

これで画面がゆれる演出ができました

f:id:Raspberly:20210610025152g:plain

 

 

Lens Distortionをつける

PostProcess/Lens Distortionフィードバックを追加
Remap Intensity Oneを50にします

f:id:Raspberly:20210610024800p:plain


Post-process VolumeのあるオブジェクトにMMLensDistortionShakerコンポーネントをアタッチ
(Lens Distortionを使うときに必須のコンポーネントです)

f:id:Raspberly:20210610024922p:plain

 

これでカメラが歪む演出ができました

f:id:Raspberly:20210610025247g:plain

 

 

Color Gradingをつける

PostProcess/Color Gradingフィードバックを追加
Shake Durationを0.3にします

f:id:Raspberly:20210610030805p:plain


Post-process VolumeのあるオブジェクトにMMColorGradingShakerコンポーネントをアタッチ
(Color Gradingを使うときに必須のコンポーネントです)

f:id:Raspberly:20210610025454p:plain

 

これでカメラの色彩を一瞬だけ変更する演出ができました(画面の点滅に注意)

f:id:Raspberly:20210610031424g:plain

 

 

 

パーティクルを出す

Particles/Particles Playフィードバックを追加。
Bound Particle Systemに再生したいParticle Systemを紐づけます。
(パーティクルは適当に、いいのがなければFeelに付属しているやつで代用)

f:id:Raspberly:20210610030242p:plain

 

これでパーティクルが再生されます

f:id:Raspberly:20210610030849g:plain

 

 

ライトを出す

Lightフィードバックを追加。
Cubeの接地あたりにPoint Lightを作成し、Bound Lightに紐づけます。

f:id:Raspberly:20210610031206p:plain

PointLightの色を上書きされたくない場合はModify Colorのチェックを外します。

 

これでライトを一瞬灯す演出ができました

f:id:Raspberly:20210610031639g:plain

 

 

 

完成

ここまで追加したフィードバックを全て使うとこうなります。
かなり見栄えがよくなりましたね。

f:id:Raspberly:20210610032245g:plain

 

 

 

 

デバッグ方法

このアセットの便利な機能にデバッグ機能があります。
これはInspectorのMMFeedbackからPlayボタンを押すことでそのフィードバックを即座に確認できる機能です。

f:id:Raspberly:20210610032752p:plain

ジャンプする時の演出を確認したい時に毎回ジャンプする必要はないわけです。
フィードバック個別に再生もできます。

 

 

 

 

 

まとめ

今回Cubeに演出をつけてみましたが、これらの演出はFeelでなくても実装はできます。
音を鳴らすならAudioSource.PlayOneShotを、エフェクトを再生したいならParticleSystem.Playを、
何か動かしたいならTween系ライブラリをインポートしScriptに記述すればいいわけです。


Feelの利点はこれらの演出を簡単に実装でき、Scriptを変えることなくパラメータの修正ができることです
デバッグ機能やドキュメントも充実しているためオススメのアセットです。

 

現在アセットストアの人気ランキング第1位!
その汎用性の高さからめちゃくちゃ流行りそうな予感がします!

 

ちょっとの時間でこんなきれいな演出が作れちゃうのはとっても便利!

f:id:Raspberly:20210610033534g:plain

 

 

 

 

余談

通常価格44ドル、セール価格で22ドルのアセットですが、
私の場合63%OFFの16.50ドルで購入できました。

f:id:Raspberly:20210610015459p:plain

理由は不明ですがTopdown Engineを購入済みのためパブリッシャーのおまけでさらに安くなったのかも。
Corgi EngineやTopdown Engineを購入済みの方はストアページを確認してみてね!

 

 

 

 

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

raspberly.hateblo.jp

 

 

 

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

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