VRChat Avatar Dynamics: Contacts and PhysBone Grabbing

Avatar Dynamics includes two separate interaction systems. Contacts detect tagged volumes and drive Animator parameters. PhysBones simulate secondary motion and can optionally be grabbed, posed, stretched, squished, or collided with. This guide builds one clean example of each and explains the settings that control who can interact.

Build one interaction at a time

Use Contacts for detection and parameters. Use PhysBones when the user should physically move a bone chain.

  1. Create one sender/receiver pair with a unique matching tag.
  2. Connect the receiver to a visible Animator response.
  3. Configure one PhysBone chain for grabbing, then test self and other-player permissions.
Contacts and PhysBones are different

A Contact Receiver does not make an object grabbable. PhysBone grabbing does not automatically set a Contact Receiver parameter. Combine them only when the feature genuinely needs both systems.

Video Companion

Creator: akalink
Video: Avatar Dynamics Tutorial Part 2

Component Map

Component What it does Typical avatar use
VRC Contact Sender Emits one or more case-sensitive tags from a shaped volume Hands, props, effect tips, interaction zones
VRC Contact Receiver Detects matching sender tags and updates an Animator parameter Touch reactions, buttons, proximity effects
VRC Phys Bone Simulates a transform chain and optionally permits collision, grabbing, and posing Hair, tails, ears, clothing, wires
VRC Phys Bone Collider Defines a shape that configured PhysBones can collide with Hands, body avoidance, prop surfaces

Contacts use their own sender and receiver shapes. They are separate from standard Unity colliders and PhysBone Colliders.

How Contact Matching Works

Contact Sender
Tag: InteractButton
        ↓ overlaps
Contact Receiver
Tag: InteractButton
        ↓
Receiver updates an Animator parameter
        ↓
FX Animator changes the avatar

At least one collision tag must match between the sender and receiver. Tags are case-sensitive, so InteractButton and interactbutton do not match.

VRChat provides built-in body-part tags such as:

  • Head;
  • Torso;
  • Hand, HandL, and HandR;
  • Finger, FingerL, and FingerR;
  • specific finger tags such as FingerIndexL and FingerIndexR.

Humanoid avatars receive standard body-part Contact Senders automatically when the avatar author has not replaced them. Use built-in tags when a receiver should respond to ordinary avatar hands or fingers. Use a distinctive PascalCase custom tag for a feature-specific sender and receiver pair.

Build a Custom Contact Sender

Create a child object where the contact signal should originate:

Avatar
└── Armature
    └── Hand
        └── InteractionSender
            └── VRC Contact Sender

Configure:

  1. Set the Root Transform or leave it empty to use the sender object's transform.
  2. Choose sphere, capsule, or box.
  3. Size and offset the shape around the intended interactive area.
  4. Add the matching collision tag.
  5. Inspect the Scene view gizmo from several angles.

A sender only advertises a tagged volume. It does not change an Animator parameter by itself.

Build an Avatar Contact Receiver

Create the receiver where the touch should be detected:

Avatar
└── Armature
    └── TargetBone
        └── InteractionReceiver
            └── VRC Contact Receiver

Configure:

  1. Match the sender's collision tag.
  2. Choose the shape and fit it to the visible target.
  3. Decide whether the wearer's contacts, other avatars, or both may activate it.
  4. Select a receiver type.
  5. Enter the Animator parameter that receives the result.
Filter Use it when
Allow Self The wearer should activate the receiver with their own avatar
Allow Others Other avatars should activate the receiver
Local Only Only the local client needs the contact result

A Local Only avatar receiver does not reduce the avatar's performance rank. Use it for private effects and local control inputs that other clients do not need to evaluate.

Interaction permissions

PhysBones and Contacts on avatars are also governed by each user's VRChat Permissions and Settings. A component can be configured correctly and still be unavailable because the viewer or wearer has disabled that interaction category.

Choose the Receiver Type

Receiver type Parameter behavior Suitable use
Constant Active while one or more matching contacts remain present; resets when contact ends Hold buttons, continuous touch, inside/outside state
OnEnter Active for the frame contact begins; resets on the next frame One-shot Animator entry or pulse logic
Proximity Float from 0 to 1 based on the closest matching sender Blendshapes, progress, distance-based effects

Use a Boolean for a Constant or OnEnter state unless the feature needs another compatible type. Proximity requires a Float.

The receiver parameter can exist only in the Animator Controller. It does not need to be added to Expression Parameters unless the final design requires menu access, saving, or custom synchronization.

Connect the Receiver to the FX Animator

Create the same parameter name and type in the FX Animator Controller.

For a Constant Boolean:

Idle
└── ContactActive = true → Reacting

Reacting
└── ContactActive = false → Idle

For Proximity:

ContactProximity (0 to 1)
        ↓
Blend Tree or animation mapping
        ↓
Small response → Full response

Keep the receiver input separate from any latched output. If a touch should toggle a persistent feature, use Animator logic and an Avatar Parameter Driver to change a second Boolean rather than expecting the receiver value to stay active after contact ends.

Configure a Grabbable PhysBone

Add VRC Phys Bone to the root of a non-humanoid transform chain:

TailRoot
└── Tail_01
    └── Tail_02
        └── Tail_03

Do not use humanoid bones such as Hips, Spine, Chest, Head, or limb bones as PhysBone roots. Use a separate accessory or secondary-motion chain.

Minimum setup:

  1. Assign the intended Root Transform.
  2. Confirm the chain has child bones or set an Endpoint Position where required.
  3. Set a non-zero collision Radius along the part that should be touchable.
  4. Tune Pull, Spring, Stiffness, Gravity, and limits for the desired motion.
  5. Configure Allow Grabbing.
  6. Configure Allow Posing separately.
  7. Test the Scene view gizmos and the uploaded avatar.

The collision radius is used for both collision and grabbing. A chain with no usable radius can move with physics but be difficult or impossible to grab.

Configure Grab and Pose Behavior

Setting Effect
Allow Grabbing Permits players to take hold of the PhysBone
Allow Posing Permits a grabbed bone to remain posed after the posing input
Grab Movement 0 Bone reaches toward the grab using its pull and spring behavior
Grab Movement 1 Bone follows the grabbed position immediately
Snap To Hand Moves the grabbed point to the grabbing bone instead of preserving the initial offset

On avatars, grabbing and posing can be filtered between the wearer and other users. Configure them independently:

  • self grabbing can support personal posing and testing;
  • other-player grabbing should be enabled only for features intended for shared interaction;
  • posing can remain disabled even when grabbing is allowed.

Test a range of Grab Movement values. Immediate movement suits handles and rigid controls; spring movement suits soft ears, tails, cloth chains, and elastic props.

Use PhysBone Animator Parameters

Set a parameter prefix on the PhysBone when the FX Animator should react to its state. With a prefix such as Tail, VRChat provides:

Parameter Type Meaning
Tail_IsGrabbed Bool The chain is currently grabbed
Tail_IsPosed Bool The chain is held in a pose
Tail_Angle Float Normalized angle from the rest direction
Tail_Stretch Float Normalized progress toward maximum stretch
Tail_Squish Float Normalized progress toward maximum squish

These PhysBone parameters do not need to be added as synced Expression Parameters. VRChat evaluates PhysBones locally and remotely.

Use the parameters for feedback:

  • highlight a prop while it is grabbed;
  • change a facial reaction while an ear is posed;
  • drive a blendshape as a chain stretches;
  • show an icon while a pose is locked.

Add PhysBone Collisions Only Where Needed

Movement limits are usually cheaper and simpler than surrounding every chain with colliders. Add VRC Phys Bone Collider components where a visible body or prop surface must block the chain.

Check:

  • the collider is assigned to the PhysBone or allowed through its collision filter;
  • sphere or capsule shape follows the intended surface;
  • the radius is large enough to prevent clipping without pushing the chain away at rest;
  • global collision is enabled only when the collider should affect other compatible PhysBones.

Do not place a Constraint and a PhysBone on the same affected GameObject. VRChat documents that this creates execution-order problems; place the Constraint on a parent when both systems are required.

Performance and Platform Checks

Every Contact and PhysBone contributes to avatar performance metrics unless an applicable Local Only receiver is used. Review the SDK avatar statistics before upload.

On mobile platforms, exceeding the documented Very Poor limits can cause all PhysBones, Contacts, and VRChat Constraints on the avatar to be removed. A feature that depends on these components needs a per-platform plan rather than assuming the PC setup will remain active.

Reduce cost by:

  • using one receiver instead of several overlapping copies;
  • using built-in body tags instead of adding redundant hand senders;
  • limiting PhysBone transforms to the chain that visibly needs motion;
  • preferring movement limits over large collider arrays;
  • disabling other-player interaction where the feature does not require it.

Test in Unity and VRChat

VRChat runs Contacts and PhysBones in Unity Play mode. For Animator response testing, assign the relevant controller to the avatar's Animator before entering Play mode.

Use the in-game Avatar Overlay to inspect contact and PhysBone volumes on the uploaded avatar.

Test Expected result
Matching sender enters receiver Receiver parameter changes
Non-matching tag enters receiver No response
Contact leaves a Constant receiver Parameter returns to zero or false
Proximity sender moves across receiver Float changes smoothly through its expected range
Wearer grabs the PhysBone Self permission allows the grab
Another user attempts a grab Other-user permission produces the intended result
Grab is released Chain returns according to its physics settings
Pose input is used Pose remains only when Allow Posing permits it
Avatar Dynamics permissions are disabled Interaction is unavailable without breaking the rest of the avatar
Mobile avatar variant loads Required components remain within platform limits
Help! My sender and receiver overlap but nothing happens.

Compare the collision tags character for character; they are case-sensitive. Confirm the receiver permits the sender's owner through Allow Self or Allow Others and targets an Animator parameter with the correct type.

Help! The receiver remains active after contact ends.

A Constant receiver resets its parameter when no matching contacts remain. Inspect for another overlapping sender and confirm the Animator is reading the receiver input rather than a separate latched output.

Help! The receiver reacts to the wrong hand or body part.

Replace a broad tag such as Hand or Finger with the documented side-specific tag, then resize the receiver so nearby standard senders do not overlap it.

Help! My PhysBone moves but cannot be grabbed.

Enable Allow Grabbing for the intended user category and confirm the chain has a usable non-zero collision radius. Also check the user's Avatar Dynamics interaction permissions in VRChat.

Help! A grabbed PhysBone snaps unexpectedly.

Inspect Snap To Hand and Grab Movement. Disable snapping to preserve the initial grab offset, or reduce Grab Movement when the chain should follow through its pull and spring response.

Help! The PhysBone stays frozen after release.

Check whether the chain was posed rather than merely grabbed. Disable Allow Posing for grab-only behavior or use the normal unpose interaction to release the stored pose.

Help! The feature works on PC but disappears on mobile.

Review the mobile avatar's performance statistics. VRChat removes PhysBones, Contacts, and Constraints when the avatar exceeds the platform's documented hard limit, so simplify the mobile variant.

Official References

Related Guides

Topics: VRChat avatars, Avatar Dynamics, Contacts, PhysBones, grabbing, posing