はじめに
先日こんな記事を書きました。
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のサブクラスに変更すると…
なぜなの…。
なぜかMonoBehaviourに差し替わってしまいます。バグ臭…!
OnPostprocessAnimationを使う
このままだと困ってしまうので、回避方法を探します。
出来上がったコードがこちらになります。
OnPostprocessGameObjectWithAnimatedUserPropertiesを使うのをやめてOnPostprocessAnimationで処理する形に変更しています。
この形だと自前のMonoBehaviourのサブクラスが利用できます。
ますますOnPostprocessGameObjectWithAnimatedUserPropertiesがバグってる説が濃厚に…。
ちなみに上記のコードではOnPostprocessGameObjectWithUserPropertiesを用いてカスタムプロパティを持つFBXに絞っています。
が、OnPostprocessAnimationではカスタムプロパティかどうかは関係なくAnimationCurveを編集可能なので、たとえばカメラのFoVをCinemachineのVirtualCameraが持つFoVに差し替える、といったことも可能になります。
夢がひろがる。
まとめ
カスタムプロパティをFBXからアニメーションクリップを取り出さずにUnityEngine内のクラスのプロパティに差し替える場合、OnPostprocessGameObjectWithAnimatedUserPropertiesが利用できます。
ただし、自前のMonoBehaviourサブクラスをセットすると、現状はMonoBehaviourに差し替わってしまいます。
OnPostprocessAnimationであればこの問題を回避できるので、自前のMonoBehaviourサブクラスを使用したい場合はこちらを選択するとよさそうです。
OnPostprocessGameObjectWithAnimatedUserPropertiesの挙動がバグで、いつか直ることを祈るばかりです…🙏