FeelとUniTaskを併用する機会があった場合に便利そうなので書きました。
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(); } }
実行結果
実際に順に実行されるのが確認できました。
それぞれのスケール変化のアニメが終了したと同時に、コンソールにメッセージが表示できています。
終わりに
とりあえずで作ったものなので、実際のプロジェクトで使った際にどうなるかは確認していません。
何か問題等あったらコメント等をいただけると幸いです。