LoginSignup
0
2

More than 5 years have passed since last update.

MMD4Mecanimでインポートしたモデルのアニメーション、音声を一時停止する方法

Last updated at Posted at 2018-07-11

説明

MMD4Mecanimでインポートしたモデルのアニメーション、音声、Morph(口パクや表情)を止める方法はそれぞれ異なる。
それぞれ、以下のような方法で一時停止と再開が行える。
特にmmd4MecanimModel.animSyncToAudio=trueの状態だと、animator.speedを0に設定してもアニメーションが止まらないことには注意が必要である。

2018.07.15 最初からもういちど再生するためのRestart()を追加。

環境: Unity 2018.1.5f1 (64-bit) / OculusUtilities(1.26.0 2018/06/20) / MMD4Mecanim(2018/05/23)

コード

public class PauseController : MonoBehaviour {
    [SerializeField] GameObject _charactor;
    private MMD4MecanimModel _mmd4 = null;
    private MMD4MecanimAnimMorphHelper _morph = null;
    private Animator _animator = null;
    private AudioSource _audio = null;
    private uTools.BlendShapeBlink _blink = null;

    private bool _isPaused = false;

    void Update () {
        if (MyOVRUtil.GetDown(OVRInput.Button.Back)) {
            _isPaused = !_isPaused;
            SetPause(_isPaused);
        }
        _mmd4     = _charactor.GetComponent<MMD4MecanimModel>();
        _morph    = _charactor.GetComponent<MMD4MecanimAnimMorphHelper>();
        _animator = _charactor.GetComponent<Animator>();
        _blink    = _charactor.GetComponent<uTools.BlendShapeBlink>();
        _audio    = _charactor.GetComponent<AudioSource>();
    }

    void SetPause(bool isPaused) {
        _isPaused = isPaused;

        if (isPaused) {
            // 一時停止
            if (_mmd4     != null) _mmd4.animSyncToAudio = false;   // これがないとspeed=0fにしても止まらない
            if (_mmd4     != null) _mmd4.animEnabled = false;       // これがないと表情がリセットされる。これがあると音声がリセットされる場合あり?その場合animタブに音声を設定しないことで対策できる。
            if (_morph    != null) _morph.enabled = false;
            if (_animator != null) _animator.speed = 0f;
            if (_blink    != null) _blink.enabled = false;
            if (_audio    != null) _audio.Pause();
        } else {
            // 一時停止解除
            if (_mmd4     != null) _mmd4.animSyncToAudio = true;
            if (_mmd4     != null) _mmd4.animEnabled = true;
            if (_morph    != null) _morph.enabled = true;
            if (_animator != null) _animator.speed = 1f;
            if (_blink    != null) _blink.enabled = true;
            if (_audio    != null) _audio.UnPause();
        }
    }

    public void Restart() {
        SetPause(false);

        if (_morph != null) {
            var animName = _morph.playingAnimName;
            _morph.PlayAnim(animName);
        }

        AnimatorStateInfo stateInfo = _animator.GetCurrentAnimatorStateInfo(0);
        _animator.Play(stateInfo.fullPathHash, 0, 0f);

        _audio.Play();
    }
}
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2