Changelog
[2.5.0] - 01.11.2025
Added
- Animation Wayback Machine.
- Third person character controller sample.
Changed
AnimatorParameterAspectandAnimatorStateQueryAspectno longer implementIAspectinterface due to its deprecation. Refer to the migration process for further details.
Fixed
- The blend tree computation code no longer outputs zero-weighted animations.
- Corrected motion submission in 1D blend tree for blend values greater than blend tree's maximum.
- Resolved code generation errors when using
RUKHANKA_WITH_NETCODE.
[2.4.0] - 05.10.2025
Added
- Animator controller transition interruption support.
- Animator controller layer sync feature.
[2.3.0] - 07.09.2025
Added
- Dynamic bone chain procedural animation algorithm.
- Procedural animations sample scene.
- Animation events support for GPU-animated entities.
- Animation culling support for orthographic camera type.
Fixed
AnimationStream.SetWorldPositionAPI not working incorrectly.- Incorrect calculation of layer weights when an animation state had an empty motion.
- Animation events emitted incorrectly for animations introduced in the current processing frame.
Amplify Shader Editordeformation node worked incorrectly.- Error in GPU animator Euler-to-quaternion rotation conversion code.
- Memory leak during simultaneous rig-to-skinned mesh remap table creation.
- Incorrect rendering of skinned mesh without defined root bone.
- Properly handle disabled GPU-animated entities.
- Incorrect "Enable Motion Vectors" help URL in project settings.
- "Attempt to draw with missing binding" warning and missed GPU attachments in Edit mode.
- Incorrect handling of negative motion time for non-looped animations.
- Incorrect handling of negative motion time in root motion processing code.
- Incorrect layer weight calculation in user curve processing code.
Changed
- GPU attachments can now be standalone baked objects.
- Compute shaders are now DXC compiler–compatible, fixing shader compilation errors on Xbox.
- Reworked "single deformation compute dispatch" approach: compute shader now uses a constant
numthreadsattribute, improving compatibility with mobile platforms. - Removal dependency on
ENABLE_DOTS_DEFORMATION_MOTION_VECTORSscript compilation symbol.
[2.2.1] - 03.05.2025
Added
- Weight dependent tip node rotation for
TwoBoneIKalgorithm.
Fixed
- Incorrect thumb finger humanoid bone name.
- Missing blend shape data buffer bindings in shader for in-place skinning.
- Incorrect handling of non-uniform scaling in skinning shaders.
- Out-of-bounds graphics buffer access in the skinning shader, which caused rendering errors on some Android platforms with Vulkan.
- Switched skinned mesh bone weights buffer update scheme from the
SetDataAPI toSparseUploader. The former caused incorrect data clear during partial uploads on MacOS and missing meshes as result.
[2.2.0] - 06.04.2025
Added
- Configuration settings dialog.
- New skinning shader subgraphs for
Unity Shader Graph,Amplify Shader Editor, andBetter Shaders. - Dual quaternion skinning support.
- Half-precision deformation data.
- In-place skinning.
- Multi-submesh GPU attachment meshes support.
- New
RootMotionVelocityComponentfor custom root motion handling. New configurable root motion mode inRigDefinitionAuthoring.
Changed
- Deprecation message about default
Entities.Graphicsdeformation shader usage. Its support will be removed in next Rukhanka release.
Fixed
- The rig optimization mask had incorrect bone order.
- Properly ignore missing animation tracks during animation weight calculation.
- Internal new skinned mesh hash map capacity was increased to prevent "Hash map is full" exceptions during big number different meshes instantiation.
- Missed
AvatarMaskbaking code inAnimationAssetSetBaker. - Incorrectly working
AnimationStream.SetWorldRotationAPI. - Update skinned mesh render bounds code worked incorrectly.
[2.1.0] - 26.02.2025
Added
SkinnedMeshRenderEntitycomponent buffer. This buffer holds references to all baked render entities for particular skinned mesh. This buffer helps simplify material overrides and runtime mesh addition/removal manipulation.- Rig bone count optimization mask.
- "Better Shaders" shader building tool node for making deformation-compatible shaders.
- Runtime animator layer speed ability.
- Runtime skinned mesh replacement sample.
Changed
- Improved Blob Inspector dialog UI.
Debug.DrawerHDRP/URP shaders merged into one for both SRPs. This removes shader compilation warnings about incompatible SRP.
Fixed
- Incorrect behavior of GPU animation engine when animated entity is disabled (via
Disabledcomponent). - The deformation system wrong update order which led to one frame missing mesh for renderers with the configured LOD group.
- Incorrect keyframe index check for two-frame tracks in GPU animator.
- Deformed meshes with blend shapes are not properly counted during the internal buffers resize operation of the deformation system. This could lead to the "Hash map is full" runtime exceptions.
- The middle joint drift of the
TwoBoneIKalgorithm if no animation is playing for the rig. - Incorrect absolute entity pose computation of IK targets that are non-root entities.
- Incorrect humanoid bone mapping for toe bones.
[2.0.0] - 25.12.2024
Added
-
Innovative GPU animation engine. Full-featured animation processing routines implemented on GPU using compute shaders.
-
ScriptedAnimator.CrossFadeAPI which mimics Unity'sAnimator.CrossFade. -
The additive reference pose frame was always taken from the current animation. A separate pose frame was needed for advanced blending scenarios. This ability was added to the animation clip blob and baker.
Changed
- The avatar mask representation was changed to bitmask. This lowers memory usage and speeds bone masking during animation processing.
- Animation blob asset structure refactoring. Tracks are stored in a more uniform way now. This leads to a simpler and performant sampling code.
- Perfect hash table reworked. Lookups are much more performant now.
MaterialOverridespropagation from authoring skinned mesh entity to all sub-mesh entities.- Additive and loop pose calculations require first and/or last animation frame sampling. Previously this was done by sampling with keyframe search (generic approach). Now, special direct first and last frame sampling functions were added, speeding up the entire computation loop.
Fixed
- Incorrect blob asset registration that comes from multiple scenes.
- Incorrect additive animation layer weight calculation.
- Properly handle
Disabledanimated entities and skinned mesh entities. - Preventing infinite values in animator controller state times.
- Headless and unsupported configurations improperly disable GPU-related systems.
Entities.Graphicsdeformation system treats deformed mesh index 0 as an invalid index. Valid indices started from 1. Rukhanka's deformation system uses 0 based index, which breaks motion vector functionality for the first deformed entity in the world.- Memory leak during blend shape copying in the deformation system.
- Blend shape incorrect vertex count calculation during GPU upload.
[1.9.2] - 04.11.2024
Fixed
- Improperly handled
Disabledentities. - Improper handling of controller zero length states.
[1.9.1] - 09.10.2024
Added
- Documentation for
ScriptedAnimator.PlayAnimatorStatefunction. GetStateIndexInControllerLayerfunction that can be used to find the state ID forScriptedAnimator.PlayAnimatorStateAPI.
Changed
- Making
CopyBufferandClearBuffercompute kernels with smaller thread group size (128) to be able to work on low level-mobile GPUs. Large data sizes are handled via multiple dispatches. - The
Skinningcompute kernel now has variations with different workgroup sizes. The correct one is selected depending on hardware capabilities in runtime.
Fixed
- Skinned mesh to rig remap table cache can run out of capacity.
- Incorrect additive layers weight calculation.
- Incorrect blend shape deformation when both skinning and blend shapes are used together.
- Inverse kinematic targets positions were calculated from entity
LocalTransformcomponents. This leads to one frame position lag for targets that are children of animated bones. Now the actual position is taken from the animation stream in this case. - Indexing animation layers were wrong, if some layers had zero weights.
[1.9.0] - 03.09.2024
Added
- Rukhanka Deformation (skinning) System.
ScriptedAnimatoranimator state playback API.
Changed
- Several fixes and improvements were made to the
TwoBoneIKalgorithm. - Skinned mesh blob inspector window with additional data.
Fixed
- Blob assets loaded from the cache were incorrectly registered in the blob database, leading to duplication of blob assets and memory leaks.
- Incorrect Euler to quaternion conversion rotation order.
- Mistakenly removed manual bone stripping mask processing.
EntityCommandBufferobsoleteEntityQueryCaptureMode.AtRecordusage.
[1.8.1] - 31.07.2024
Added
ResetTriggerAPI forAnimatorParametersAspect.
Fixed
- Corrupted animation blob data after scene reload.
- Unknown symbol
FixedStringNamein AnimatorStateQuery documentation page - Baked animation events have an uninitialized
nameHashmember variable.
[1.8.0] - 24.06.2024
Added
- Blend shape support.
- Blend shape sample scene.
ScriptedAnimatorblend tree (1D, and all types of 2D) API.
Fixed
- The
AmplifyShaderEditordeformation node is now disabled correctly during authoringGameObjectrendering. - Blob cache invalid file characters handling.
- Animation baker persistent memory leaks.
[1.7.1] - 07.06.2024
Fixed
- Fixed compilation errors during standalone builds creation.
[1.7.0] - 06.06.2024
Fixed
- Individual trigger reset for each animator controller layer.
Added
- Ability to work without baked
Animator. - Baking code rewritten from scratch. With a cleaner and more straightforward approach baking code becomes faster and uses less memory.
- Blob Inspector dialog to review baked blob assets.
- Blob Cache. Opened subscenes baking times are significantly improved.
Animator Override Controlleranimations now can be switched in runtime.Avatar Maskcan be toggled in runtime.Scripted Animatorsample scene.
Changed
Avatar Masksample scene with runtime mask toggling control.Animator Override Controllersample scene with runtime animation toggling control.
[1.6.4] - 17.05.2024
Fixed
- 'LockBufferForWrite: Multiple uploads in flight for buffer' error.
- Incorrect error message and assert in
EmitAnimationEventsJob. - Error in
AnimationStream.Disposefunction in case of invalid stream rig data.
Added
- Ability to completely compile out
DebugDrawerviaRUKHANKA_NO_DEBUG_DRAWERscript symbol.
[1.6.3] - 16.03.2024
Changed
- Reverting
Entitiesdependency to version1.0.16with appropriate changes. No functionality was affected.
[1.6.2] - 14.03.2024
Fixed
- Animation events edge cases (start and end animation).
- Correcting events for looped animations.
- Exception during renderers bounding box recalculation if skinned mesh renderer root bone property is null.
[1.6.1] - 9.03.2024
Fixed
DebugDrawerincorrect line renderer in Unity versions newer than 2022.3.17f1.- Authoring object copy for animation sampling is not created if avatar is missing on animator.
[1.6.0] - 7.03.2024
Fixed
- User curves incorrect multiple layers blending.
IKtargets incorrect world pose calculation if the animated entity is not a hierarchy root.
Added
- Animation frustum culling ability.
- Skinned mesh renderer bounding box recalculation ability.
- Sample showcase scene to demonstrate animation culling and bounding box recalculation features.
IsInTransitionutility function ofAnimatorStateQueryAspect.
Changed
- Updated
Entitiesdependency to version1.2.0-pre.6 - Making
DebugDrawera client only system.
[1.5.1] - 10.02.2024
Fixed
- Removed empty
DebugDrawerdraw calls in case of no primitive submitted. - Server world missed the animation injection system group.
- Some memory leaks during baking.
Added
- Duplicated bone names checker during baking.
Changed
AnimationStreambone hierarchy recalculation rework. There is no need forRebuildOutdatedBonePosesexplicit calls anymore. All dependent bones will be recalculated automatically duringGetcalls.AnimationStreamis derived from anIDisposableinterface now, and disposal is required after its usage.
[1.5.0] - 01.02.2024
Fixed
- The
BoneTransform.Inversefunction worked incorrectly with respect to scale. - User curves were parsed incorrectly in humanoid animation clips.
Added
- Animation modification injection point represented by
RukhankaAnimationInjectionSystemGroup. AnimationStreamstructure to simplify working with animation data.- Several inverse kinematics algorithms:
- Aim.
- Override transform.
- Forward And Backward Reaching Inverse Kinematics (FABRIK).
- Two Bone.
- Animation events.
- Animator controller events.
- The debug bone renderer was extended to be able to draw various primitive geometry (lines, triangles, cones, cubes, etc.) and moved to separate
DebugDrawerassembly. It is independent from other Rukhanka assemblies and can be used as a standalone library. - Two new samples: Events and IK.
Changed
- The package's internal name has been changed to
com.rukhanka.animation. - Bone stripping functionality has an additional
Automaticmode now. - The
RukhankaDebugConfigurationnew options to log all animation and animator controller events. - Multiple bone visualization systems can run. This is useful to display skeletons in multiple worlds (particularly when using NetCode).
[1.4.2] - 15.12.2023
Fixed
- The last syncpoint of
AnimationProcessSystemjob has been removed by moving all frame initialization code into a separate job. - Fixed incorrect excessive internal hash map capacity setting.
- Fixed memory leaks during blob creation in several baking systems.
- Internal perfect hash tables gain better validation. This change fixes rare creation errors from valid data.
- Correct handling of inexistent conditions during state machine baking.
- Fixed enter transition->exit transition sequence that appeared in one frame.
- Fixed warning of implicit usage of
ToNativeArray()call. - The transition offset were measured in normalized time. It is correctly in seconds now.
Added
- Sub-state machine transitions was implemented.
Changed
- Animator parameter usage documentation has been changed to emphasize
AnimatorParametersAspectas the preferred runtime interface to parameters data.
[1.4.1] - 06.10.2023
Changed
- All runtime systems
TempJoballocations was changed toWorldUpdateAllocator. - Code cleanup with more extensive
SystemAPIusage. - Moving shared utility code into separate
Rukhanka.Toolboxassembly.
Fixed
- Incorrect root bone indexing for humanoid rigs.
- Incorrect non-root motion of humanoid rig hips.
[1.4.0] - 28.09.2023
Fixed
- Several memory leaks during baking and runtime.
- Incorrect additive animation calculation for humanoid animations.
Added
- Two new sample scenes:
RagdollandSimple Physics. - Animation keyframe binary search was implemented.
- Rukhanka can now work with unparented bone entities. This allows to properly handle physics body bone attachments.
- Unneeded bone entity stripping functionality. Refer to documentation for the detailed description.
- Internal bone animation data is now exposed as a
RuntimeAnimationDatasingleton. - Full root motion support for
HumanoidandGenericrigs. All root motion animation configuration parameters are supported. - Rukhanka now requires
UNITY_BURST_EXPERIMENTAL_ATOMIC_INTRINSICSscript compilation symbol. It will be added to project scripting define symbols automatically if not present.
Changed
- Updated Entities dependency to version 1.0.16.
- Removed synchronization point related to
AnimationToProcessbuffer filling. - Removed synchronization point related to root motion delta states processing.
- The animation process system is split into two distinct parts: animation calculation and animation application. This allows to injection of animation results post-processing and modifications (for example IK) functionality.
- Runtime created bone-name-to-index hash map was removed. It has been replaced with a blob perfect hash map created during baking time.
- Samples were moved to the samples tab of package properties. There are shared HDRP/URP sample scenes now. Materials and scene properties will adapt to the current renderer pipeline automatically.
- Animation controller layer weight is a runtime property of AnimatorControllerLayerComponent now.
[1.3.1] - 11.08.2023
Fixed
- Fixed compilation errors during standalone builds creation.
[1.3.0] - 10.08.2023
Added
- Humanoid-type support for models and animations.
- Humanoid avatar mask support.
- Humanoid avatars and animations sample scene.
Changed
- The rig definition authoring script now contains zero configuration fields. The avatar mask used for rig definition is not needed anymore. All required information Rukhanka reads from
Unity Avatar. This is a breaking change. Please carefully read the upgrade process.
Fixed
AnimatorControllerParameterComponentbuffer did not replicate with NetCode.
[1.2.1] - 20.06.2023
Fixed
- Fixed compilation errors during standalone builds creation.
[1.2.0] - 14.06.2023
Added
- Compute deformation node for
Amplify Shader Editor. Now it is possible to makeEntities.Graphicsdeformation-compatible shaders with this tool. - Trigger set API for
AnimatorParametersAspect. - The animator parameter access performance tests.
- Own entity command buffer system for optimizing ECB usage after
AnimationControllerSystem. AnimatorStateQueryaspect for access to runtime animator data.
Changed
- Animator parameter internal hash code representation was moved from
Hash128to uint. This leads to a smallerAnimatorControllerParameterComponentsize and better chunk utilization.
Fixed
- The state machine states without an assigned motion field had incorrect weight calculations.
- Exit and enter transition events that happened in the same frame lead to one incorrectly processed frame. This was clearly observable with transitions from/to "no-motion" states.
- Trigger parameters were reset even if the transition cumulative condition (all conditions must be true) is not met.
- Entering through the sub-state machine's
Enterstate was handled incorrectly. - Exiting from nested sub-state machines using the
Exitstate was handled incorrectly. - Multiple transitions from the
Enterstate machine state were handled incorrectly.
[1.1.0] - 30.05.2023
Added
Unity Netcode for Entitiespackage support. Animations and controllers can be synchronized using interpolated and predicted modes.- New
Netcode Demosample with Rukhanka andNetcode for Entitiescollaboration showcase. - Animator parameter aspect to simplify animator controller parameter data manipulation.
Changed
- Minimum
EntitiesandEntities.Graphicspackages version is 1.0.10.
Fixed
- State machine transitions with exit time 0 were handled incorrectly.
- Transitions with exit time 1 are looped contrary to Unity documentation. Rukhanka behavior changed to match
Mecanimin this aspect. - Various deprecated API usage warnings.
[1.0.3] - 06.05.2023
Added
- Adding authoring Unity.Animator and all used Unity.Animation in the baker dependency list.
- Extended animator controller logging with RUKHANKA_DEBUG_INFO which displays all states parameters and transitions of baked state machines.
Fixed
- Incorrect handling of very small transition exit time during state loops.
- Preventing NANs (division by zero) when transition duration is zero.
- Memory allocation error in PerfectHash tests.
- Controller parameters order in authoring animator does not coincide with generated
AnimatorControllerParameterbuffer. - Empty animations to process buffer were handled incorrectly.
- Exit states of state machines are now handled properly.
- Animator state
Cycle Offsettreated as animation normalized time offset as inUnity.Animator.
[1.0.2] - 28.03.2023
Fixed
- Entities 1.0.0-pre.65 and Entities.Graphics 1.0.0-pre.65 support.
[1.0.1] - 19.02.2023
Added
- IEnableableComponent interface for AnimatorControllerLayerComponent and RigDefinitionComponent.
- Decsription of main Rukhanka entity components.
Changed
CrowdandStress Testsamples now have control for skeleton visualization enabling (with RUKHANKA_DEBUG_INFO defined).CrowdandStress Testsamples now show total number of animated bones in scene.
Fixed
- Incorrect handling handling of uniform scale in animations.