説明
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();
}
}