渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

TransformSceneHandleについて調べていたら、AnimationJobについて調べていた件


f:id:esakun:20150730215258g:plain

Unity2018.2.12f1時点ではまだExperimentalな機能であるTransformSceneHandleについて調査しました。

リファレンスはコチラ

Position, rotation and scale of an object in the scene. A TransformSceneHandle is a safe handle on a TransformAccess. The Animator used to create this handle manages the validity of this handle.

リファレンス上では説明されています。

調査すると、結論TransformSceneHandleはAnimationJobを使用する際のTransformへのアクセス方法であるという認識になりました。
※IJobParallelForTransformにおけるTransformへのアクセスは、TransformAccessを使用していました



簡単な図にするとこうなります。

  1. TransformSceneHandleは、AnimatorとTransformを元に生成
  2. TransformSceneHandleをAnimationJobへ渡す
  3. AnimationJob内でTransformSceneHandleへ位置回転データを渡す
  4. AnimationJobはAnimationScriptPlayableを通して再生される

というような流れになります。

AnimationJobはIAnimationJobインターフェースを実装する必要があり、以下のような実装になっています。

AnimationJob内の処理ProcessAnimationProcessRootMotionの引数でAnimationStreamが渡ってきます。
このAnimationStreamインスタンスを通して、TransformSceneHandleの値を更新していくようです。
※そもそもAnimationStreamとはなんぞや??という疑問が出てきますが、こちらは未調査なので割愛します。

f:id:esakun:20181028162639p:plain:w450

準備として、AnimatorのコンテキストメニューからBuild Generic Avatarを実行。

f:id:esakun:20181028162752p:plain:w450
このようにAvatarがセットされている必要があります。

リファレンスのほぼ丸コピソースですが、コチラが今回の検証サンプルです。

f:id:esakun:20181028040740p:plain:w450

実行すると上のキャプチャのように並列処理されていました。


1点残念だったのは先日「アセンブリやるぜ!!」っていう記事を書きました。

AnimationJobをBurstCompileしてみてアセンブリがどうなっているか確認しようとしてのですが、AnimationJobがExperimentalのせいか、BurstInspectorに表示されずアセンブリを確認できず。

ただし、コンソールを見ると以下のようにAnimationJobのBurstCompile自体は走っているようです。

While compiling job: System.Void UnityEngine.Experimental.Animations.ProcessAnimationJobStruct`1::ExecuteProcessRootMotion(T&,System.IntPtr,System.IntPtr,Unity.Jobs.LowLevel.Unsafe.JobRanges&,System.Int32)

f:id:esakun:20181028035911p:plain:w300

Jobs > Show Burst Timingsにチェックを入れると、ランタイム時にコンソールにBurstCompileのタイミングでログが表示されるようになります。

まとめ

TransformSceneHandleはAnimationJobで使用されます。
※どちらもExperimental

参考

環境

  • Unity2018.2.12f1