What
- Animator が付いている GameObject の position や scale などがスクリプトから操作できないコトがあります。
- インスペクタからも操作できません。
- Animator の enabled を false にすれば操作できます。
- 例えば、拡縮する Animation を含む Animator があったときに、その Animator が AddComponent されている GameObject は Transform.localScale の操作ができません。
Why
- Animator が含有する Animation によって操作されるプロパティは原則的に書き換えできないようになっています。
- 正確に言うと、Animator 内の全 Animation が操作しうる全プロパティが Animator の管理下に置かれてスクリプトからの操作を上書きしてしまいます。
- Animator がネストしている場合にどうなるのかは検証していませんが、ヨシナにブレンドしてくれるのかな…?
How
- Animator に管理されない GameObject を作りましょう。
- 常套手段としては、Animator がアタッチされている GameObject の外側 (親) に新しい GameObject を作り、スクリプトはそちらに AddComponent する、といったところでしょうか?
- もちろん、Animator の enabled を一時的に false に設定する手もありますが、ステートマシンの状態管理が複雑になりがちなのであまり良い手とは言えない気がします。
- Animator の外側から無理矢理 State を殺すような形になるので、元の State を意識する必要が出てしまったりします。
- (実はそれ以外にも手はあるのかも知れませんが調べていません。)
Note
- 同僚がその辺でハマっていたので、備忘録も兼ねて綴りました。
- 今後も実際のプロダクト開発時に起きた課題などについて Case-Study をためていく所存です。