【Unity】FBXをアニメーションクリップ化せずにカスタムプロパティを差し替える

はじめに

先日こんな記事を書きました。
tm8r.hateblo.jp

こちらではFBXからアニメーションクリップを取り出してカスタムプロパティをAnimatorControllerのプロパティから別のプロパティに差し替える、ということをしていました。
が、アニメーションクリップを取り出さずにFBXのままやりたい!ということもあると思うので、改めて調査してみました。

尚、利用環境はUnity2018.1.4f1です。

OnPostprocessGameObjectWithAnimatedUserPropertiesを使う

前回の記事で

OnPostprocessGameObjectWithAnimatedUserPropertiesは2回目のインポートのタイミングで確かにカスタムプロパティのEditorCurveBindingが処理に入ってくるんですけど、いまいち何に使えばよいか分からず。

というようなことを書きました。

2回目のインポートのタイミングで、というのがミソで、これはOnPostprocessGameObjectWithAnimatedUserPropertiesがOnPreprocessAnimationより先にフックされるためです。

というわけで、OnPreprocessAnimationで明示的にSaveAndReimportを行うようにすればOnPostprocessGameObjectWithAnimatedUserPropertiesがimport時に使われます。
ただし無条件にSaveAndReimportを行ってしまうと無限ループに入ってしまうのでそこは対処が必要です。

というわけで出来たコードがこのようになります。

このコードだと、カステムプロパティのアニメーションがルートにあるSkinnedMeshRendererのmaterialが持つ_Alphaというプロパティに対するアニメーションに差し替わります。

が、これには罠がありまして…。

今回はtypeをUnityEngine内のクラスであるSkinnedMeshRendererにしたのでうまく動きましたが、これを自前のMonoBehaviourのサブクラスに変更すると…
f:id:tm8r:20180710121355p:plain

なぜなの…。

なぜかMonoBehaviourに差し替わってしまいます。バグ臭…!

OnPostprocessAnimationを使う

このままだと困ってしまうので、回避方法を探します。

出来上がったコードがこちらになります。

OnPostprocessGameObjectWithAnimatedUserPropertiesを使うのをやめてOnPostprocessAnimationで処理する形に変更しています。

この形だと自前のMonoBehaviourのサブクラスが利用できます。
f:id:tm8r:20180710122712p:plain

ますますOnPostprocessGameObjectWithAnimatedUserPropertiesがバグってる説が濃厚に…。

ちなみに上記のコードではOnPostprocessGameObjectWithUserPropertiesを用いてカスタムプロパティを持つFBXに絞っています。

が、OnPostprocessAnimationではカスタムプロパティかどうかは関係なくAnimationCurveを編集可能なので、たとえばカメラのFoVをCinemachineのVirtualCameraが持つFoVに差し替える、といったことも可能になります。
夢がひろがる。

まとめ

カスタムプロパティをFBXからアニメーションクリップを取り出さずにUnityEngine内のクラスのプロパティに差し替える場合、OnPostprocessGameObjectWithAnimatedUserPropertiesが利用できます。

ただし、自前のMonoBehaviourサブクラスをセットすると、現状はMonoBehaviourに差し替わってしまいます。
OnPostprocessAnimationであればこの問題を回避できるので、自前のMonoBehaviourサブクラスを使用したい場合はこちらを選択するとよさそうです。

OnPostprocessGameObjectWithAnimatedUserPropertiesの挙動がバグで、いつか直ることを祈るばかりです…🙏

スポンサーリンク