VRChat Avatar Creation Tips
Here's some notes of mine for working with VRChat avatars. These notes are not meant to be a full tutorial.
Skim through the VRChat Creators documentation for Avatars. Install Unity through the VRChat Creator Companion or through Unity Hub as Setting up the SDK recommends. If you're starting with an avatar base model, then most of the instructions in Creating Your First Avatar will be unnecessary, but it's still a good idea to know about these steps if you want to modify much about the avatar.
Many avatars come with their 3d models as both a Blender (".blend" extension) file and an FBX file. The Blender file is the original file that the model was created in, and the FBX file is the model in a format that is best for importing into Unity. (This is the same relationship as Photoshop PSD files and PNG files, etc.) If you want to edit the model, you should use the original Blender file instead of importing the FBX file into Blender. If you use the FBX file, then the model may lose some of its original properties such as which lines are marked sharp, which will make shadows look worse on the model.
After you make changes to the model, you should save the blend file and then export the model to FBX format for use with Unity. Always export the blend file to FBX with the Armature -> "Add Leaf Bones" option off, or else the model will have extra bones added that Unity doesn't have any need for, negatively impacting your avatar's performance and performance rank.
New Image/Model Resources
Whenever you change a texture or FBX file, if you save your version as a new file instead of overwriting the original textures/FBX, then it's important that in Unity you copy over the original file's settings in the Property Inpsector window. You should compare the original file and the new file's settings and make sure they're the same. For textures you'll likely need to copy some quality and mipmap settings. For FBX files, you may have to copy the the Rig -> "Animation Type" (to Humanoid) and the options in the Model page about "normals". Another way to copy the file settings is to duplicate the original file within Unity and then save over the duplicated file.
Use VRCFury for setting up expressions menu options and toggles. Really. It's great. The VRChat SDK's standard way for setting up expression menu options and toggles requires making custom animations with Unity's full animation editor, which is overcomplicated for this task and very easy to make mistakes in. You often even need separate animations for turning toggles on and turning toggles off if you're using Write Defaults set to off as recommended for VRChat; VRCFury lets you not worry about this while it handles things the right way. VRCFury is not all-or-nothing: it still lets you add your own custom animations to an avatar if you need to in addition to its own animations.
Versioning with Git
You can use Git to version your project, and optionally you can use GitHub or GitLab to host and back up the project. (If you're using a nonfree avatar base, you'll want to make a private repo when using GitHub/etc.) This is a great way to back up your project, to keep track of changes you make to it, and to help share your project with collaborators.
If you're not familiar with Git, you will need to put some effort into learning how to use it. I recommend the Pro Git book, available for free online.
Include these files,
.gitignore, in the root of your project. They stop temporary files from being checked in and enable Git LFS for large files. These config files are based on the configs from the official but discontinued GitHub for Unity plugin, with some small additions for tools like GIMP, Substance Painter, and VRCFury.
If you're using Xiexes-Unity-Shaders, you must remove its contained
.gitignore file or at least remove the line "Textures/Shadow Ramps/Generated/" from it, or else Git will ignore an important folder and your avatar will be missing its shadows if the project is re-cloned without the ignored files. (The included
.gitignore file seems intended for the project's own repository, not for the repository of a project that uses it.)