Unreal Engine 5.6μΌλ‘ ꡬνλ ν΄μ μ μ RPGμ λλ€. Baldur's Gate 3μ μ ν¬ μμ€ν κ³Ό D&D 5νμ νλλ ₯ μμ€ν (Action/Bonus Action/Reaction/Movement)μ C++ κΈ°λ°μΌλ‘ μ¬νν©λλ€.
- μ£Όμ νΉμ§
- κΈ°μ μ€ν
- νλ‘μ νΈ κ΅¬μ‘°
- ν΅μ¬ μμ€ν
- μ€ν λ°©λ²
- κ°λ° νκ²½
- κ²μνλ μ΄
- νμ¬ μν
- ν΄μ μ ν¬ λ£¨ν: D&D 5ν Initiative μμ€ν κΈ°λ° ν΄ μμ κ΄λ¦¬
- νλλ ₯ μμ€ν : Action, Bonus Action, Reaction, Movement 4κ°μ§ νλ μμ° κ΄λ¦¬
- μ€ν¬ μ€ν νμ΄νλΌμΈ: μμ½(Reserve) β νκ²ν (Targeting) β νμ (Commit) β μ€ν(Execute) 4λ¨κ³ μν¬νλ‘μ°
- νκ²ν μμ€ν : λ¨μΌ/λ€μ€/μμ/μκ° νκ²ν μ§μ, μ¬κ±°λ¦¬ λ° μ΅λ λμ μ κ²μ¦
- λ°λ―Έμ§ κ³μ°: D&D μ£Όμ¬μ μμ€ν (NdM) κΈ°λ° λ°λ―Έμ§ λ‘€
- μ ν¬ HUD:
- νλ μ¬λ‘― 그리λ (μ€ν¬ μμ΄μ½, μΏ¨λ€μ΄, μ¬μ© κ°λ₯ μ¬λΆ)
- ν΄ μμ νμ (μΊλ¦ν° μ΄μν + HP λ°)
- μ€μκ° νλλ ₯ λ° μ΄λ 거리 νμ
- μ ν¬ μ°μΆ: μΉλ¦¬/ν¨λ°° Fade-out μ λλ©μ΄μ , ν¬νΈλ μ΄νΈ μ ν
- μμ ― 컨νΈλ‘€λ¬ ν¨ν΄: UI λ‘μ§κ³Ό λ°μ΄ν° λΆλ¦¬
- μ AI FSM: Idle β Plan β Execute μν λ¨Έμ
- μλ νλ: λμ μ ν (μ΅κ·Όμ /μ΅μ 체λ ₯), μ€ν¬ μ ν, μ΄λ λ° κ³΅κ²©
- ν΄ μλ μ’ λ£: AI νλ μλ£ μ μλμΌλ‘ λ€μ ν΄ μ§ν
- λ°°κ²½μμ λ° ν¨κ³Όμ (μ ν¬, λ©λ΄, μ€ν¬)
- μ λλ©μ΄μ + Niagara μ΄ννΈ ν΅ν©
- AnimNotify κΈ°λ° νμ΄λ° λκΈ°ν
- Unreal Engine 5.6
- C++ λͺ¨λ:
BG3(Runtime) - λΈλ£¨νλ¦°νΈ: UI μμ ―, μμ μ€μ
| μμ€ν | μ¬μ©μ² |
|---|---|
| UMG (Unreal Motion Graphics) | μ ν¬ UI, λ©μΈ λ©λ΄ |
| Enhanced Input System | λ§μ°μ€ ν΄λ¦, νμ /μ·¨μ μ λ ₯ |
| Navigation System (NavMesh) | AI λ° νλ μ΄μ΄ μ΄λ κ²½λ‘ κ³μ° |
| AIModule | μ AI FSM |
| Niagara | μ€ν¬ μ΄ννΈ (Fireball λ±) |
| AnimNotify | μ λλ©μ΄μ ννΈ νμ΄λ° |
| Gameplay Tags | λ°λ―Έμ§ νμ
λΆλ₯ (Damage.Physical) |
| Data Assets | μ€ν¬ μ μ, μΊλ¦ν° μ΄κΈ° μ 보 |
| Subsystems (WorldSubsystem) | μ μ κ²μ μν κ΄λ¦¬ |
E:\UnrealProject\BG3/
βββ Source/BG3/ # C++ μμ€ μ½λ
β βββ Public/ # ν€λ νμΌ (54κ°)
β β βββ Character/ # μΊλ¦ν° (Base, Player, Enemy)
β β βββ Component/ # κ²μ μ»΄ν¬λνΈ (SkillBook, Stats, AI)
β β βββ Game/ # κ²μ λ§€λμ λ° Subsystems
β β β βββ Skill/ # μ€ν¬ μ€ν (Tasks, Projectile)
β β βββ Data/ # λ°μ΄ν° μμ
(Skill, Stats)
β β βββ UI/ # UI μμ ― λ° μ»¨νΈλ‘€λ¬
β β βββ Controller/ # νλ μ΄μ΄ 컨νΈλ‘€λ¬
β β βββ Manager/ # μΉ΄λ©λΌ, μ£Όμ¬μ λ§€λμ
β β βββ Interface/ # μΈν°νμ΄μ€ (ActionBudgetProvider)
β βββ Private/ # ꡬν νμΌ (56κ° .cpp)
βββ Config/ # νλ‘μ νΈ μ€μ
β βββ DefaultEngine.ini
β βββ DefaultGame.ini
β βββ DefaultGameplayTags.ini
β βββ DefaultInput.ini
βββ Content/ # κ²μ μμ
(λΈλ£¨νλ¦°νΈ, λ©μ, μ λλ©μ΄μ
)
βββ BG3.uproject # νλ‘μ νΈ νμΌ
βββ BG3.sln # Visual Studio μ루μ
νλ μ΄μ΄ μ€ν¬ λ²νΌ ν΄λ¦
β
1. Reserve (μμ½)
- SkillBookComponent::ReserveUse()
- νλλ ₯ μλΉ κ²μ¦ (IActionBudgetProvider)
- μμ½ μν μ€μ
β
2. Targeting (νκ²ν
)
- USkillExecutionSubsystem::RequestCast()
- λμ μ ν (λ§μ°μ€ ν΄λ¦)
- μ¬κ±°λ¦¬, μ΅λ λμ μ κ²μ¦
β
3. Confirm (νμ )
- USkillExecutionSubsystem::ConfirmAndExecute()
- Task λ°°μ΄ μμ± (USkillCastExecutor)
β
4. Execute (μ€ν)
- Task μμ°¨ μ€ν (FaceTarget β MoveTo β PlayMontage β Damage)
- λ°λ―Έμ§ μ μ© (μ£Όμ¬μ λ‘€)
β
5. Finalize (μλ£)
- μΏ¨λ€μ΄ μ μ©
- μν μ΄κΈ°ν
μ€ν¬ μ€νμ μμ λΉλκΈ° λ¨κ³λ‘ λΆν νμ¬ μμ°¨ μ€μΌμ€νΈλ μ΄μ :
| Task | μν |
|---|---|
| SkillTaskFaceTarget | λμ λ°©ν₯μΌλ‘ μΊλ¦ν° νμ |
| SkillTaskMoveTo | NavMesh κ²½λ‘ μ΄λ (μ¬κ±°λ¦¬ μ§μ ) |
| SkillTaskPlayMontage | 곡격 μ λλ©μ΄μ μ¬μ (AnimNotify λκΈ°) |
| SkillTaskSpawnProjectile | λ°μ¬μ²΄ μμ± λ° λ°μ¬ |
| SkillTaskSpawnSystem | Niagara μ΄ννΈ μμ± |
| SkillTaskEndTurn | ν΄ μ’ λ£ μ²λ¦¬ |
μμ - κ·Όμ 곡격 μ€ν νλ¦:
Task 1: FaceTarget β λμ λ°©ν₯
Task 2: MoveTo β μ¬κ±°λ¦¬ μ§μ
Task 3: PlayMontage β 곡격 μ λλ©μ΄μ
[AnimNotify "Hit" λ°μ]
β
λ°λ―Έμ§ μ μ© (μ£Όμ¬μ λ‘€)
Task 4: EndTurn β ν΄ μ’
λ£| νλ μ ν | ν΄λΉ κ°μ | λΉμ© | μμ |
|---|---|---|---|
| Action | 1 | 1 | 곡격, μ£Όλ¬Έ, ννΌ |
| Bonus Action | 1 | 1 | 보쑰 μ£Όλ¬Έ, νΉμ λ₯λ ₯ |
| Reaction | 1 | 1 | κΈ°ν 곡격, λ°μ λ§λ² |
| Movement | ~10μΉΈ | 750 μ λ | μ΄λ 거리 |
ꡬν μΈν°νμ΄μ€:
class IActionBudgetProvider
{
virtual bool CanSpendActionSlot(EActionCost Cost) = 0;
virtual void SpendActionSlot(EActionCost Cost) = 0;
virtual void RefundActionSlot(EActionCost Cost) = 0;
virtual void BeginTurnReset() = 0; // ν΄ μμ μ μ΄κΈ°ν
};μ£Όμ ν΄λμ€:
ABaseCharacter: λͺ¨λ μΊλ¦ν°μ κΈ°λ³Έ ν΄λμ€, νλλ ₯ λ° μ€ν¬λΆ κ΄λ¦¬USkillBookComponent: μ€ν¬ λͺ©λ‘ λ° λ°νμ μν (μΏ¨λ€μ΄, μμ½)UCharacterStatsComponent: HP, Mana, μ΄λ 거리
UBG3GameManageSubsystem::InitializeGame()
β
1. μΊλ¦ν° μμ±
- SpawnPlayers() β νλ μ΄μ΄ νν°
- SpawnEnemies() β μ κ·Έλ£Ή
β
2. Initiative κ³μ°
- CalcInitiative() = 1d20 + DEX μμ μ
- CombatPawns[] μ λ ¬ (λ΄λ¦Όμ°¨μ)
β
3. ν΄ λ£¨ν
BeginNextTurn()
ββ CurrentCharacter.BeginTurnReset()
β ββ νλλ ₯ μ΄κΈ°ν, μΏ¨λ€μ΄ -1
ββ νλ μ΄μ΄ ν΄: μ
λ ₯ λκΈ°
β ββ μ€ν¬ μ ν β νκ²ν
β μ€ν β ν΄ μ’
λ£ λ²νΌ
ββ μ ν΄: AI μλ μ€ν
β ββ Plan (λμ μ ν) β Execute (μ€ν¬ μ€ν) β μλ ν΄ μ’
λ£
ββ DecideWhoWin() β μ ν¬ μ’
λ£ νμ
μΉν¨ νμ :
- λͺ¨λ μ μ΄ μ¬λ§ β νλ μ΄μ΄ μΉλ¦¬
- λͺ¨λ νλ μ΄μ΄κ° μ¬λ§ β μ μΉλ¦¬
- UI Fade-out μ λλ©μ΄μ μ¬μ
μν λ¨Έμ :
enum class ECharacterState : uint8
{
None, // μ΄κΈ°ν
Idle, // ν΄ λκΈ°
Plan, // νλ κ³ν (λμ/μ€ν¬ μ ν)
Execute // νλ μ€ν (Task μμ°¨ μ€ν)
};AI λ‘μ§:
- StartMyTurn(): Idle β Plan
- Plan λ¨κ³:
FindNearestTarget(): μ΅κ·Όμ λμ μ νFindLowestHPTarget(): μ΅μ 체λ ₯ λμ μ ν- μ€ν¬ μ ν (μ€ν¬ ID: 1, 20, 85, 86, 888)
- Execute λ¨κ³:
DoAction(skillID): μ€ν¬ μ€ν μμ²- Task μμ°¨ μ€ν (μ΄λ β νμ β 곡격)
- EndMyTurn(): ν΄ μ’ λ£ μ νΈ
| Widget | μν |
|---|---|
| OverlayWidget | λ©μΈ μ ν¬ HUD (νλ μ¬λ‘― + ν΄ μ 보) |
| CombatActionPanel | νλ μ¬λ‘― 그리λ (μ€ν¬ λ²νΌ) |
| ActionSlotEntry | κ°λ³ μ€ν¬ λ²νΌ (μμ΄μ½, μΏ¨λ€μ΄, μ¬μ© κ°λ₯ μ¬λΆ) |
| PlayerHpFrameWidget | νλ μ΄μ΄ HP λ° |
| CharacterTurnHpWidget | ν΄ μμ νμ (μ΄μν + HP) |
| TurnOrderFrameWidget | ν΄ μμ λͺ©λ‘ |
| TurnEndWidget | ν΄ μ’ λ£ λ²νΌ |
| PlayerPortraitWidget | μΊλ¦ν° μ΄μν |
| PressEnterKeyWidget | μ ν¬ κ²°κ³Ό νλ©΄ (Enter λκΈ°) |
| MainMenuWidget | λ©μΈ λ©λ΄ |
UOverlayWidgetController
ββ Initialize(Character, PlayerController)
ββ RefreshSlots() // νλ μ¬λ‘― κ°±μ
ββ BuildAndBroadcast() // UI λ°μ΄ν° λΈλ‘λμΊμ€νΈ
// μ΄λ²€νΈ λΈλ¦¬κ²μ΄νΈ
FOnActionSlotsUpdated OnActionSlotsUpdated;
FOnStatChangedUI OnHealthChanged;
FOnMoveDistanceChangedUI OnMoveDistanceChanged;
FOnFadeOutAnimationStart OnFadeOutAnimationStart;BG3.uprojectλ₯Ό Unreal Engine 5.6 μλν°μμ μ½λλ€.Content/Maps/Dream_Islandλ 벨μ μ½λλ€.- Play λ²νΌμ λλ¬ μ ν¬λ₯Ό μμν©λλ€.
- Visual Studioμμ
BG3.slnμ μ½λλ€. - μ½λ μμ ν λΉλ (
Ctrl+Shift+B). - μλν°μμ ν« λ¦¬λ‘λ λλ μλν° μ¬μμ.
Content/Maps/MainMenuMapλ 벨 μ€ν.- λ©μΈ λ©λ΄μμ Start Game ν΄λ¦.
- μ ν¬ λ 벨 (
Dream_Island)λ‘ μ ν.
- Unreal Engine: 5.6 μ΄μ
- IDE: Visual Studio 2022 (κΆμ₯)
- μ΄μ체μ : Windows 10/11
- .NET Framework: 4.6.2 μ΄μ
- κ²μ κΈ°λ³Έ λ§΅:
MainMenuMap - μλν° μμ λ§΅:
Dream_Island - ν΄μλ: 1920x1080 (DesignScreenSize)
- UI μ€μΌμΌ κ·μΉ: ShortestSide
- νκ² νλμ¨μ΄: Desktop, Maximum Graphics
- λ§μ°μ€ μ’ν΄λ¦: μ΄λ λλ λμ μ ν
- λ§μ°μ€ μ°ν΄λ¦: μ€ν¬ μ€ν νμ (Confirm)
- ESC: μ€ν¬ μ·¨μ (Cancel)
- μ€ν¬ λ²νΌ ν΄λ¦: μ€ν¬ μμ½ λ° νκ²ν μμ
- Turn End λ²νΌ: νμ¬ ν΄ μ’ λ£
- κ²μ μμ: Initiative λ‘€ β ν΄ μμ κ²°μ
- νλ μ΄μ΄ ν΄:
- μ΄λ: λ§μ°μ€ ν΄λ¦ (NavMesh κ²½λ‘ νμ)
- μ€ν¬ μ¬μ©:
- μ€ν¬ λ²νΌ ν΄λ¦ (νλλ ₯ μλΉ)
- λμ μ ν (λ§μ°μ€ ν΄λ¦)
- μ°ν΄λ¦μΌλ‘ νμ β Task μ€ν
- ν΄ μ’ λ£: Turn End λ²νΌ ν΄λ¦
- μ ν΄: AI μλ μ€ν (λμ μ ν β μ΄λ β 곡격)
- μ ν¬ μ’ λ£: μΉλ¦¬/ν¨λ°° νλ©΄ β Enterλ‘ λ©μΈ λ©λ΄
| μ€ν¬ ID | μ΄λ¦ | νμ | μ¬κ±°λ¦¬ | λ°λ―Έμ§ |
|---|---|---|---|---|
| 1 | Melee Attack | κ·Όμ | 3m | 1d8 + STR |
| 20 | Ranged Attack | μ거리 | 18m | 1d10 + DEX |
| 85 | Fireball | λ§λ² (μμ) | 30m | 8d6 (Fire) |
| 86 | Magic Missile | λ§λ² (λ°μ¬μ²΄) | 36m | 1d4+1 (Force) |
| 888 | Dash | λΉμ ν¬ | - | μ΄λ 거리 2λ°° |
- β μ ν¬ μμ€ν : ν΄μ μ ν¬ λ£¨ν, νλλ ₯ κ΄λ¦¬
- β μ€ν¬ μ€ν: μμ½βνκ²ν β컀λ°βTask μ€ν
- β UI μμ€ν : νλ μ¬λ‘―, ν΄ μμ, HP λ°, μ ν¬ κ²°κ³Ό
- β μ΄λ μμ€ν : NavMesh κΈ°λ°, 거리 μ ν, μ€μκ° νμ
- β μ AI: κ°λ¨ν FSM (Plan β Execute)
- β μ°μΆ: Fade-out μ λλ©μ΄μ , ν¬νΈλ μ΄νΈ μ ν
- β μ¬μ΄λ: λ°°κ²½μμ , ν¨κ³Όμ (μ ν¬, μ€ν¬)
- β¬ λ°μ΄ν° μμ μμΉν: λͺ¨λ μ€ν¬ νλΌλ―Έν°λ₯Ό μλν°μμ νΈμ§ κ°λ₯νκ²
- β¬ λΈλ£¨νλ¦°νΈ μλν: μ€ν¬ μ μ νλ‘μΈμ€ κ°μν
- β¬ UI λ°μΈλ© μ 리: Widget-Controller κ° λμ¨ν κ²°ν© κ°ν
- β¬ λ 볡μ‘ν AI: 거리 κ³μ°, λν λͺΉ, μ‘°κ±΄λΆ νλ
- β¬ μΆκ° μ€ν¬: λ²ν/λλ²ν, μΉμ , μμ μ§μ ν¨κ³Ό
- β¬ λ€νΈμν¬ λκΈ°ν: λ©ν°νλ μ΄μ΄ μ§μ (μ ν)
- μ€κ³ λ¬Έμ:
Docs/Design_SkillExecutionSubsystem.md - μ»€λ° μμ½:
Lauren_commit_summary_2025-09-16_19.txt
μ΄ νλ‘μ νΈλ νμ΅ λͺ©μ μΌλ‘ μ μλμμ΅λλ€.
νλ‘μ νΈ κ΄λ ¨ λ¬Έμλ GitHub Issuesλ₯Ό ν΅ν΄ μ μΆν΄μ£ΌμΈμ.
νλ‘μ νΈ λͺ©ν: C++ κΈ°λ°μ λΉ λ₯Έ μ ν¬ λ£¨ν κ²μ¦, μ€ν¬ μμ½βνκ²ν βμ»€λ° νμ΄νλΌμΈ, ν΄μ UI ν΅ν©, AI μ ν΄ μλν, μ ν¬ μ°μΆ λ° μ¬μ΄λ μμ±λ ν보