Customization Data Assets (in short CDA) are Data Assets that can be placed onto customizable pawns (like Apparels, Attachments, Equipment, Groom and Hairstyles). They define various info and optionally some asset-specific logic.
The general concept of CDAs is, that all child classes of BP_CustomizationDataAsset define more detailed information describing the actual CDA. They may also have CDA-specific logic in the customization process (like foot transforms for the BP_CDA_Apparel_Feet).
Even cooler, why we did not use “Data Table” as an alternative, is that each data asset could have its own functionality – almost like normal Blueprints do, which can be used for data validation and other things right in the asset itself.
This is the base class of all CDAs and defines basic variables:
Debug Assets that are stored in the Customization Profile that your pawn has assigned in the viewport, will get unapplied by CDA pickers when running the game, unless their Accept Debug Assets is set to True (default is False). See CDA Picker for further details..
[V10 removed] Before the V11 Gameplay Tag Update, the default CDA pickers could not accept debug assets, thus Debug Assets were always hidden in-game. See CDA Apparel Picker for further details.
Besides the direct child classes, here is an overview about all current classes.
This is the abstract base class for skeletal CDAs and inherits from BP_CustomizationDataAsset.
Since the V4 Animation Update, this is a new base class for skeletal CDAs like BP_CDA_Hairstyle, BP_CDA_Apparel and the new BP_CDA_Equipment to unify their update logic. (E.g., see BP_CharacterCustomization > Function: Apply Customization Profile > (3) Update Apparel). As we learned about new techniques to animate modular characters in Unreal Engine, it was a logical consequence to make a skeletal base class and replace the Custom Anim Blueprint property of our
BP_CDA_Hairstyle
with the new animation workflow using Post Process Anim Blueprints. (See Add your own CDA animations)
It comes with these variables:
Skeletal Mesh is the visual appearance of the skeletal CDA.
Additional Morph Targets define zero or more morph targets that are controlled on all the skeletal meshes the character is composed of. To the left is the morph target name and to the right is the strength as it appears in the skeletal mesh editor’s morph target list, which is usually set to 1.0. By e.g., adding (hair, 1.0) to voluminous hairstyle CDAs like the “afro”, we can control the “hair” morph target in specific hat meshes like the beanie to deform them as it would look like the hairs are stuffed under the hat – so that the hairs to not stick through the hat geometry.
There are several additional morph targets that are already present on one or the other type of CDA:
We have prepared all these morph targets in a 3d modelling software. They cannot be added to your custom meshes directly in engine. We only give you a tool for controlling own morph targets.
This is the abstract base class for apparels and inherits from BP_CDA_Skeletal. It is selectable by the WBP_CDA_ApparelPicker. It comes with these additional variables:
The main reason for having multiple apparel child classes – beside the information and logic described above – is that each class represents a possible apparel slot on the character. Each WBP_CDA_ApparelPicker in the editor can display all data assets of a specific CDA class, which lets you group them visually.
If you want to create e.g., custom backpack assets, then you would create a child blueprint class of BP_CDA_Apparel called BP_CDA_Apparel_Backpack and place another WBP_CDA_ApparelPicker in the editor for that new class.
This is the abstract base class for equipment and inherits from BP_CDA_Skeletal. Currently, it is not selectable in the in-game Character Editor. It has one example child class.
Coming with V4, we have decided to introduce equipment as a completely new sub class to clearly separate it from apparel and attachments, as potential equipment logic might differ from apparel a lot and needs skeletal meshes. Two logical differences to apparel on our side are that the equipment does not support body masks and changing the skin texture set. You are free to add more logic.
The main differences to Attachment Profiles (that are also meant to be for tools etc.) are that equipment uses a skeletal mesh and the new custom animation workflow instead of a static mesh without animations. Thus, if you need interactive items for your character, you should prefer equipment over attachments.
This is the abstract base class for hairstyles and inherits from BP_CDA_Skeletal. It is selectable by the WBP_CDA_HairstylePicker and it comes without additional variables as it only acts as a logically different parent class.
It previously came with this variable:
This is the abstract base class for Groom CDAs and inherits from BP_CustomizationDataAsset. It is selectable by the WBP_CDA_GroomPicker and comes with these variables:
[V8] In V8 Groom Update the Groom support has been extended after further evaluation since introducing it in V7 Customer Upgrade. It is currently only supported for the Metahuman anatomy and Groom assets are not delivered with this update. See tutorial Third Party Integration: Groom for Metahumans for details to learn how to implement your own Groom assets.
Unfortunately, we are not allowed to deliver ready-to-go Groom assets and CDAs to the Marketplace.
[V7] In the V7 Customer Update this was not an abstract class and the current child classes were not available.
You can create Groom assets an assign them to the Customization Profile and it will be applied to your character like other CDA types. All logical parts are already done.
To colorize Groom assets, currently, we only support the given materials on the Groom material slots as there is no Material Variant Index inside FGroomProfile as in other profiles like FApparelProfile. Thus, we always use an index of -1, meaning the default route, when applying Dynamic Material Instances.
Since V8 Groom Update, BP_CharacterCustomization ➝ Create MID by Material Variant was updated to handle the coloring correctly across different Groom LODs (Hair, Cards, Helmet). From now on, the function creates Dynamic Material Instances on all material slots instead of only the first slot (before V8 Groom Update), if MaterialVariantIndex is -1.
Note, that we are using MetaHumans/Common/Materials/M_hair_v4 for the current implementation and have prepared the color controls in the Character Editor for Parameter Names based on that material, thus using other base materials might not working properly out of the box. If there are more than the 3 material slots on your Groom asset, make sure, that all slots which should be colored the same way with the UI controls, must share the same base material or at least parameter names.
By default, in our tests MetaHumans/Common/Materials/M_hair_v4 did not show Ombre and Highlight colorization, since this is an optional feature of that material. If you want to turn it on, we found the following settings sensible. See below the image, that besides in-editor controls we have one parameter that is directly set in the material instance.
Parameter | Default Value | Name in Character Editor | |
---|---|---|---|
1. | Highlights | 1.0 | Highlight Alpha |
2. | HighlightsBlending | 0.1 | Highlight Blending |
3. | Ombre | 1.0 | Ombre Alpha |
4. | OmbreShift | 0.0 | Ombre Shift |
5. | HighlightsIntensity | 1.0 | * |
* There is no Float Slider for HighlightsIntensity in the editor. Setting this parameter directly to 1.0 in the material instances MI_Hair, MI_Hair_Cards, and MI_Hair_Helmet (as shown in the first image above) is like enabling Highlights for the Character Editor, and 0.0 disabling them. Then you can reduce or increase the amount by the Highlights
Float Slider. Depending on your own base material you might want to adjust other parameters.
In WBP_CharacteEditor there are CDA Pickers (replaces [V10 removed] CDA Groom Pickers) available for both head, beard (and [V10] eyebrows) classes inside the Expandable Categories named Hair (Groom), Beard (Groom) (and [V10] Eyebrows (Groom)).
Furthermore, there are several Float Sliders and HDR Color Pickers below the CDA pickers in the category Color (Groom) to control different values of the Groom Material we tested with, as described above.
The section comes with these parameters:
The Region XXX parameters are also prepared but not fully tested, yet, since we still try to fiddle with test Groom assets and did not get it properly working. We are sure, you do.
All controls are toggled in the WBP_CharacterEditor > Event Graph > Update Anatomy Specific Controls subgraph.
If you are using a different base material than MetaHumans/Common/Materials/M_hair_v4 on your Groom assets, adjust the Float Sliders and HDR Color Pickers various Parameter Name variables as desired. Their Tag variable has to be set to GroomGlobal.
You may want to set one ore more material parameters to a specific value in the base material by default as described above in Groom Material > Table row 5 for parameter Highlights Intensity.
This is the abstract base class for static CDAs and inherits from BP_CustomizationDataAsset
.
Coming with V4 Animation Update, this is a new base class for static CDAs like
BP_CDA_Attachment
and other potential CDAs to unify their update logic. (E.g., see BP_CharacterCustomization > Function: Apply Customization Profile > (4) Update Attachments)
It comes with these variables:
This is the abstract base class for attachments and inherits from BP_CDA_Static.
Currently, it is not selectable in the in-game Character Editor. It has one example child class.
The main reason for having multiple attachment child classes – besides the information and logic described above – is that each class represents a possible attachment slot on the character or type of attachment. Like for Apparels or Hairstyles you could display all data assets of a specific CDA class in separate attachment pickers, which lets you group them visually.
If you want to create e.g., custom two-handed assets, then you would create a child blueprint class of BP_CDA_Attachment called BP_CDA_Attachment_TwoHanded.