I remember when UniteAustinTechnicalPresentation was released, there wasn’t any official animation package at the time, I was really interested in DOTS and the ideia of a pure dots project was in my mind, so I decided to create my on animation package, I’ve working on this project for a long time and I’m pretty excited to share my progress.
The package received a lot of design changes, in a certain point the official animation package released and I thought the wasn’t fair to develop a package for replacing the official one, so I’d redirected the focus of the package to cover something more specific where my package could fit better than the unity package in some situantions. Well, what could I develop that the official package wasn’t providing as a feature? GPU Animation! the Hybrid Rendering supports GPU Skinning but the animation package do everthing on the CPU then uploads to GPU, so what if it animate the skeletons in the GPU? this ideia came with a lot of limitations but at the same time there’s room for heavy optimization.
So the purpose of the package is to be used for large amount of animated entities where there’s no requirement to read the bones position on CPU (as all the animating is done on GPU, the skeleton matrices are never read back to CPU for performance reasons). I tried to convert most of the features from the built-in Animator to the package, so developers that wanna convert their project from authoring to pure dots can do it as simple as possible keeping the visual fidelity.
Performance
spicyspicycomet
1000 GameObjects (w/ AnimatorUtility.OptimizeTransformHierarchy):
~30fps @ i7-10700, 16GB, RTX 2060
20000 Entities:
~90fps @ i7-10700, 16GB, RTX 2060
Features
I think it’s easy to explains the features by mentioning what it’s not supported:
- Humanoid animations are not supported, they all should be Generic;
- Transition Interruption doesn’t produce the same visual result as the built-in animator;
- Only bones can be animated, there’s no support for generic float/int values;
- As animating happens on GPU, it’s not possible to read bones position on CPU; (it’s possible to access bone transformation from shader, visually it’s possible to attach objects/effects to bones)
- BlendTree aren’t supported yet, I’m trying to find a way to produce the same result as the authoring version;
- AvatarMask only works using a specific avatar (that you should import in the editor, and select the actived bones);
- Layer “IK Pass”, “Sync” and “Timing” have no effect on the converted version;
- AnimatorControllerOverride isn’t supported yet, but everything is ready to implement it, probably the next feature I’m gonna add;
- As humanoid avatar are not supported, mirroring animations aren’t gonna work;
- “Solo” transitions are ignored;
- Live Link isn’t supported, but I really think that it’s possible to create a proxy gameobject to replicate the animator state of the selected entity;
- SkinnedMeshRenderer bounds doesn’t work as expected, they should be update to work properly. Unity compute the world bounds by using the position of the SMR root bone and this is not available on CPU for entities using my package, so they will not be updated, it’s necesssary to resize they to overlap the area that the SMR can reach when being animated;
- RootMotion not available;
- Animation Event are basically a NativeMultiHashMap that stores all the events produced in the frame, group by event name hash, an event stores the entity that raised it and a Integer or Float value that was assigned in the AnimationClip inspector.
Conversion Settings
To convert a GameObject to an animated entity, it’s required to replace the UnityEngine.Animator component to the CrowdMorph.Animator, notice in the image below that CrowdMorph.Animator has a property to a “Parameters Component Type”, this is a ComponentData type that holds the parameters used by the animator, the parameter names should match field names from the parameters component type.
As a component type holds the parameters, it’s possible to set the parameters using a ComponentSystem. For example, an equivalent system from a MonoBehaviour that set parameters would look like this:
Finally, a Skeleton component should be added, same thing as a Rig component from Unity.Animation, except it only have skeleton settings.

