見出し画像

ダンスゲーを作りたい#13 AnimationClipを段階的に再生するテスト

こんにちは

タイトル通り今回は、以前紹介したシステムの実現に向けて、

ボタンを一回おしたらアニメーションの所定位置まで再生する

という事がどの程度できるか、テストしていきたいと思います。

前回作ったデモモーションをセットアップしたものがこちら。

画像1

動くところまでは既に検証済みなので問題無いですね。

多少モーションが変なのはIKの設定とか諸々のせいなのでここではOK!

では途中で止めて、続きから再開出来るかどうか試していきましょう。

AnimationClipを区切って再生

今回の実装では、アニメーションとは別にどこまでを一区切りとするかを示すデータを作る必要がありそうです。

その辺の呼び出しとかは後で作るとして今回は何秒までで区切るかを書いた配列を用意しておきます。

処理の方針としては、

モーション開始側の処理は

・ボタンが押されたら、所定のモーションを再生
・前のボタンと同じボタンだったら次のステップの区切り時間から再生開始

モーション止める側の処理は

・Updateでモーションの経過時間を取得
・区切り時間が来たら一時停止

って感じです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Motion_manager : MonoBehaviour{
   UserData userdata;//データは最終的にはこれにまとめたい
   Animator animator;
   //テスト用のモーション開始トリガーの名前配列、実用時はどっかから呼び出す
   string[] MotionNameList = new string[] {"toprock","indean","roppo","cher"};
   //テスト用の区切り時間配列、実用時は(ry
   float[] timelist_toprock=new float[]{0f,14f/75f,31f/75f,51f/75f,65f/75f,1f};
   int lastBtNo=-1;
   int step=-1;
   void Start(){
       //呼び出し順の問題か、ここで呼んでもエラー吐く
       userdata=GetComponent<Userdata_manager>().userdata;
       animator=GetComponent<Model_manager>().model.GetComponent<Animator>();
   }
   public void setMotion(int BtNo){
       //仕方ないので毎回取得
       userdata=GetComponent<Userdata_manager>().userdata;
       animator=GetComponent<Model_manager>().model.GetComponent<Animator>();
       //前のボタンと同じ
       if(BtNo==lastBtNo){
           step+=1; //次のステップへ
           StopTime=timelist_toprock[step+1]; //次の停止時間
       }else{
           //別のボタン押された
           step=0; //一番最初のステップから開始
           lastBtNo=BtNo; //押されたボタンを記憶
           StopTime=timelist_toprock[step+1]; //次の停止時間
           animator.SetTrigger(MotionNameList[userdata.MotionSet[BtNo]]); //アニメーションを遷移
       }
       
       
       if(step<=5){ //雑に配列作ったのでOutOfBounds対策
       animator.Play("Base Layer", 0,timelist_toprock[step]); //所定のレイヤーのAnimationを区切り位置から開始
       animator.SetFloat("MoveSpeed", 1.0f); //再生速度を戻す
       }
       
       
   }
   float StopTime=2f; //停止時間の初期値時間は0-1なので初期モーションには反応しない
   string ClipName="アーマチュア|toprock"; //レイヤごとに時間拾うのでクリップ判別用
   // Update is called once per frame
   void Update(){
       //停止時間を超えるOR同じ かつ 求めてるClip
       if(animator.GetCurrentAnimatorStateInfo(0).normalizedTime>=StopTime && animator.GetCurrentAnimatorClipInfo(0)[0].clip.name==ClipName){
           animator.SetFloat("MoveSpeed", 0.0f); //一時停止
           
       }
   }
}

画像2

テストなので、いろいろハードコーディングしたりしちゃってますが、ちゃんとクリックごとに1ステップずつ進んでいます。

入力可能なのタイミングや、同じモーションを設定できるようにするか否かなど、検討の余地は多分にありますが、基本システムはばっちりです。

今日は満足。

明日歯医者に行って競プロやって寝ます。

おやすみなさい。




この記事が気に入ったらサポートをしてみませんか?