#要約
UnityでOVRLipsyncを使い作ったBlendShapeのアニメーションをアニメーションクリップに変換するには、GameObjectRecorderクラスを使えばできます。
Unity - Scripting API: GameObjectRecorder
#はじめに
Unityでアニメーション作ろうと思った際に、口パク面倒だなーと思っていたら、OVRLipsyncという神ツールを見つけました。ですが、ほとんどインタラクティブに使う用途ばっかりで、そのアニメーションをアセットにしたくても方法が見つからない...と、そこに現れた救世主!
Unityユーザー助け合い所
質問したらソッコーで回答をくれました。本当にありがとうございます!
OVRLipsyncをunityに入れて音声データに合わせてBlendShapeの値が動く(口パクする)ように設定します。ここまでは他の記事を参考にしてみてください。
Unity - Scripting API: GameObjectRecorder
のページを参考にして下記のようにしたスクリプトを作ります。
using UnityEngine;
using UnityEditor.Animations;
public class RecordTransformHierarchy : MonoBehaviour {
public AnimationClip clip;
private GameObjectRecorder m_Recorder;
void Start()
{
// Create recorder and record the script GameObject.
m_Recorder = new GameObjectRecorder(gameObject);
// Bind all the Transforms on the GameObject and all its children.
m_Recorder.BindComponentsOfType<SkinnedMeshRenderer>(gameObject, false);
}
void LateUpdate()
{
if (clip == null)
return;
// Take a snapshot and record all the bindings values for this frame.
m_Recorder.TakeSnapshot(Time.deltaTime);
}
void OnDisable()
{
if (clip == null)
return;
if (m_Recorder.isRecording)
{
// Save the recorded session to the clip.
m_Recorder.SaveToClip(clip);
}
}
}
これをunityちゃんの表情のblendshapeがあるMTH_DEFに割り当てます。
また、空のクリップを作り、スクリプトのclipの欄に割り当てます。
次に、UnityちゃんにデフォルトでついているAnimator, Idle Changer, Face Updata, Auto Blinkのチェックを外してUnableにします。
この後、Playを押してStopすると、割り当てられたクリップにキーフレームがうたれます。この時、Pauseを押してからPlayを押して、Pauseを外して再生したほうがうまくいくと思います。下の図は失敗例。
しかし、アニメーションのキーフレームが打たれているところのプロパティが黄色くなって、このままでは使えません。
ので、新しいクリップを作り、手動でプロパティを追加して、先のクリップから対応するプロパティにキーフレームをコピペします。日本語の場合は、_A,_I,_U,_E,_Oのプロパティのキーフレームを移せばいいと思います。(先の画像と今回の画像で使っているアニメーションが違うのでキーフレームが対応していないです。)
その後、Animatorなどに今度はチェックをいれてableにして、音声と共に再生してみると口パクしているのがわかります。もし音声と口パクがずれていたら、Timelineなどを使い調節すると便利です。
#まとめ
面倒な部分を簡略化できると思いますが、現時点で私が口パクを作る頻度が高くないので更新はしないと思います。
もし、もっといい方法を思いついた方がいたら記事作ってください。私のためにもお願いします!(めんどくさがり)