強火で進め

このブログではプログラム関連の記事を中心に書いてます。

Unity 4.1 で追加されたMecanimのアニメーションの録画/再生機能を使ってみました


こちらのUnity公式のMecanimのサンプルの一部を変更して試してみました。

Animator Controller というシーンを開き、 U_Character_REF という Prefab に設定してある AnimatorController_UI.cs を以下の様に変更すると動画の様なテストが行えます。

using UnityEngine;
using System.Collections;

public class AnimatorController_UI : MonoBehaviour {
	Animator animator;
	bool playbackFlag = false;
	
	void Start ()
	{
		animator = gameObject.GetComponent<Animator> ();
		Debug.Log(animator);
	}
	
	void OnGUI ()
	{
		if (GUI.Button (new Rect (5, 5, 100, 50), "StartRecording")) {
			animator.StartRecording (1000);
			Debug.Log ("**StartRecording");
		}
		
		if (GUI.Button (new Rect (110, 5, 100, 50), "StopRecording")) {
			animator.StopRecording ();
			Debug.Log ("**StopRecording");
			Debug.Log ("recorderStartTime:" + animator.recorderStartTime);
			Debug.Log ("recorderStopTime:" + animator.recorderStopTime);
		}
		
		if (GUI.Button (new Rect (5, 80, 100, 50), "StartPlayback")) {
			playbackFlag = true;
			animator.StartPlayback ();
			animator.playbackTime = 0;
		}
		if (GUI.Button (new Rect (110, 80, 100, 50), "StopPlayback")) {
			playbackFlag = false;
			animator.StopPlayback ();
		}
	}
	
	void Update ()
	{
		if (playbackFlag) {
			float newPlaybackTime = animator.playbackTime + Time.deltaTime;
			if (newPlaybackTime > animator.recorderStopTime) {
				//newPlaybackTime = animator.recorderStopTime;  //  再生後に停止する場合
				newPlaybackTime = 0;  //  再生後に再度最初から再生する場合
			}
			animator.playbackTime = newPlaybackTime;
		}
	}
		
}

StartRecording でアニメーションを記録します。

function StartRecording (frameCount : int) : void 

frameCount に記録するフレーム数を指定。0を指定すると StopRecording() を実行するまで記録されます。

Unity Script Reference – Animator.StartRecording
http://docs.unity3d.com/Documentation/ScriptReference/Animator.StartRecording.html

録画が終わったら StartPlayback() を実行すれば再生されそうなイメージが有りますが再生されなくてちょっとだけハマりました。

ちゃんと再生するには StartPlayback() を実行した後に playbackTime の値を変更する必要が有るみたいです。

StartPlayback() はあくまで再生モード(playback mode)の切り替えを行うだけみたいです。

しかし、この処理は重要で StartPlayback() を実行する前に playbackTime を変更すると以下の様なWarningが発生しました。

Can't call SetPlaybackTime while not in playback mode. You must call StartPlayback before.

「 StartPlayback() を実行 → playbackTime を変更」が正しい順番の様です。

このAPI、録画したアニメーションをファイルに出力できたら色々と便利そうなのですが残念ながらその様なAPIは無いっぽいです。次のバージョンで追加されたりしないかなぁ?