UnityアセットのFeelを使用して神経衰弱ゲームを制作していた時に、めくったカードを戻すためにMMF_PlayerのPlayFeedbacksInReverse()機能を使用しました。
問題なく逆再生はされたものの、その後Playfeedbacks()で実行すると常に逆再生されるようになってしまったのです。
今回この記事では、その時の対処法について紹介します。
動画
今回の内容をまとめた動画を作りました。
動作確認やBGMとしてお使いください。
FeelでスクリプトからPlayFeedbacksInReverse()を使用
最初、以下のようなソースでScaleの値が「-1の場合は通常再生」「-1以外の時は逆再生」という形で実装していました。
// カードめくりFeedback [SerializeField] MMF_Player Flip_Feedback; /// カードをクリックしたときの処理 public void OnClickCard() { if(gameObject.transform.localScale.x == -1) { // 裏面の時は通常再生 Flip_Feedback.PlayFeedbacks(); } else { // おもて表示の時は逆再生 Flip_Feedback.PlayFeedbacksInReverse(); } }
この実装では、PlayFeedbacksInReverse()が実行された以降、通常呼び出しのPlayFeedbacks()実行時は常に逆再生になってしまいました。
Feelの自動切り替え機能を使用する
Feedbackの通常再生・逆順再生を自動で交互に行う自動切り替え機能がFMM_Playerの設定に用意されています。
Feedbackを設定しているオブジェクトを開き「Auto Change Direction On End」のチェックボックスをオンにすると自動で切り替わるようになります。
ソースは呼び出しだけを行うようにします。
public void OnClickCard() { // 再生 Flip_Feedback.PlayFeedbacks(); }
これで交互に実行されるようになります。
私の場合、Prefab化しているカードを生成して複数同時にひっくり返すという処理を行ったところ、この方法ではおかしな挙動になってしまいました。
そのため、次の方法で対処することとなりました。
スクリプトで再生順序を直接設定
スクリプトでFeedbackのDirectionの値を直接設定できます。
以下のソースは、現在の再生順序の値を見て「逆順再生だったら通常再生に」「通常再生だったら逆順再生に」なるよう設定しています。
public void OnClickCard() { // 再生順をチェックする if (Flip_Feedback.Direction == MMFeedbacks.Directions.BottomToTop) { // 逆再生の設定になっている時は通常再生に変更 Flip_Feedback.Direction = MMFeedbacks.Directions.TopToBottom; } else { // 通常再生時の設定になっている時は逆再生に変更 Flip_Feedback.Direction = MMFeedbacks.Directions.BottomToTop; } // 再生 Flip_Feedback.PlayFeedbacks(); }
実行順序の値を見てるため、最初の動作が通常再生になるようFeedbackのDirectionを逆順に設定しておく必要があります。
Scaleの値を見て実行順序を切り替える以下のソースのほうが良いかもしれません。
public void OnClickCard() { // 再生順をチェックする if (gameObject.transform.localScale.x == -1) { // 裏面状態の時は通常再生 Flip_Feedback.Direction = MMFeedbacks.Directions.TopToBottom; } else { // 表面状態の時は逆再生 Flip_Feedback.Direction = MMFeedbacks.Directions.BottomToTop; } // 再生 Flip_Feedback.PlayFeedbacks(); }
さいごに
今回は、UnityアセットFeelでPlayFeedbacksInReverse()を使用して実行したあと常に逆再生するため、その対処法を紹介しました。
今回紹介した以外にも良い対処法があるかもしれません。良い方法があれば教えて頂けると嬉しいです!
コメント