[事象]
Unity Ver 5.5.0f3 Personal (64bit)
Aniamtorでアニメーション中 スクリプトやRidibody等で位置Positionや回転Rotationをいじったとき
全体や特定の軸だけ動かなくなった現象に見舞われた。
[前提]
アニメーションの実装についてググった場合二通りの方法が見つかる。
※アニメーションした対象をAと呼ぶ。Aの親空オブジェクトをBと呼ぶ
1.B作成しこれにAnimatorを実装することで、
「親のオブジェクトが移動したとき子のオブジェクトもつられて移動すること」を利用して、
Bを基準としてAにアニメーションさせる方法
2.
Root Motionについての記事。
Bが存在しなくてもAにAnimatorを実装しRootMotionにチェックをいれると
Bを基準にしたようなアニメーションが出来るようになったという記事
[原因]
私は、2の記事を読み空オブジェクトをわざわざ作る必要が無くなったと誤解していたからだった。
RootMotionは確かに自transformを基準としたアニメーションをしてくれるが、これには一つ
致命的問題があった。
というのは、
同一オブジェクトにAnimatorとTransformをいじるスクリプト(Ridibody等を含む)が存在すると動作しなくなり初期値をずっと示すようになるという挙動が存在するということだ。
[解決法]
つまりRootMotionを利用するしないにせよ、transformをいじるのであれば「Bを作成する作業は必要である。」ということ。
結局のところ、RootMotionの働きは「Animationの作成時Dopesheetではワールド座標を指定して作成しても、それとは関係なくCurvesの値をlocal座標に反映した状態でアニメーションしてくれる」だけなのだ。
つまりRootMotionは「(私が勘違いしていた)空オブジェクトを作る作業を無くすため」のものでは無いのだ。
[最善策?]
1.の方法でBにAnimatorを実装し、Aにtransformをいじるスクリプト等を実装したとき
AがBより離れれば離れるほどアニメーションにその距離分の差異が反映されてしまう。
そのためBにスクリプト、AにAnimator(RootMotion)を実装したほうが良いと思う。
PR