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.