TATIKUNLOG.

主にゲーム作りについて書き留めるブログ。

【Feel】UniTaskでFeedBackの終了を待つ拡張メソッド【Unity】


PR

FeelとUniTaskを併用する機会があった場合に便利そうなので書きました。

Feelに搭載されている機能を活用すれば、必要ない可能性もありますが……

この記事で紹介しているアセットのリンク

Feel

Feel

環境

  • Unity2022.3.2f1
  • Feel 3.12
  • UniTask 2.3.3

コード

using UnityEngine;
using MoreMountains.Feedbacks;
using Cysharp.Threading.Tasks;
using System.Threading;

static class FeelUniTaskExtensions
{
    public static async UniTask PlayFeedbacksUniTask(this MMFeedbacks feedbacks,Vector3 position,float feedbacksIntensity = 1.0f, 
        bool forceRevert = false, PlayerLoopTiming timing = PlayerLoopTiming.Update,CancellationToken ctn = default(CancellationToken))
    {
        feedbacks.PlayFeedbacks(position, feedbacksIntensity, forceRevert);

        await UniTask.WaitUntil(() => feedbacks.IsPlaying,timing,ctn);

        while (feedbacks.IsPlaying && !ctn.IsCancellationRequested)
        {
            await UniTask.Yield(timing,ctn);
        }
        return;
    }
}

FeelUniTaskExtensions.cs」というスクリプトを作成して、上記コードで上書きすれば使えるようになります。

何が原因なのかわからないんですが、FeedBacksを実行した直後は IsPlaying が true にならなかったので、一度trueになるまで待つ処理を挟んでいます。

実行テスト

テストコード

3つのCubeそれぞれにスケールを変化させるFeedBackをアタッチしておいて、それを順に実行するテストをしました。

使用したスクリプトは以下のものになります。

using UnityEngine;
using Cysharp.Threading.Tasks;
using MoreMountains.Feedbacks;

public class NewBehaviourScript : MonoBehaviour
{
    [SerializeField] MMFeedbacks[] MMPlayers = new MMFeedbacks[3];
    // Start is called before the first frame update
    async void Start()
    {
        await BoxScaleTest();
    }

    async UniTask BoxScaleTest()
    {
        var tkn = this.GetCancellationTokenOnDestroy();
        await MMPlayers[0].PlayFeedbacksUniTask(transform.position, 1, false, ctn: tkn);
        Debug.Log("0");
        await MMPlayers[1].PlayFeedbacksUniTask(transform.position, 1, false, ctn: tkn);
        Debug.Log("1");
        await MMPlayers[2].PlayFeedbacksUniTask(transform.position, 1, false, ctn: tkn);
        Debug.Log("2");
        await UniTask.Yield();
    }
}

実行結果

FeedBacksを順に実行するテスト

実際に順に実行されるのが確認できました。

それぞれのスケール変化のアニメが終了したと同時に、コンソールにメッセージが表示できています。

終わりに

とりあえずで作ったものなので、実際のプロジェクトで使った際にどうなるかは確認していません。

何か問題等あったらコメント等をいただけると幸いです。