person-limbs-wideBody Part Length Adjuster

BodyPartLengthAdjuster controls character body proportions at runtime.

It supports:

  • length-style adjustments (joint offset based)

  • advanced per-part scaling

  • head size scaling

  • optional leg height compensation

Supported Body Parts

BodyPartType entries:

  • Arms

  • Legs

  • Neck

  • Torso

  • Head

  • UpperArms

  • LowerArms

  • UpperLegs

  • LowerLegs

  • NeckScale

  • Hips

  • LowerTorso

  • MidTorso

  • UpperTorso

  • Breasts

  • Hands

  • Feet

If a part is not configured on a given rig, it is ignored safely.

Length vs Scale Behavior

Length parts (Arms, Legs, Neck, Torso)

These use local position offsets (joint length style), not bone non-uniform scaling.

Key behavior:

  • roots stay anchored

  • chain distribution is optional via distributeMultiplierAcrossBoneChain

  • endpoint handling is configurable:

    • adjustArmEndpoints

    • adjustLegEndpoints

    • adjustNeckEndpoints

    • adjustTorsoEndpoints

Advanced scale parts

These use scale-based adjustment:

  • UpperArms, LowerArms

  • UpperLegs, LowerLegs

  • NeckScale, Hips

  • LowerTorso, MidTorso, UpperTorso

  • Breasts, Hands, Feet

Mode is controlled by useUniformScaleForAdvancedParts:

  • true: Uniform XYZ scaling

  • false: Width-only XZ scaling (Y unchanged)

Runtime API:

  • SetAdvancedScaleUniformMode(bool useUniformScale)

Important:

  • for most advanced parts, child visuals are compensated to avoid unintended child scaling

  • Hands and Feet intentionally do not compensate children (their child bones scale too)

Head Size

Head size is controlled by BodyPartType.Head and scales headScaleRoot uniformly.

If headScaleRoot is empty and autoDetectHeadScaleRoot is enabled, auto-detection tries:

  1. configured Head part bones

  2. Neck child bones

  3. Humanoid Animator Head bone

Leg Height Compensation

Optional ground-contact stabilization when leg-related values change:

  • compensateHeightForLegLength

  • heightCompensationRoot

  • feetForHeightCompensation

When enabled, the adjuster offsets the compensation root in Y so feet keep baseline height.

Setup Wizard Integration

Use: Tools/Character Creator/Character Creator Setup Wizard

What it does:

  • adds/configures BodyPartLengthAdjuster

  • auto-assigns body part bone chains for Humanoid rigs

  • auto-detects optional breast bones by transform name (breast / bust)

  • sets initial advanced scale mode from:

    • Advanced Scalers Use Uniform Scale

For non-Humanoid rigs, manual body-part bone assignment is expected.

Runtime API (Common)

  • AdjustBodyPartLength(BodyPartType partType, float multiplier)

  • GetCurrentMultiplier(BodyPartType partType)

  • IsBodyPartConfigured(BodyPartType partType)

  • SetAdvancedScaleUniformMode(bool useUniformScale)

  • ResetAllLengths()

Global multiplier range is clamped by:

  • minMultiplier

  • maxMultiplier

Preset and Save Integration

CharacterPresetManager captures and restores:

  • per-part multipliers from BodyPartLengthAdjuster.currentMultipliers

  • useUniformScaleForAdvancedParts mode

RememberCharacterPreset persists this through Crystal Save snapshot flow (when enabled).

UI Integration

CharacterCreatorDemoUI and presenter UIs can drive these values through the body scale presenter.

Current demo supports:

  • per-slider hide toggles

  • per-slider min/max range overrides

  • optional runtime hide of advanced scale mode toggle

Troubleshooting

Problem
Likely Cause
Fix

A slider does nothing

Body part not configured on this rig

Verify body part bones/childBones setup

Scaling also affects unintended children

Wrong part assignment or mode expectation

Check advanced part setup and uniform/width mode

Head size slider does nothing

headScaleRoot unresolved

Assign headScaleRoot or enable auto-detect on Humanoid rig

Feet float/sink after leg changes

leg compensation disabled or feet unresolved

Enable compensation and assign feet references

Preset restore misses body scales

CharacterPresetManager.bodyPartAdjuster missing

Ensure preset manager points to active adjuster

Last updated