-
Notifications
You must be signed in to change notification settings - Fork 0
Step 2: Character Selection
- Overview
- Quick Start
- Creating Character Data Assets
- Creating Character Selection UI
- Function Reference
- Example Usage Scenarios
- Troubleshooting
The Character Selection System allows players to choose between different character classes. Each character has different stats (Health, Speed, Damage, etc.).
This system is not tied to AURFTestPlayer. For production projects, each selectable character can use your own ACharacter or APawn class, as long as that class includes the required URF player components.
Recommended production player components:
URFHealthComponentURFExperienceComponentURFWeaponComponentURFPlayerStatsComponentURFLevelUpSystem-
URFVacuumComponentoptional
- ✅ Easy UI-like simple functions
- ✅ Character identity (name, description, icon)
- ✅ Individual stat getters (health, speed, damage, etc.)
- ✅ Formatted text output (ready for UI)
- ✅ No component reference required (static functions)
- ✅ Blueprint-friendly
- URFPlayerStatsDataAsset: Character definitions (stats, identity)
- URFCharacterSelectionLibrary: Easy UI functions (static)
- URFPlayerStatsComponent: Stats management on player
- Selected Pawn Class: The actual player Blueprint class to spawn. This can be your own
ACharacterorAPawn. This can be your ownACharacterorAPawn. It does not need to inherit fromAURFTestPlayer. If you use a custom production player, make sure it includes the required URF player components:URFHealthComponent,URFExperienceComponent,URFWeaponComponent,URFPlayerStatsComponent, andURFLevelUpSystem.
- Right-click in Content Browser → Miscellaneous → Data Asset
- Select URFPlayerStatsDataAsset
- Name it (e.g.,
DA_Character_Warrior) - Open the asset and configure settings
- Create User Interface → Widget Blueprint
- Add character buttons
- Bind character information to each button
- Spawn character on button click
The spawned character can be any custom
ACharacterorAPawn. After spawning, make sure thePlayerControllerpossesses it.URFGameDirectorwill then automatically use that possessed pawn as the player target.
Use Character Selection Library functions in Blueprint.
Character Name: "Warrior"
Character Description: "High health, slow movement, high damage"
Character Icon: [Select Texture2D]
Max Health: 200.0 (High for Warrior)
Armor: 0.1 (10% damage reduction)
Recovery: 1.0 (1 HP/s regen)
Move Speed: 500.0 (Slow for Warrior)
Might Multiplier: 1.3 (30% bonus damage)
Area Multiplier: 1.0 (normal area)
Speed Multiplier: 0.8 (20% slower projectiles)
Duration Multiplier: 1.0 (normal duration)
Cooldown Reduction: 0.0 (no cooldown reduction)
Amount Bonus: 0 (no extra projectiles)
Growth Multiplier: 1.0 (normal XP gain)
Greed Multiplier: 1.0 (normal Gold gain)
Magnet Radius: 100.0 (normal pickup range)
Luck Bonus: 0.0 (no luck bonus)
Health: 200
Armor: 10%
Speed: 500
Might: 130%
Health: 80
Armor: 0%
Speed: 650
Might: 150%
Area: 120%
Health: 120
Armor: 5%
Speed: 750
Might: 110%
Cooldown: 20%
- Character Selection Panel (Canvas Panel)
- Character Buttons (Button for each character)
- Character Info Display (Selected character information)
- Confirm Button (Confirm character and start game)
CharacterData: URFPlayerStatsDataAsset (Instance Editable: true)
- Character Icon (Image)
- Character Name (Text Block)
- Character Description (Text Block)
- Stats Display (Text Block)
Function: Update Character Button
Input: Character Data (URFPlayerStatsDataAsset)
↓
Get Character Name (Character Data)
↓
Set Text (Name Text Block)
↓
Get Character Icon (Character Data)
↓
Set Brush (Icon Image)
↓
Get Character Description (Character Data)
↓
Set Text (Description Text Block)
↓
Get Character Combat Stats (Character Data)
↓
Set Text (Stats Text Block)
Event: On Button Clicked
On Clicked (Character Button)
↓
Broadcast Event (Character Selected)
└─ Character Data: CharacterData
SelectedCharacter: URFPlayerStatsDataAsset
CharacterButtons: Array of WBP_CharacterButton
Event: Construct
Event Construct
↓
ForEachLoop (Character Buttons)
↓
Bind Event to On Character Selected
↓
Update Character Button (Character Data)
Event: On Character Selected
[Custom Event: Handle Character Selected]
Input: Character Data
↓
Set Selected Character (Character Data)
↓
Update Info Display
↓
Enable Confirm Button
Event: On Confirm Button Clicked
On Clicked (Confirm Button)
↓
Branch: Selected Character Valid?
├─ True:
│ ↓
│ Spawn Player with Character Data
│ ↓
│ Open Level (Game Level)
└─ False:
↓
Show Error ("Please select a character")
Returns the character name.
Get Character Name
└─ Character Data: DA_Character_Warrior
↓
Returns: "Warrior"
Returns the character description.
Get Character Description
└─ Character Data: DA_Character_Warrior
↓
Returns: "High health, slow movement, high damage"
Returns the character icon.
Get Character Icon
└─ Character Data: DA_Character_Warrior
↓
Returns: UTexture2D* (Icon)
Get Character Max Health (DA_Character_Warrior)
↓
Returns: 200.0
Get Character Move Speed (DA_Character_Warrior)
↓
Returns: 500.0
Get Character Might (DA_Character_Warrior)
↓
Returns: 1.3 (130% damage)
Other Individual Stat Functions:
- Get Character Armor
- Get Character Recovery
- Get Character Area
- Get Character Speed
- Get Character Duration
- Get Character Cooldown
- Get Character Amount
- Get Character Growth
- Get Character Greed
- Get Character Magnet
- Get Character Luck
Returns all stats as formatted text.
Get Character Stats Formatted (DA_Character_Warrior)
↓
Returns:
"=== COMBAT ===
Health: 200
Armor: 10%
Recovery: 1.0 HP/s
Speed: 500
=== WEAPON ===
Might: 130%
Area: 100%
Speed: 80%
Duration: 100%
Cooldown: 0%
=== PROGRESSION ===
Growth: 100%
Greed: 100%
Magnet: 100
Luck: 0"
Returns only combat stats.
Get Character Combat Stats (DA_Character_Warrior)
↓
Returns:
"Health: 200
Armor: 10%
Recovery: 1.0 HP/s
Speed: 500"
Returns only weapon stats.
Get Character Weapon Stats (DA_Character_Warrior)
↓
Returns:
"Might: 130%
Area: 100%
Speed: 80%
Duration: 100%
Cooldown: 0%"
Returns only progression stats.
Get Character Progression Stats (DA_Character_Warrior)
↓
Returns:
"Growth: 100%
Greed: 100%
Magnet: 100
Luck: 0"
Goal: Choose from 3 characters, start game.
Steps:
- Create Character Selection widget
- Add 3 buttons (Warrior, Mage, Rogue)
- Assign Character Data Asset to each button
- Button click → Select character → Start game
Blueprint:
// Button 1 (Warrior)
On Clicked
↓
Set Selected Character (DA_Character_Warrior)
↓
Update Info Display
// Confirm Button
On Clicked
↓
Spawn Player with Selected Character
↓
Open Level (Game Level)
Goal: Show all stats when character is selected.
Blueprint:
On Character Selected
↓
Get Character Name (Selected Character)
↓
Set Text (Name Text)
↓
Get Character Stats Formatted (Selected Character)
↓
Set Text (Stats Text)
↓
Get Character Icon (Selected Character)
↓
Set Brush (Icon Image)
Goal: Compare two characters side by side.
Blueprint:
// Character 1 Stats
Get Character Combat Stats (DA_Character_Warrior)
↓
Set Text (Character 1 Stats)
// Character 2 Stats
Get Character Combat Stats (DA_Character_Mage)
↓
Set Text (Character 2 Stats)
// Comparison
Branch: Warrior Health > Mage Health?
├─ True: Highlight Warrior Health (Green)
└─ False: Highlight Mage Health (Green)
Goal: Automatically create character buttons from Data Asset array.
Blueprint:
Variables:
- CharacterDataArray: Array of URFPlayerStatsDataAsset
Event Construct
↓
ForEachLoop (CharacterDataArray)
↓
Create Widget (WBP_CharacterButton)
↓
Get Character Name (Character Data)
↓
Set Button Text
↓
Get Character Icon (Character Data)
↓
Set Button Icon
↓
Add to Vertical Box
Goal: Some characters are locked initially.
Blueprint:
Function: Is Character Unlocked
Input: Character Data
↓
Get Character Name
↓
Check Save Game (Unlocked Characters)
↓
Branch: Is Unlocked?
├─ True: Enable Button
└─ False: Disable Button, Show Lock Icon
Problem: Get Character Name returns empty.
Solutions:
-
Is Character Data Asset null?
- Is Character Data variable set in widget?
- Is Data Asset assigned to button?
-
Does Data Asset have information?
- Is Character Name filled?
- Is Character Icon assigned?
Problem: Stat values differ from expected.
Solutions:
-
Check Data Asset:
- Are Base Stats entered correctly?
- Are multipliers 1.0-based? (1.3 = 130%)
-
Check formatted text:
- If using Get Character Stats Formatted, is format correct?
- Is percentage conversion happening? (x100)
Problem: Character selected but player doesn't spawn.
If using a custom production player, make sure the selected pawn class:
- Inherits from
ACharacterorAPawn - Has
URFPlayerStatsComponent - Has the required URF components for your game
- Is assigned in the character selection flow
- Is possessed by the player controller after spawn
Solutions:
-
Is Selected Character null?
- Is character selection done correctly?
- Is Selected Character variable set?
-
Player spawn logic:
- Is Spawn Player function correct?
- Is Character Data Asset assigned to player?
Example Spawn Logic:
Spawn Actor from Class (BP_Player)
↓
Get Player Stats Component
↓
Set Player Stats Data Asset (Selected Character)
↓
Possess Player
If you use your own ACharacter or APawn, make sure:
- The spawned character is possessed by the
PlayerController - The character has the required URF player components
- Damage is routed with
Event AnyDamage->URFHealthComponent.TakeSimpleDamage - Your GameMode or spawn logic is not still using the old demo player
Create your own stat format:
Function: Get Custom Stats Format
Input: Character Data
↓
Get Character Max Health
↓
Get Character Might
↓
Format Text ("HP: {0} | DMG: {1}%")
├─ {0}: Health
└─ {1}: Might * 100
↓
Return: Formatted Text
Organize characters into tiers (S, A, B, C):
Function: Get Character Tier
Input: Character Data
↓
Get Character Stats
↓
Calculate Total Power (Health + Might + Speed)
↓
Branch: Total Power > 1000?
├─ True: Return "S Tier"
├─ > 800: Return "A Tier"
├─ > 600: Return "B Tier"
└─ Else: Return "C Tier"
Recommend character based on play style:
Function: Recommend Character
Input: Play Style (Aggressive, Defensive, Balanced)
↓
Branch: Play Style
├─ Aggressive: Return DA_Character_Mage
├─ Defensive: Return DA_Character_Warrior
└─ Balanced: Return DA_Character_Rogue
If you encounter issues:
- Ensure Character Data Asset is filled
- Check that Character Data variable is set in widget
- Check Output Log (warning messages)
- Discord: https://discord.gg/QJxvpuyUv8
- GitHub: https://github.com/CanTATARDev/UltimateRoguelikeFramework
Note: This system is optimized for Vampire Survivors-style roguelike games. Customization may be needed for different game types.