テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】Animatorで動かすオブジェクトをスクリプトでも動かす際の注意

f:id:tsubaki_t1:20160809002457g:plain

少し面白い挙動について調査したので、メモ。

(前提)モデルにスクリプトで回転を加える

単純にモデルに回転を加えたい時、下の様なコードを記述すれば回ります。現在のローテーションに加算して回転を加えている訳です。

using UnityEngine;
using System.Collections;

public class Rotation : MonoBehaviour {

	void LateUpdate () 
	{
		transform.rotation *= Quaternion.AngleAxis (2, Vector3.up);
	}
}

f:id:tsubaki_t1:20160809003018g:plain

(前提)さらに色を変えるのみのアニメーションを加える

上記の回転してるオブジェクトに色を変更するアニメーション「Color」を追加します。Colorには座標を移動する系のカーブは持たせません。

f:id:tsubaki_t1:20160809003447j:plain

f:id:tsubaki_t1:20160809003453j:plain

これを設定すると、回転しながら色が変わるようになります。

f:id:tsubaki_t1:20160809002457g:plain

(問題)回転を設定したアニメーションを加えると動かなくなる

上記の回転しつつ色が変わるオブジェクトに、回転するアニメーションを「Rotation」を加えます。想定としては、基本的にはアニメーションで動いてもらい、必要な時にはスクリプトで制御する流れです。

f:id:tsubaki_t1:20160809004139j:plain

f:id:tsubaki_t1:20160809004130j:plain

「Rotation」のアニメーションを追加すると、Colorアニメーションを再生している時でもスクリプトによる回転が効かなくなります。

f:id:tsubaki_t1:20160809004343g:plain

位置が変化するアニメーションが設定されているという事

今回の問題は「Rotation」アニメーションに位置や回転を変化させるアニメーションが設定されていたという事がトリガーになっているみたいです。

アニメーションで動くオブジェクトは、基本的に該当の角度・位置へ毎フレーム再設定しています。

Mecanimの場合は面倒くさいことに、AnimationControllerの中にrotationもしくはpositionを動かしているカーブが含まれている場合、今回作成したColorのような「回転処理を設定していないアニメーション」に対しても「初期値に戻すアニメーション」を設定するみたいです。

アニメーションしているのがRootMotionの場合、回転や位置調整を設定したアニメーションクリップが含まれていると「Root position or rotation are controlled by curves」という表示がAnimatorに加わります。

f:id:tsubaki_t1:20160809005524j:plain

ただ、RootMotoin以外でアニメーションしている場合はこの表示が加えられないので注意が必要です。

 

例えば2Dゲームで一部カットシーン的に動かしたりする場合に時々起こるんじゃないかなと思わなくもないので、その辺り注意する必要があるかもしれません。

f:id:tsubaki_t1:20160809013146g:plain

回転しなくなる現象の対策

対策ですが、「初期値に戻すアニメーションが必ず効いている」事を前提にスクリプト自体を少し考え直せば良いです。
但し「アニメーションで動かしていない」部分は加算すると大参事になるかもしれないので、注意が必要です。再設定の現象が起こるのは、あくまでAnimationで設定しているパラメータです。

using UnityEngine;
using System.Collections;

public class Rotation : MonoBehaviour {

	Quaternion r = Quaternion.identity;

	void LateUpdate () 
	{
		r *= Quaternion.AngleAxis (2, Vector3.up);
		transform.rotation*= r;
	}
}

 他には、アニメーションしているのがroot motoinの場合、Apply Root Motoinにチェックを入れた場合「初期位置に戻す処理」が設定されなくなったような気がします。また、良いのか悪いのか判断に迷いますが、Animationコンポーネントではこういった事は起こりませんでした。

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp