The in-game character editor is the visual core part of the product and exposes mostly all functionality of the BP_CharacterCustomization component as a vast ready-to-use and extensible showcase.
This widget displays all the character editor sub widgets. The following chapters shows you how these widgets are linked to the BP_CharacterCustomization
component (in this chapter in short “CC”).
Passes the BP_CharacterCustomization
and BP_CharacterEditor
components to the widget and comes with a FirstInitialization
mode which shall be true
when called from the BP_CharacterEditor
component and false
from RefreshCharacterEditor function. After setting these variables the actual initialization happens in the Sub Graphs described below.
Is used when loading a profile from save game and simply re-initializes the character editor without binding again to all the event dispatchers.
Initializes the Skin Appearance picker. OnValueChanged
is bound to CC > SetSkinMaterialIndex
.
Initializes the Face Head and Face Variant pickers.
[V8] Uses BP_CharacterCustomization > GetCurrentFaceVariant
to populate the Face Variant picker with a group name from the Anatomy Profiles.
Gets all widgets of type WBP_MorphTargetPicker in the viewport and initializes them. OnValueChanged
is bound to CC > SetBasebodyMorphTarget
. A value of 1.0
is applied to the selected morph targets and 0.0
to all other in their group, which in fact let us select a specific morph target (e.g., a face variant).
Gets all widgets of type WBP_FloatSlider in the viewport and initializes them – depending on their Tag
– from different value sources and their OnValueChanged
are bound to different functions of the CC as well.
Gets all widgets of type WBP_CDA_HDR_ColorPicker in the viewport. The rest of the logic is like Float Sliders since we use different types of HDR Color Pickers.
Gets all widgets of type WBP_CDA_GroomPicker in viewport and initialize them, depending on available Groom CDAs in the CurrentCustomizationProfile
. OnValueChanged
is bound to CC > SetCDA_HairstyleProfile
and [V2] SetCollection
of the CDA_CollectionPicker_Hairstyle
.
Gets all widgets of type WBP_CDA_HairstylePicker in viewport and initialize them, depending on available Hairstyle CDAs in the CurrentCustomizationProfile
. OnValueChanged
is bound to CC > SetCDA_HairstyleProfile
and [V2] SetCollection
of the CDA_CollectionPicker_Hairstyle
.
[V2] Additionally, the CDA_CollectionPicker_Hairstyle
gets initialized, which handles Collections in the editor. Its own OnValueChanged
is bound to save the selected collection per anatomy profile.
Gets all widgets of type WBP_CDA_ApparelPicker in viewport and initializes them, depending on available Apparel CDAs in the CurrentCustomizationProfile
. OnValueChanged
is bound to CC > SetCDA_HairstyleProfile
and [V2] SetCollection
of the CDA_CollectionPicker_Apparel
.
[V2] Additionally, the CDA_CollectionPicker_Apparel
gets initialized, which handles Collections in the editor. Its own OnValueChanged
is bound to save the selected collection per anatomy profile.
Gets all widgets of type WBP_ExpandableCategory and finds all WBP_TaggedUserWidget
in them. If they have set “CanBeRandomized” to true, they get bound to the randomize button of the Expandable Category. The randomize button will be enabled automatically if any child is bound.
Gets all widgets of type WBP_TaggedUserWidget – the base class of all value controls – in viewport and post initializes them, which in most cases just calls their OnValueChanged
to update customization on the character that is being edited.
Toggles some controls or value ranges depending on the anatomy. E.g., children do not have sliders for weight, muscles, and age as well as a different value range for their size slider. Also, only male adults can use the new WBP_CDA_HairstylePicker
for beards.
Additionally, Groom or MetaHuman specific controls like for eyes on the right screenshots are toggled completely. See BP_CDA_Groom for details.
Initializes the light settings.
Initializes all beta features in the left bottom corner of the UI.
As its name says, the Profile Manager gets initialized at the very end, so all other widgets have their initialization and event dispatcher bindings done. Depending on the Current Customization Profile, the Profile Manager gets updates its selected Anatomy and fills the Profile Name.
It is responsible for saving and loading profiles.