Skip to main content

Resonite support

Modular Avatar has experimental support for building avatars for Resonite.

tip

This project is under heavy development. API and save file compatiblity is not guaranteed.
Please leave feedback and bug reports at the github issues page.

Getting started, and your avatar build​

Installing Modular Avatar - Resonite support​

Building avatars for Resonite requires installing the VCC package Modular Avatar - Resonite support. To install this package, open "Manage Project" for your project, click the + next to Modular Avatar - Resonite support, and then click APPLY.

Install Modular Avatar - Resonite support

Build​

First, Open the NDMF console (Tools -> NDM Framework -> NDMF Console)

How to show ndmf console

After that, follow the steps below to build an avatar for Resonite.

  1. Select the avatar at the top of the window
  2. Select Resonite under Avatar platform at the bottom of the window
  3. Click Build

How to use ndmf console

When the build is completed successfully, the message Build finished! appears at the bottom of the NDMF Console.

Resonite Build Success

tip

If you get an error, click on the Console tab and look at the bottom for a red exclamation mark.

Once the build is complete, install it into Resonite. There are two ways to install it:

  1. Click "Copy to Clipboard" and then click Paste content from clipboard from the Resonite dash menu.
  2. Click "Save as..." to save the avatar file as a Resonite Package, then drag and drop it into Resonite.

Supported features​

The resonite build process will automatically copy certain avatar features, such as visemes, eye position, and physbones/dynamic bones to the Resonite avatar. If you've already set up your avatar for VRChat, no additional configuration on your avatar is needed. If your avatar is not set up for VRChat, or if you don't have the VRCSDK installed, refer to the documentation on portable avatar components for more information on how to set up your avatar.

FeatureSupportedLimitations
Avatar viewpoint✅None
VisemesPartialBlendshape visemes only
Dynamic bonesPartialSee below
Reactive Components⌛Planned
Unity Constraints⌛Planned
Protection against showing partially-loaded avatars✅None

Supported MA components​

ComponentSupportedLimitations
Blendshape Sync⌛Planned
Bone Proxy✅None
Convert Constraints✖VRChat only
Menu Group⌛Planned
Menu Install Target⌛Planned
Menu Installer⌛Planned
Menu Item⌛Planned
Merge Animator✖VRChat only
Merge Armature✅None
Merge Blend Tree✖VRChat only
Mesh Settings⌛Planned
MMD Layer Control✖VRChat only
Move Independently✅None
Parameters⌛Planned (will be converted to Dynamic Variables)
Physbone Blocker✅None
Remove Vertex Color✅None
Replace Object✅None
Scale Adjuster✅None
Sync Parameter Sequence✖VRChat only
Visible Head Accessory⌛Planned
VRChat Settings✖VRChat only
World Fixed Object⌛Planned
World Scale Object⌛Planned

Dynamic bones​

Modular Avatar will detect dynamic bones created using either Portable Dynamic Bones or VRChat's PhysBones, and attempt to convert them to Resonite's dynamic bones, including any colliders.

Since Resonite has its own dynamic bone system, most configuration options are not converted. However, exclusions (including Physbone Blockers), colliders, collision radius, and grabbability are converted.

Modular Avatar will group Dynamic Bones into a number of named "templates" based on their bone names.

By default, the following bone templates are mapped:

Template namesBone name to detect when grouping
skirtskirt
breastbreast
hairhair
long_hairpony, twin
earear, kemono, mimi
tailtail
genericdo not meet the above criteria

You can override the template name by either adding a portable dynamic bone component with a group name specified. Alternately, in resonite, you can create a new template by cloning an object under the Avatar Settings -> Dynamic Bone Settings Slot, setting its name to the new template name, and then changing the name found on the Template Name slot underneath the slot that defined the dynamic bone.

All dynamic bones under the same template will share the same settings for Inertia, InertiaForce, Damping, Elasticity, and Stiffness; you can change these settings on any of the dynamic bones in question,and any changes will be reflected on all of them.

Avatar Settings copier​

Modular Avatar will set up a system for copying avatar settings between different versions of your Resonite avatar. This lets you set resonite-specific settings, such as dynamic bone settings, and then copy them to a new version of your avatar after reimporting from unity.

MA Settings Copier

This feature will specifically copy all Slots underneath the Avatar Settings slot, overwriting any existing slots with the same name. You can add your own slots to the Avatar Settings slot, and they will be copied as well.

To copy settings, wear your old avatar in resonite, and pick up your new avatar with your laser. From the context menu, select MA Settings Copier -> Copy To Avatar. This will copy the settings from your old avatar to your new avatar. You can then wear the new avatar, and the settings will be applied.

Default Dynamic Variables​

Modular Avatar defines a number of default Dynamic Variables that can be used by avatar systems.

Some of these dynamic variables are still somewhat experimental, and may change in the future.

NameTypeDescription
modular_avatar/AvatarRootSlotThe root slot of the avatar (parent of CenteredRoot)
modular_avatar/AvatarWornboolWhether the avatar is currently worn (detected by the avatar being a direct child of the User slot)
modular_avatar/AvatarSettingsRootSlotThe Avatar Settings object
modular_avatar/AvatarPoseNode.[type]SlotThe Slot containing the AvatarPoseNode component for node [type] (e.g. Head Proxy)
modular_avatar/MeshNotLoadedboolFalse if there are any unloaded meshes in the avatar, missing otherwise. This dynamic variable is subject to change in the future.
modular_avatar/HumanBone.[name]SlotReferences a humanoid bone by name. Name is subject to change in the future.
modular_avatar/HumanBonePose.[name]float4x4The initial pose of the bone referenced by BoneRef_[name]. Name is subject to change in the future. Values might not be quite correct yet.

Additionally, an Avatar Dynamic Variable Space is created on the avatar root for use by other gimmicks.

Dynamic Bone Settings​

These Dynamic Bone Settings are mapped with Dynamic Variable.

NameType
modular_avatar/dynamic_bone_template.[name].Inertiafloat
modular_avatar/dynamic_bone_template.[name].InertiaForcefloat
modular_avatar/dynamic_bone_template.[name].Dampingfloat
modular_avatar/dynamic_bone_template.[name].Elasticityfloat
modular_avatar/dynamic_bone_template.[name].Stiffnessfloat
modular_avatar/dynamic_bone_template.[name].SimulateTerminalBonesbool
modular_avatar/dynamic_bone_template.[name].DynamicPlayerCollisionbool
modular_avatar/dynamic_bone_template.[name].CollideWithOwnBodybool
modular_avatar/dynamic_bone_template.[name].HandCollisionVibrationVibratePreset
modular_avatar/dynamic_bone_template.[name].CollideWithHeadbool
modular_avatar/dynamic_bone_template.[name].CollideWithBodybool
modular_avatar/dynamic_bone_template.[name].Gravityfloat3
modular_avatar/dynamic_bone_template.[name].GravitySpace.UseParentSpacebool
modular_avatar/dynamic_bone_template.[name].GravitySpace.DefaultDefaultSpace
modular_avatar/dynamic_bone_template.[name].UseUserGravityDirectionbool
modular_avatar/dynamic_bone_template.[name].LocalForcefloat3
modular_avatar/dynamic_bone_template.[name].GrabSlippingbool
modular_avatar/dynamic_bone_template.[name].GrabRadiusTolerancefloat
modular_avatar/dynamic_bone_template.[name].GrabTerminalBonesbool
modular_avatar/dynamic_bone_template.[name].GrabVibrationVibratePreset

MA Settings DB Settings

Eye Swing​

NameTypeDetails
modular_avatar/EyeSwingfloatAdjusts the size of the avatar's eye movement. Default: 15

Avatar Thumbnail​

NameTypeDetails
modular_avatar/ThumbnailAssetProviderIAssetProvider<Texture2D> Sets the image to be displayed when the avatar is saved in the inventory
modular_avatar/ThumbnailAssetProvider_CropRect? Used when the image specified in modular_avatar/ThumbnailAssetProvider needs to be cropped