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.
Use Contacts for detection and parameters. Use PhysBones when the user should physically move a bone chain.
- Create one sender/receiver pair with a unique matching tag.
- Connect the receiver to a visible Animator response.
- Configure one PhysBone chain for grabbing, then test self and other-player permissions.
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, andHandR;Finger,FingerL, andFingerR;- specific finger tags such as
FingerIndexLandFingerIndexR.
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:
- Set the Root Transform or leave it empty to use the sender object's transform.
- Choose sphere, capsule, or box.
- Size and offset the shape around the intended interactive area.
- Add the matching collision tag.
- 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:
- Match the sender's collision tag.
- Choose the shape and fit it to the visible target.
- Decide whether the wearer's contacts, other avatars, or both may activate it.
- Select a receiver type.
- 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.
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:
- Assign the intended Root Transform.
- Confirm the chain has child bones or set an Endpoint Position where required.
- Set a non-zero collision Radius along the part that should be touchable.
- Tune Pull, Spring, Stiffness, Gravity, and limits for the desired motion.
- Configure Allow Grabbing.
- Configure Allow Posing separately.
- 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
- VRChat Contacts
- Built-In Contact Tags
- VRChat PhysBones
- Avatar Components
- Animator Parameters
- Debugging Avatar Components
- Avatar Performance Ranks
Related Guides
- Build a Hold-to-Toggle Contact
- Avatar Dynamics Testing
- Avatar Creation
- Avatar Optimization Checklist
- Setting Up VRChat Creator Companion
- VRChat Documentation
Topics: VRChat avatars, Avatar Dynamics, Contacts, PhysBones, grabbing, posing