March 29th 2018
Even if your team uses Max/Maya, this may still be relevant if you're interested in offering mod support because the majority of your community will be using Blender.
Personally I've been using Blender for years, and am continuing to use it for Unturned 4.x in UE4. Here are some helpful tricks to make that process easier which I'll update as I come across more:
By pressing Ctrl+U you can save a default file setup to use when opening Blender. These options will help with creating UE4 content.
UE4 uses centimeters, so change your scene units to Metric with a Unit Scale of 0.01.
LODs are imported as children of a "LodGroup" type node, which Blender's LOD system isn't. To import LODs from one .fbx you'll need to parent them to an empty with fbx_type set to LodGroup:
I've included this in the default scene because most models have LODs, so in the rare case they don't it's easily deleted.
When exporting to .fbx you can save your settings in an operator preset:
Some important options are:
- Version: Binary - fbx_type custom property was only recently added to the official Blender version, and is only supported in the binary exporter.
- Smoothing: Face and Tangent Space: True - Properly import smoothing and normals into UE4.
- Only Deform Bones: True - Personally I turn this on because I don't need any control bones in the game, but if you use them for runtime IK or something this should be False.
- Add Leaf Bones: False - Epic's official skeletons don't have leaf bones, and they clutter up the skeleton view.
- Primary Bone Axis: X Axis and Secondary Bone Axis: -Z Axis - Matches Epic's official skeleton bone orientations, but is not a big deal.
These changes require a source build of UE4.
Ignore Extra Root Bone
Epic recently updated UE4 to somewhat cover this (in 4.16?), but I prefer to suffix my armatures with _Armature. Adjust FFbxImporter::GetRootSkeleton to ignore however you name your armatures:
Named LOD Import
Without this change your LODs will be imported based on their index in the LodGroup node. Adjust FFbxImporter::FindAllLODGroupNode to first try and find the LOD by name rather than by index:
Your mileage may vary, but this has been working fine for me. You may want to search for an _LOD# suffix instead, but I opted for the existing FindChild function.