Workflow
- All edits should be one directional.
- All steps should only happen previously before their successor.
- Steps may be skipped for prototyping.
Flow
Step | Notes |
---|---|
ZBrush | We may use other high res modeling software. |
Multiresolution Modifier | We MUST project any high res to a low res to allow the client to make edits or changes if they want without depending on other software. Any other sculpting or projection fixes may be done at this stage. |
UV Unwrap & Rigging | UV Unwrap and Rigging can be done in parallel. |
FBX Import, Shaders, Materials, Textures | Connect generated textures to materials and materials to the FBX. |
UV Unwrap
Step | Notes |
---|---|
UV Unwrap | UV unwrapping and rigging can be done in parallel. |
Normal Baking | Normal baking for Substance Painter. This gives us more control over the normal baking when using the Multiresolution Modifier. |
Texture Baking | Sometimes we may bake textures out of Blender for usage further in the pipeline. |
Substance Painter |
Rigging
Step | Notes |
---|---|
Rigging | Set up the armature and bones. |
Weight Painting |
Preparing for Release
Blender File
- The data names should match the object name in the Blender scene.
- The Blender File should contain only the bare minimum for the package.
- Blender files should be saved with compression.
- Images should be packed into the Blender file.
- Anything unnecessary in the following should be removed from the distributed files:
- External file references
- Third-party data (RetopoFlow’s text file, for example.)
- Actions
- Images
- Meshes
- Shape keys
- Texts/Scripts
- Worlds
Important
Should NOT require third-party plug-ins to open and modify.
Armatures
- Naming should follow the following pattern: [Prefix][BoneName][Suffix].
- Bones with multiple bones for length should have a suffix greater than 0: [Prefix][BoneName][BoneNumber].
- We may use the suffix root for animated bones like ears and tail to separate their physics and animations: [Prefix][BoneName]Root.
- Symmetrical bones should end with additional _L for Left and _R for Right.
- We should NOT export automatic tip bones for the FBX. However, if we need tip bones, we should export them with the suffix Tip.
Humanoid Bones
Body
Caution
Ignore Upper Chest. Weight Painting under the breasts variants without compensation.
Note
Toes can be ignored. They are not necessary for the avatar unless there is a gain for assigning the toes for that specific avatar.
Humanoid Bone | Armature Bone Name |
---|---|
Hips | Hips |
Spine | Spine |
Chest | Chest |
Upper Chest | - |
Left Arm | |
Shoulder | Shoulder_L |
Upper Arm | Arm_L |
Lower Arm | ForeArm_L |
Hand | Hand_L |
Right Arm | |
Shoulder | Shoulder_R |
Upper Arm | Arm_R |
Lower Arm | ForeArm_R |
Hand | Hand_R |
Left Leg | |
Upper Leg | Leg_L |
Lower Leg | LowerLeg_L |
Foot | Foot_L |
Toes | Toes_L |
Right Leg | |
Upper Leg | Leg_R |
Lower Leg | LowerLeg_R |
Foot | Foot_R |
Toes | Toes_R |
Head
Important
Do NOT use Jaw. The Jaw animations will be overridden by animations using humanoid avatars.
Humanoid Bone | Armature Bone Name |
---|---|
Neck | Neck |
Head | Head |
Left Eye | Eye_L |
Right Eye | Eye_R |
Jaw | - |
Left Hand
Humanoid Bone | Armature Bone Name |
---|---|
Thumb | |
Thumb Proximal | Thumb1_L |
Thumb Intermediate | Thumb2_L |
Thumb Distal | Thumb3_L |
Index | |
Index Proximal | IndexFinger1_L |
Index Intermediate | IndexFinger2_L |
Index Distal | IndexFinger3_L |
Middle | |
Middle Proximal | MiddleFinger1_L |
Middle Intermediate | MiddleFinger2_L |
Middle Distal | MiddleFinger3_L |
Ring | |
Ring Proximal | RingFinger1_L |
Ring Intermediate | RingFinger2_L |
Ring Distal | RingFinger3_L |
Little | |
Little Proximal | PinkyFinger1_L |
Little Intermediate | PinkyFinger2_L |
Little Distal | PinkyFinger3_L |
Right Hand
Humanoid Bone | Armature Bone Name |
---|---|
Thumb | |
Thumb Proximal | Thumb1_R |
Thumb Intermediate | Thumb2_R |
Thumb Distal | Thumb3_R |
Index | |
Index Proximal | IndexFinger1_R |
Index Intermediate | IndexFinger2_R |
Index Distal | IndexFinger3_R |
Middle | |
Middle Proximal | MiddleFinger1_R |
Middle Intermediate | MiddleFinger2_R |
Middle Distal | MiddleFinger3_R |
Ring | |
Ring Proximal | RingFinger1_R |
Ring Intermediate | RingFinger2_R |
Ring Distal | RingFinger3_R |
Little | |
Little Proximal | PinkyFinger1_R |
Little Intermediate | PinkyFinger2_R |
Little Distal | PinkyFinger3_R |
Miscellaneous Bones
Humanoid Bone | Armature Bone Name |
---|---|
Jaw | Jaw |
Tongue | Tongue |
Tail | Tail |
Left Ear | Ear_L |
Right Ear | Ear_R |
Meshes
- Naming should follow the following pattern: [MeshName]_[Variant].
Shape Keys
- Reuse face tracking shape keys as gesture expressions when face tracking is not added to the avatar.
- VRChat visemes use the following naming convention: vrc.v_[Viseme].
Important
The Jaw and Tongue transforms are not done through shape keys. This restriction applies especially to Visemes and Unified Expressions. The transformations are done through the Animator in Unity using the VRChat Built-in Parameters.
Shape Key | Notes |
---|---|
Basis | |
Substance | If the mesh needs to be exploded for Substance. |
=== Visemes === | |
vrc.v_sil | |
vrc.v_pp | |
vrc.v_ff | |
vrc.v_th | |
vrc.v_dd | |
vrc.v_kk | |
vrc.v_ch | |
vrc.v_ss | |
vrc.v_nn | |
vrc.v_rr | |
vrc.v_aa | |
vrc.v_ee | |
vrc.v_ih | |
vrc.v_oh | |
vrc.v_ou | |
=== Eye Look === | |
LookUp | When eyes look up. |
LookDown | When eyes look down. |
=== Customization === | |
[BodyPart].[Customization] | Allows customization to the mesh or avatar. |
=== FT & Expressions === | |
* | Please refer to United Expressions. |
Export Settings
Include | |
---|---|
Limit to | Selected Objects |
Object Types | Armature, Mesh |
Custom Properties | False |
Transform | |
---|---|
Scale | 1.00 |
FBX Units Scale | FBX Units Scale |
Forward | -Z Forward |
Up | Y Up |
Apply Unit | True |
Use Space Transform | True |
Apply Transform | True |
Geometry | |
---|---|
Smoothing | Face |
Export Subdivision | False |
Apply Modifiers | True |
Loose Edges | False |
Triangulate Faces | False |
Tangent Space | True |
Vertex Colors | None |
Prioritize Active Color | False |
Armature | |
---|---|
Primary Bone Axis | Y Axis |
Secondary Bone Axis | X Axis |
Armature FBXNode Type | Null |
Only Deform Bones | True |
Add Leaf Bones | False |
Bake Animation | True |
---|---|
Key All Bones | True |
NLA Strips | True |
All Actions | False |
Force Start/End Keying | True |
Sampling Rate | 1.00 |
Simplify | 1.00 |
Animations
- Naming should follow the following pattern: [ActionName].
- We use the NLA Strips for exporting animations. Modify the actions until the action is finalized then add it to the NLA Strip.
Caution
Ensure that the final animation in the NLA strip list is the export pose of the FBX. If it is not last in the list, the default pose in Unity will be what is the final animation.
Substance File
- Names for exported textures should follow the following pattern: [Mesh]_[MapName][Suffix][UDIM].
- Substance files should have layers that are properly named and organized.
- Texture Sets should be baked out at the same resolution as the exported files.
- All textures should be exported as 8-bit unless otherwise stated.
- Normal maps should be exported as 16 bit.
- Emissive maps may be exported with 8-bit + dithering.
Map Naming Convention
Map Name | Map Name | Map Type |
---|---|---|
Base Color | BaseColor | RBG/RGBA |
Ambient Occlusion | AmbientOcclusion | Grayscale |
Emission | Emission | RBG |
Metallic Smoothness | MetallicSmoothness | Composite |
Metallic Smoothness Standard | MetallicSmoothness_Standard | Composite |
Normal | Normal | Normal |
Global Mask | GlobalMask[1-4] | Composite |
Note
Any maps not mentioned above should follow the same naming convention as above.
Unity Package
- Create a dedicated exportable scene within the project that contains everything for that package to properly export.
- Do NOT export the export scene.
- The package should NOT contain any third-party files when exporting.
Package Structure
- Other directories within CreatureTime/Avatars/[ProjectName]:
- These directories are followed in most cases. If the directory is not mentioned, try to follow a similar convention.
Directory | Description |
---|---|
Accessories | May or may not come with the avatar bases, but will be used when accessories are created for the avatar base. |
Animations | Contains the FX animation controller(s) and animations. May contain subdirectories for organization. |
Extensions | Some projects have extensions that can be placed on the avatar using VRCFury. |
Materials | Contains the materials associated with the project. Comes with standard and Poiyomi shaders by default. Package should not come with Poiyomi shaders. |
Models | Contains the FBXs or other 3D asset supported file types. |
Prefabs | Contains prefabs associated with the project. |
Scenes | Any scenes associated with the project. Avatar base projects should contain a file to help beginners using the following naming convention: [PackageName] (Start Here!).unity |
Scripts | Prefabs that contain preset settings that are re-used within the project. Ears and toes, for example, since they use the same settings. |
Textures | Preset of textures for the project. |
Variants | May or may not come with the avatar bases, but contains any variants of the avatar base. For example, the Customization Variant used for the public version of the avatar. |
VRChat | VRChat specific assets such as Menus and Parameters. |
Textures
Texture Import Setting for All Textures
Setting | Value |
---|---|
Mip Streaming | True |
Mipmap Filtering | Kaiser |
Texture Import Setting by Map Type
Map Type | Texture Type | sRGB | Alpha Source | Alpha is Transparency |
---|---|---|---|---|
RGB | Default | True | None | - |
RGBA | Default | True | Input Texture Alpha | True |
Grayscale | Default | False | None | - |
Composite | Default | False | Input Texture Alpha | False |
Normal | Normal map | - | - | - |
Important
Normal Maps should use the override and set to RG Compressed BC5.
Caution
Do not use texture compression unless you absolutely have to since this may cause hitches when people are loading the avatar in VRChat.
Materials
- Naming should follow the following pattern: [ModelFileName]-[MaterialName]. Allows for FBX Import to auto-map using On Demand Remap feature.
FBX Import
- Naming should follow the following pattern: [ProjectName]_[Variant].
Model
Setting | Value |
---|---|
Read/Write | True |
Legacy Blend Shape Normals | False (Ignore VRChat’s auto-fix for this.) |
Normals | Import |
Blend Shape Normals | Import |
Smoothing Angle | 180 |
Rig
Setting | Value |
---|---|
Animation Type | Humanoid |
Note
Please refer to Armature Naming Convention for bone mapping in case Unity fails to properly assign bones.
Animation
- Animation names should follow the Action naming convention from the FBX: [ActionName].
- When there are multiple animations exported from a single animation from the FBX, the animation name may have the sub animation context added to the name: [ActionName]_[SubAnimation].
- Masks may be used to generate masked animations.
- Transformation animations should be cleaned up if they have sub properties are not being used. Scale or Position, for example.
Materials
Setting | Value |
---|---|
Material Creation Mode | Import via Material Description |
On Demand Remap - Naming | Model Name + Model’s Material |
On Demand Remap - Search | Recursive-Up |
Release
Naming Convention
Extension/File | Required Name |
---|---|
UnityPackage | [ProjectName]-[Version].unitypackage |
Blender | [ProjectName]-[Version]-Blender.zip |
[ProjectName].blend | The Blender file. |
BlenderExportSettings.png | The export settings used in Blender for the [ProjectName].blend file. |
Substance | [ProjectName]-[Version]-Substance.zip |
[ProjectName].spp | The Substance Painter file. |
Unzipped | [ProjectName]-[Version]-[WhatIsIt][Extension] |
Handling Versions
Released file structure should follow the following:
- Release
- [ProjectName]-1.0.0-ChangeLog.md
- 1.0.0: Initial release.
- [ProjectName]-1.0.0.unitypackage
- [ProjectName]-1.0.0-Blender.zip
- [ProjectName]-1.0.0-Substance.zip
- 1.0.1: Blender file was updated and everything down the pipeline was updated with the changes.
- [ProjectName]-1.0.1.unitypackage
- [ProjectName]-1.0.1-Blender.zip
- [ProjectName]-1.0.1-Substance.zip
- 1.0.2: Only a Unity issue was found and fixed.
- [ProjectName]-1.1.1.unitypackage
- 1.1.0: A change was made that means we need to bump the minor version.
- [ProjectName]-1.1.0.unitypackage
- [ProjectName]-1.1.0-Blender.zip
- [ProjectName]-1.1.0-Substance.zip
- 1.1.1: Change in the Substance file were exported and updated the textures in the Unity project.
- [ProjectName]-1.1.1.unitypackage
- [ProjectName]-1.1.1-Substance.zip
- 1.1.2: Another simple Unity issue was found and fixed.
- [ProjectName]-1.1.2.unitypackage
Note
It is okay to have the published release files to be a version behind only if there were no changes to them to bump the version. For example:
- [ProjectName]-1.1.2.unitypackage
- [ProjectName]-1.1.0-Blender.zip
- [ProjectName]-1.1.1-Substance.zip
Project Structure
- The root of the project is also the root of the Unity project.
Warning
Due to LFS not sufficient for large source files, .Source files and large content file types are ignored (including their backup files). Currently, committed into a private Google Drive, but need to find a better solution.
Only need to commit the following directories into version control.
- [ProjectName]
- Assets/CreatureTime/Avatars/[AvatarName]
- Models/.Source
- [AvatarName].blend (Blender)
- [AvatarName].spp (Substance Painter)
- Others mentioned in Package Structure
- Models/.Source
- .gitignore
- Assets/CreatureTime/Avatars/[AvatarName]