๐Ÿ“˜TIL - ์—ํ”ฝ ๋ชฌ์Šคํ„ฐ ๋ฒ„๊ทธ ์ˆ˜์ • & VFX ์ ์šฉ

HappyCircleยท2026๋…„ 6์›” 18์ผ

Unreal ๊ฐœ๋ฐœ

๋ชฉ๋ก ๋ณด๊ธฐ
148/163

๋ฐฐ๊ฒฝ

์˜ค๋Š˜์€ ์—ํ”ฝ ๋ชฌ์Šคํ„ฐ(๋“œ๋ž˜๊ณคยท๋‚˜๋ฌด ๋ชฌ์Šคํ„ฐยท๋ฐ”์œ„ ๋ชฌ์Šคํ„ฐ) ์ „๋ฐ˜์— ๊ฑธ์ณ ์„ธ ๊ฐ€์ง€ ํฐ ์ฃผ์ œ๋ฅผ ๋‹ค๋ค˜๋‹ค.

  1. ๋ฒ„๊ทธ ์ˆ˜์ •: ํˆฌ์‚ฌ์ฒด ๋ฐ๋ฏธ์ง€, ํŒจ๋ฆฌ ๋ฐ˜์‚ฌ, ๊ทธ๋กœ๊ธฐ ์ ์šฉ, ์ง€์ƒ ์ด๋™ ์• ๋‹ˆ๋ฉ”์ด์…˜, ๋ผ๋ฐ” ํˆฌ์‚ฌ์ฒด VFX
  2. ์ฝ”๋“œ ๊ฒฉ๋ฆฌ: ์—ํ”ฝ ๋ชฌ์Šคํ„ฐ ์ „์šฉ ๋กœ์ง์ด ๊ณตํ†ต ํŒŒ์ผ์„ ์˜ค์—ผ์‹œํ‚ค๋Š” ๋ฌธ์ œ์˜ ์›์ธ ๋ถ„์„ ๋ฐ ์•„ํ‚คํ…์ฒ˜ ๋ถ„๋ฆฌ ๋ฐฉํ–ฅ ์ˆ˜๋ฆฝ
  3. VFX ๊ตฌํ˜„: Dragon Meteor, Water Projectile ๋‘ ํˆฌ์‚ฌ์ฒด์˜ Niagara VFX ์‹ ๊ทœ ์ œ์ž‘

์ฒ˜์Œ์—๋Š” ๊ฐ๊ฐ ๋…๋ฆฝ๋œ ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋ณด์˜€์ง€๋งŒ, ํˆฌ์‚ฌ์ฒด ์ถฉ๋Œ ์ฒ˜๋ฆฌ โ†’ GAS GameplayEffect ์ ์šฉ โ†’ ํŒจ๋ฆฌ ์ƒํƒœ ํƒœ๊ทธ โ†’ ํŒจํ„ด ์นด์šดํ„ฐยท๊ทธ๋กœ๊ธฐ ์ด๋ฒคํŠธ โ†’ ๊ณต์ค‘/์ง€์ƒ ์ƒํƒœ ์ „ํ™˜ โ†’ AnimBP ์†๋„ ๋ณ€์ˆ˜ยท์Šฌ๋กฏ ๋ชฝํƒ€์ฃผ โ†’ ์ปค๋งจ๋“œ๋ ›์„ ํ†ตํ•œ Blueprint/Asset CDO ์„ค์ •๊นŒ์ง€ ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ์ด ์ด์–ด์ ธ ์žˆ์—ˆ๋‹ค.


๋ชฉ์ฐจ

  1. ํˆฌ์‚ฌ์ฒด ๋ฐ๋ฏธ์ง€ ๋ฏธ์ ์šฉ
  2. ํŒจ๋ฆฌ ๋ฐ˜์‚ฌ ๋ฏธ์ž‘๋™
  3. ๋ฐ˜์‚ฌ ํˆฌ์‚ฌ์ฒด ๊ทธ๋กœ๊ธฐ ์ ์šฉ ๋ฌธ์ œ
  4. ๋“œ๋ž˜๊ณค ์ง€์ƒ ์ด๋™ ์ค‘ idle ๋ฏธ๋„๋Ÿฌ์ง
  5. ๋“œ๋ž˜๊ณค AnimBP/BlendSpace ๊ตฌ์กฐ ๋ณด์ •
  6. ๋ผ๋ฐ” ํˆฌ์‚ฌ์ฒด VFX ๊ฒฉ์ž ํŒŒํ‹ฐํด ๋ฌธ์ œ
  7. ์—ํ”ฝ ๋ชฌ์Šคํ„ฐ ์ฝ”๋“œ ๊ฒฉ๋ฆฌ โ€” ์›์ธ ๋ถ„์„ & ์•„ํ‚คํ…์ฒ˜ ๋ถ„๋ฆฌ
  8. Dragon Meteor VFX ๊ตฌํ˜„
  9. Water Projectile VFX ๊ตฌํ˜„
  10. ๊ฒ€์ฆ ๊ฒฐ๊ณผ
  11. ์˜ค๋Š˜ ๋ฐฐ์šด ์ 
  12. ๋‹ค์Œ์— ๋น„์Šทํ•œ ๋ฒ„๊ทธ๊ฐ€ ๋‚˜๋ฉด ๋ณผ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

1. ํˆฌ์‚ฌ์ฒด ๋ฐ๋ฏธ์ง€ ๋ฏธ์ ์šฉ

์ฆ์ƒ

๋“œ๋ž˜๊ณค์ด ๋ฐœ์‚ฌํ•œ ๋ผ๋ฐ” ํˆฌ์‚ฌ์ฒด๊ฐ€ ํ”Œ๋ ˆ์ด์–ด์—๊ฒŒ ๋‹ฟ์•„๋„ ๋ฐ๋ฏธ์ง€๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์•˜๋‹ค. ํˆฌ์‚ฌ์ฒด ์ž์ฒด๋Š” ์Šคํฐ๋˜๊ณ  ์ถฉ๋Œ๋„ ๋ฐœ์ƒํ–ˆ์ง€๋งŒ, GAS ๋ฐ๋ฏธ์ง€ ์ ์šฉ๊นŒ์ง€ ์ด์–ด์ง€์ง€ ์•Š์•˜๋‹ค.

์›์ธ

AEnemyProjectile::OnProjectileOverlap์˜ ์ถฉ๋Œ ์ฒ˜๋ฆฌ ์ˆœ์„œ ๋ฌธ์ œ๋‹ค. ํˆฌ์‚ฌ์ฒด BP CDO์— DamageEffectClass๊ฐ€ ์—†๊ฑฐ๋‚˜, ๋ฐ˜์‚ฌ ํŒ์ •๊ณผ ๋ฐ๋ฏธ์ง€ ํŒ์ •์˜ ์ˆœ์„œ๊ฐ€ ์ถฉ๋Œํ•˜๋ฉด ๋ฐ๋ฏธ์ง€๊ฐ€ ๋ฌปํžŒ๋‹ค.

์˜ฌ๋ฐ”๋ฅธ ์ฒ˜๋ฆฌ ์ˆœ์„œ:
1. ๋ฌด์‹œํ•ด์•ผ ํ•˜๋Š” ์•กํ„ฐ์ธ์ง€ ํ™•์ธ
2. ์ด๋ฏธ ๋ฐ˜์‚ฌ๋œ ํˆฌ์‚ฌ์ฒด์ธ์ง€ ํ™•์ธ (HandleReflectedOverlap)
3. ๋Œ€์ƒ ASC ํš๋“
4. ํŒจ๋ฆฌ ์ค‘์ด๋ฉด ๋ฐ˜์‚ฌ ์ฒ˜๋ฆฌ (TryReflectOnHit)
5. ์ผ๋ฐ˜ ํ”ผ๊ฒฉ์ด๋ฉด DamageEffect ์ ์šฉ
6. ๋„‰๋ฐฑ, Impact VFX, Destroy ์ฒ˜๋ฆฌ

๊ตฌํ˜„ ์ˆ˜์ •

Source/Retrieve/AbilitySystem/Enemy/EnemyProjectile.cpp์—์„œ ์ถฉ๋Œ ํ๋ฆ„์„ ์ •๋ฆฌํ–ˆ๋‹ค.

if (HandleReflectedOverlap(OtherActor, SweepResult))
{
    return;
}

UAbilitySystemComponent* TargetASC = ...;
if (!TargetASC)
{
    return;
}

if (HasAuthority() && TryReflectOnHit(OtherActor, TargetASC))
{
    return;
}

if (HasAuthority() && DamageEffectClass)
{
    SourceASC->ApplyGameplayEffectSpecToTarget(*Spec.Data.Get(), TargetASC);
}

RetrieveConfigureEpicMonstersCommandlet.cpp์—์„œ ๋ผ๋ฐ”/๋ฌผ ํˆฌ์‚ฌ์ฒด BP CDO์— ๋‹ค์Œ ๊ฐ’์„ ์ง€์ •ํ–ˆ๋‹ค.

  • DamageEffectClass โ†’ /Game/Retrieve/AbilitySystem/Player/GE_BasicHitDamage.GE_BasicHitDamage_C
  • FlightVFX, ImpactVFX

2. ํŒจ๋ฆฌ ๋ฐ˜์‚ฌ ๋ฏธ์ž‘๋™

์ฆ์ƒ

ํ”Œ๋ ˆ์ด์–ด๊ฐ€ R ํ‚ค๋กœ ํŒจ๋ฆฌ์— ์„ฑ๊ณตํ•ด๋„ ๋“œ๋ž˜๊ณค ํˆฌ์‚ฌ์ฒด๊ฐ€ ๋˜๋Œ์•„๊ฐ€์ง€ ์•Š์•˜๋‹ค.

์›์ธ

๋ฐ˜์‚ฌ ๊ฐ€๋Šฅํ•œ ํˆฌ์‚ฌ์ฒด๋Š” ๋ฐ๋ฏธ์ง€ ํŒ์ •๋ณด๋‹ค ๋จผ์ € ํ”Œ๋ ˆ์ด์–ด์˜ ํŒจ๋ฆฌ ์ƒํƒœ(State.Player.Parrying ํƒœ๊ทธ)๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ํ•ด๋‹น ํƒœ๊ทธ๊ฐ€ ์žˆ์œผ๋ฉด ๋ฐ๋ฏธ์ง€๋ฅผ ์ฃผ์ง€ ์•Š๊ณ  ๋“œ๋ž˜๊ณค์„ ์นด์šดํ„ฐ ํƒ€๊ฒŸ์œผ๋กœ ์‚ผ์•„ ๋ฐฉํ–ฅ์„ ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค.

๊ตฌํ˜„ ์ˆ˜์ •

Source/Retrieve/AbilitySystem/Enemy/EpicEnemyProjectile.cpp์— ์—ํ”ฝ ํˆฌ์‚ฌ์ฒด ์ „์šฉ ๋ฐ˜์‚ฌ ํ๋ฆ„์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.

TryReflectOnHit ์กฐ๊ฑด:

  • bReflectable = true
  • bReflected = false (์•„์ง ๋ฐ˜์‚ฌ ์ „)
  • ์„œ๋ฒ„ ๊ถŒํ•œ ์žˆ์Œ
  • ๋Œ€์ƒ ASC์— State_Player_Parrying ํƒœ๊ทธ ์žˆ์Œ

ํŒจ๋ฆฌ ์„ฑ๊ณต ์‹œ ์ฒ˜๋ฆฌ:

  • ํ”Œ๋ ˆ์ด์–ด์—๊ฒŒ GameplayEvent_Parry_Success ์ „์†ก
  • OptionalObject์— ๋“œ๋ž˜๊ณค(๋ฐ˜์‚ฌ ์นด์šดํ„ฐ ํƒ€๊ฒŸ) ์„ธํŒ…
  • ReflectTowardCounterTarget(OtherActor) ํ˜ธ์ถœ

ReflectTowardCounterTarget์—์„œ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฐ’:

  • ReflectedInstigator = ParryingActor
  • bReflected = true
  • ๊ธฐ์กด homing ์ค‘๋‹จ
  • ๋“œ๋ž˜๊ณค์„ ๋” ์ด์ƒ IgnoreActor๋กœ ๋‘์ง€ ์•Š์Œ
  • ReflectedSpeedMultiplier ์ ์šฉ ํ›„ ๋“œ๋ž˜๊ณค ๋ฐฉํ–ฅ์œผ๋กœ ์žฌ๋ฐœ์‚ฌ
const FVector Direction = (TargetLocation - GetActorLocation()).GetSafeNormal();
const float CurrentSpeed = FMath::Max(ProjectileMovement->Velocity.Size(), ProjectileMovement->MaxSpeed);
const float ReflectedSpeed = FMath::Max(CurrentSpeed * ReflectedSpeedMultiplier, 300.f);
Launch(Direction, ReflectedSpeed);
SetActorRotation(Direction.Rotation());

3. ๋ฐ˜์‚ฌ ํˆฌ์‚ฌ์ฒด ๊ทธ๋กœ๊ธฐ ์ ์šฉ ๋ฌธ์ œ

์ฆ์ƒ

๋ฐ˜์‚ฌ๋œ ํˆฌ์‚ฌ์ฒด๊ฐ€ ๋“œ๋ž˜๊ณค์—๊ฒŒ ๋Œ์•„๊ฐ€์ง€๋งŒ, ๊ณต์ค‘ ์ƒํƒœ์—์„œ ๊ทธ๋กœ๊ธฐ๊ฐ€ ๊ฑธ๋ ค ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ง€์ƒ ๊ณต๊ฒฉ์œผ๋กœ ๋•Œ๋ฆฌ๊ธฐ ์–ด๋ ค์› ๋‹ค. ํŒจํ„ด ํŒŒํ›ผ ๋ณด์ƒ์œผ๋กœ ๊ธฐ๋Šฅํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ.

์›์ธ

๋“œ๋ž˜๊ณค์€ ๊ณต์ค‘ ํŒจํ„ด ์ค‘ ํˆฌ์‚ฌ์ฒด๋ฅผ ๋ฐœ์‚ฌํ•˜๋ฏ€๋กœ, ์นด์šดํ„ฐ ํƒ€๊ฒŸ ์ ์ค‘ ์‹œ์ ์—๋„ AerialMode, MOVE_Flying, ๊ณต์ค‘ ์Šฌ๋กฏ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋‚จ์•„ ์žˆ๋‹ค. ๊ทธ๋กœ๊ธฐ๋Š” ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์‹ค์ œ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ์ „ํˆฌ ๋ณด์ƒ ์ƒํƒœ์—ฌ์•ผ ํ•˜๋ฏ€๋กœ, ์ ์šฉ ์ „์— ์œ„์น˜์™€ MovementMode๋ฅผ ์ง€์ƒ ๊ธฐ์ค€์œผ๋กœ ์ •๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

๊ตฌํ˜„ ์ˆ˜์ •

AEpicEnemyProjectile::HandleReflectedOverlap์—์„œ bReflected ์ƒํƒœ์ธ ํˆฌ์‚ฌ์ฒด๋Š” ๋ฒ ์ด์Šค ๋ฐ๋ฏธ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ํƒ€์ง€ ์•Š๋„๋ก ๋ถ„๋ฆฌํ–ˆ๋‹ค.

if (!bReflected)
{
    return false;
}

if (TryApplyReflectedCounter(OtherActor))
{
    PlayImpactVFX(...);
    Destroy();
}

return true;

TryApplyReflectedCounter์—์„œ ์นด์šดํ„ฐ ์ ์šฉ ์ „ ์ง€์ƒ ๋ณด์ •:

ForceEnemyToGroundForGroggy(CounterTarget)
  โ””โ”€ SetAerialMode(false)
  โ””โ”€ ์•„๋ž˜ ๋ฐฉํ–ฅ ๋ผ์ธํŠธ๋ ˆ์ด์Šค โ†’ ์บก์А half height ๋ณด์ •์œผ๋กœ ์ง€๋ฉด ๋ฐฐ์น˜
  โ””โ”€ CharacterMovement โ†’ MOVE_Walking
  โ””โ”€ StopMovementImmediately
  โ””โ”€ DefaultSlot ์Šฌ๋กฏ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ •์ง€

์ดํ›„ ์นด์šดํ„ฐ ์ฒ˜๋ฆฌ:

PatternCounterComponent->OpenCounterWindow(0.1f)
PatternCounterComponent->TryCounter(Ability_Player_Parry, Element_None, ReflectedInstigator)

PatternCounterComponent.cpp์—์„œ ๊ทธ๋กœ๊ธฐ ์ด๋ฒคํŠธ EventMagnitude์— GroggyDuration์ด ๋“ค์–ด๊ฐ€๋„๋ก ์ˆ˜์ •ํ•ด ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ๊ทธ๋กœ๊ธฐ ์ง€์† ์‹œ๊ฐ„ ์ ์šฉ.


4. ๋“œ๋ž˜๊ณค ์ง€์ƒ ์ด๋™ ์ค‘ idle ๋ฏธ๋„๋Ÿฌ์ง

์ฆ์ƒ

๋“œ๋ž˜๊ณค์ด ์ง€์ƒ์—์„œ ์ถ”์  ์ด๋™ ์ค‘์ธ๋ฐ ๊ฑท๊ธฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์—†์ด idle ํฌ์ฆˆ๋กœ ๋ฏธ๋„๋Ÿฌ์ง€๋Š” ํ˜„์ƒ์ด ๋ฐ˜๋ณต๋๋‹ค.

๋ถ„์„ํ•œ ๋ณตํ•ฉ ์›์ธ

์›์ธ์„ค๋ช…
Velocity ๊ธฐ๋ฐ˜ Speed ๊ณ„์‚ฐAI ์ด๋™ยท์บก์А ๋ณด์ •ยทStateTree ์ด๋™์ด ์„ž์ด๋ฉด Actor ์œ„์น˜๋Š” ๋ณ€ํ•ด๋„ Velocity๊ฐ€ ์ˆœ๊ฐ„ ๋‚ฎ๊ฒŒ ์žกํžˆ๋Š” ํ”„๋ ˆ์ž„ ๋ฐœ์ƒ
DefaultSlot ์Šฌ๋กฏ ๋ชฝํƒ€์ฃผ ์ถฉ๋Œ๊ณต๊ฒฉยท๊ณต์ค‘ยท์ฐฉ์ง€ยทํšŒ์ „ ๋ชฝํƒ€์ฃผ๊ฐ€ DefaultSlot์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ง€์ƒ ์ด๋™ ํฌ์ฆˆ๋ฅผ ๋ฎ๋Š” ์ˆœ๊ฐ„ ๋ฐœ์ƒ
Chase ํƒœ๊ทธ ๋ถˆ์ผ์น˜๊ณต์ค‘โ†’์ง€์ƒ ์ „ํ™˜ ์ค‘ State.Enemy.Chase ํƒœ๊ทธ์™€ ์‹ค์ œ ์ด๋™ ์ƒํƒœ๊ฐ€ ์ˆœ๊ฐ„์ ์œผ๋กœ ๋ถˆ์ผ์น˜
AnimBP Direction ๊ณ„์‚ฐDirection์ด ํƒ€๊ฒŸ facing์ด ์•„๋‹Œ ์ด๋™ ๋ฐฉํ–ฅ ๊ธฐ์ค€์œผ๋กœ ๊ณ„์‚ฐ โ†’ ์–‘ ๋ฐฉํ–ฅ์ด ๋‹ค๋ฅด๋ฉด strafe ๋ธ”๋ Œ๋“œ์ŠคํŽ˜์ด์Šค ์ž…๋ ฅ

1์ฐจ ์ˆ˜์ • โ€” AnimInstance ์†๋„ ๊ณ„์‚ฐ ๋ณด๊ฐ•

Source/Retrieve/Animation/RetrieveEnemyAnimInstance.cpp์—์„œ Velocity๋งŒ ์“ฐ์ง€ ์•Š๊ณ  Actor ์œ„์น˜ ๋ณ€ํ™”๋Ÿ‰๋„ ํ•จ๊ป˜ ์ƒ˜ํ”Œ๋งํ•œ๋‹ค.

์ถ”๊ฐ€ ์ƒํƒœ: CachedPawnForMovementSample, LastMovementSampleLocation, bHasMovementSampleLocation

const FVector Velocity2D(Pawn->GetVelocity().X, Pawn->GetVelocity().Y, 0.f);
FVector Movement2D = Velocity2D;

const FVector DeltaLocation2D = ActorLocation - LastMovementSampleLocation;
const FVector LocationDeltaVelocity2D = DeltaLocation2D / DeltaSeconds;

if (LocationDeltaVelocity2D.SizeSquared() > Movement2D.SizeSquared())
{
    Movement2D = LocationDeltaVelocity2D;
}

Speed = Movement2D.Size();

2์ฐจ ์ˆ˜์ • โ€” EpicMonsterCharacter Tick์—์„œ AnimBP ๋ณ€์ˆ˜ ๊ฐ•์ œ ๋ณด์ •

Source/Retrieve/Character/RetrieveEpicMonsterCharacter.cpp์˜ Tick์—์„œ ์ง€์ƒ ์ด๋™ ์—ฌ๋ถ€๋ฅผ ๋ณ„๋„๋กœ ํŒ๋‹จํ•ด AnimInstance์— Reflection์œผ๋กœ ์ง์ ‘ ์„ธํŒ…ํ•œ๋‹ค.

์ด๋™ ํŒ๋‹จ ์ œ์™ธ ์กฐ๊ฑด: Falling/Flying, ๊ณต๊ฒฉ/ํŠน์ˆ˜๊ณต๊ฒฉ/ํ”ผ๊ฒฉ/์Šคํƒœ๊ฑฐ/๊ทธ๋กœ๊ธฐ/์‚ฌ๋ง ์ƒํƒœ

์„ธํŒ…ํ•˜๋Š” ๋ณ€์ˆ˜ (ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ):
Speed, GroundSpeed, Direction, IsMoving, bIsMoving, ShouldMove, bShouldMove, IsChasing, bIsChasing

์‹ค์ œ ์ด๋™ ์ค‘์ธ๋ฐ State.Enemy.Chase ํƒœ๊ทธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•ด C++์—์„œ ์ž„์‹œ๋กœ loose tag๋ฅผ ๋ถ™์ธ๋‹ค.

// ์ด๋™ ๊ฐ์ง€ ์‹œ
ASC->AddLooseGameplayTag(State_Enemy_Chase);
bMovementDrivenChaseTagAdded = true;

// ์ด๋™ ์ข…๋ฃŒ ์‹œ (๋‚ด๊ฐ€ ๋ถ™์ธ ํƒœ๊ทธ๋งŒ ์ œ๊ฑฐ)
if (bMovementDrivenChaseTagAdded)
{
    ASC->RemoveLooseGameplayTag(State_Enemy_Chase);
    bMovementDrivenChaseTagAdded = false;
}

bMovementDrivenChaseTagAdded๋ฅผ ๋‘” ์ด์œ : ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์ด ๋ถ™์ธ Chase ํƒœ๊ทธ๋ฅผ ์‹ค์ˆ˜๋กœ ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•จ.

3์ฐจ ์ˆ˜์ • โ€” ์ง€์ƒ ์ด๋™ ์• ๋‹ˆ๋ฉ”์ด์…˜ fallback

RetrieveEpicMonsterCharacter.h์— Dragon BP์—์„œ ์„ค์ • ๊ฐ€๋Šฅํ•œ fallback ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

  • ForcedGroundMoveAnimation
  • ForcedGroundMovePlayRate
  • GroundMoveMontage

์ง€์ƒ ์ด๋™์ด ๊ฐ์ง€๋˜๊ณ  ์ƒ์œ„ ์ƒํƒœ(๊ณต๊ฒฉ/ํ”ผ๊ฒฉ/๊ทธ๋กœ๊ธฐ ๋“ฑ)๊ฐ€ ์•„๋‹ˆ๋ฉด ForcedGroundMoveAnimation์„ DefaultSlot ๋™์  ๋ชฝํƒ€์ฃผ๋กœ ๋ฐ˜๋ณต ์žฌ์ƒํ•œ๋‹ค.

GroundMoveMontage = AnimInstance->PlaySlotAnimationAsDynamicMontage(
    MoveSequence,
    TurnAnimationSlot,
    0.12f,   // BlendIn
    0.12f,   // BlendOut
    ForcedGroundMovePlayRate,
    999);    // Priority

StopLocomotionMontages์—์„œ ํšŒ์ „ ๋ชฝํƒ€์ฃผ์™€ ์ด๋™ ๋ชฝํƒ€์ฃผ๋ฅผ ํ•จ๊ป˜ ์ •๋ฆฌํ•˜๋„๋ก ์ˆ˜์ •:

  • GroundTurnMontage
  • GroundMoveMontage
  • GroundTurnDirection

5. ๋“œ๋ž˜๊ณค AnimBP/BlendSpace ๊ตฌ์กฐ ๋ณด์ •

๋ฌธ์ œ

C++์—์„œ Speed๋ฅผ ์ž˜ ๋„ฃ์–ด๋„ AnimBP ๊ทธ๋ž˜ํ”„๊ฐ€ ํ•ด๋‹น ๊ฐ’์„ ์ œ๋Œ€๋กœ ์“ฐ์ง€ ์•Š๊ฑฐ๋‚˜, Slot ๋…ธ๋“œ๊ฐ€ Root ์•ž์— ์—†์œผ๋ฉด ๋ชฝํƒ€์ฃผ fallback์ด ์ตœ์ข… ํฌ์ฆˆ์— ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š”๋‹ค.

๊ตฌํ˜„ ์ˆ˜์ •

RetrieveConfigureEpicMonstersCommandlet.cpp์—์„œ ๋“œ๋ž˜๊ณค AnimBPยทBlendSpace๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.

์‚ฌ์šฉ ์—์…‹:

  • Idle: Polygonal_Dragon_AnimationIdle
  • Move: Polygonal_Dragon_AnimationWalk_Forward_WO_Root
  • BlendSpace: /Game/Retrieve/AI/Animations/Dragon/BS_DragonChase
  • AnimBP: /Game/Retrieve/AI/Animations/ABP_DragonEnemy

AnimBP AnimGraph ๊ตฌ์กฐ:

Speed ๋ณ€์ˆ˜
  โ†’ BlendSpacePlayer(BS_DragonChase)
  โ†’ Slot(DefaultSlot)          โ† ๋ฐ˜๋“œ์‹œ Root ์•ž์—
  โ†’ Root

DefaultSlot์„ Root ์•ž์— ๋‘๋Š” ์ด์œ : C++์—์„œ ์žฌ์ƒํ•˜๋Š” ์ง€์ƒ ์ด๋™ fallback ๋ชฝํƒ€์ฃผยทํšŒ์ „ ๋ชฝํƒ€์ฃผยท๊ณต๊ฒฉ/๊ณต์ค‘ ๊ณ„์—ด ๋ชฝํƒ€์ฃผ๊ฐ€ ์ตœ์ข… AnimGraph์— ๋ฐ˜์˜๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ.

์ปค๋งจ๋“œ๋ ›์—์„œ BP_Dragon CDO์— ์ €์žฅํ•œ ๊ฐ’:

  • Mesh AnimClass
  • ForcedGroundMoveAnimation

DumpAnim ๊ฒ€์ฆ ๊ฒฐ๊ณผ

ABP_DragonEnemy ParentClass: /Script/Retrieve.RetrieveEnemyAnimInstance
AnimGraph Nodes: 4
Root ์ž…๋ ฅ: AnimGraphNode_Slot
BlendSpacePlayer: BS_DragonChase
Slot: DefaultSlot

6. ๋ผ๋ฐ” ํˆฌ์‚ฌ์ฒด VFX ๊ฒฉ์ž ํŒŒํ‹ฐํด ๋ฌธ์ œ

์ฆ์ƒ

๋ผ๋ฐ” ํˆฌ์‚ฌ์ฒด ๋น„ํ–‰ VFX๊ฐ€ ๋ถˆ๊ฝƒ ํŠธ๋ ˆ์ผ์ด ์•„๋‹ˆ๋ผ ํ™”๋ฉด์—์„œ ๊ฒฉ์ž ํ˜•ํƒœ์˜ ํŒŒํ‹ฐํด ๋ฉ์–ด๋ฆฌ๊ฐ€ ์ฐํžˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€๋‹ค.

์›์ธ

๊ธฐ์กด NS_LavaProjectile_Flight์˜ Niagara ์„ค์ •์ด ํˆฌ์‚ฌ์ฒด ๋น„ํ–‰์šฉ ํŠธ๋ ˆ์ผ๋ณด๋‹ค sprite/grid ํ˜•ํƒœ๊ฐ€ ๋‘๋“œ๋Ÿฌ์ง€๋Š” ๊ตฌ์„ฑ์ด์—ˆ๋‹ค. ํˆฌ์‚ฌ์ฒด๊ฐ€ ๋น ๋ฅด๊ฒŒ ์›€์ง์ด๋ฉด ๊ฒฉ์ž๊ฐ์ด ๋” ๊ฐ•ํ•˜๊ฒŒ ๋ณด์˜€๋‹ค.

๊ตฌํ˜„ ์ˆ˜์ •

๋ฐ”์ด๋„ˆ๋ฆฌ .uasset์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ , ์ปค๋งจ๋“œ๋ ›์—์„œ ์•ˆ์ •์ ์ธ ์™ธ๋ถ€ Niagara ํŠธ๋ ˆ์ผ ์—์…‹์„ ํˆฌ์‚ฌ์ฒด BP CDO์— ํ• ๋‹นํ–ˆ๋‹ค.

์šฉ๋„์—์…‹
Flight VFX/Game/External/PolygonParticleFX/Particles/NS_Trail_Fireball_01
Impact VFX/Game/External/PolygonFantasyVillage/PolygonGeneric/FX/NS_Fire_01

ConfigureProjectileBlueprintVFX์—์„œ ์„ค์ •ํ•œ ๋‚ด์šฉ:

  • FlightVFXComponent->SetAsset(FlightVFX)
  • CDO FlightVFX
  • CDO ImpactVFX
  • CDO DamageEffectClass

7. ์—ํ”ฝ ๋ชฌ์Šคํ„ฐ ์ฝ”๋“œ ๊ฒฉ๋ฆฌ โ€” ์›์ธ ๋ถ„์„ & ์•„ํ‚คํ…์ฒ˜ ๋ถ„๋ฆฌ

๋ฐ˜๋ณต๋˜๋Š” ๋ฒ„๊ทธ์˜ ๊ทผ๋ณธ ์›์ธ

Dragon/Treant/Magma ์ „์šฉ ๋กœ์ง์ด ๊ณตํ†ต ํŒŒ์ผ์— ์ง์ ‘ ์ฃผ์ž…๋œ ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค.

๊ณตํ†ต ํŒŒ์ผ๋ฌธ์ œ
RetrieveEnemyCharacterDragon ์ „์šฉ ํšŒ์ „/์ด๋™ ์„ค์ •, ๊ณต์ค‘ ํŽ˜์ด์ฆˆ ๋กœ์ง์ด ์„ž์ž„
EnemyCombatComponentํŒจํ„ด Sequence/Hitbox ํ•„๋“œ๊ฐ€ Dragon ๊ตฌ์กฐ ๊ฐ€์ •
GA_ShootProjectilesAerialFireball/Rain/Spread ํŒ๋ณ„์ด row ์ด๋ฆ„ ๋ฌธ์ž์—ด ํ•˜๋“œ์ฝ”๋”ฉ
StateTreeTask_EnemyAttack8๋„ facing ๊ฒŒ์ดํŠธ + Dragon ์ „์šฉ ํšŒ์ „ ๋ฐฉ์‹ ์ถฉ๋Œ

์„ธ๋ถ€ ๋ฒ„๊ทธ ์›์ธ

๊ณต๊ฒฉ ๋ฐœ๋™ ์‹คํŒจ: FaceTargetForAttack() (์ง์ ‘ ํšŒ์ „)๊ณผ ApplyDragonGroundMovementSettings() (bOrientRotationToMovement)๊ฐ€ ๋™์‹œ์— ํ™œ์„ฑํ™” โ†’ 8๋„ facing ๊ฒŒ์ดํŠธ๋ฅผ ์ ˆ๋Œ€ ํ†ต๊ณผ ๋ชป ํ•จ

ํŠน์ˆ˜ ํŒจํ„ด ๋ฏธ๋ฐœ๋™: IsDragonAerialFireballPattern()์ด row ์ด๋ฆ„ ๋ฌธ์ž์—ด ๋น„๊ต๋กœ ํŒ๋ณ„ โ†’ ์ƒˆ ํŒจํ„ด ์ถ”๊ฐ€/๋ฆฌ๋„ค์ž„ ์‹œ ์ฝ”๋“œ ์ˆ˜์ • ๋ถˆ๊ฐ€ํ”ผ

์ถ”์  ์ด๋™ ์—†์Œ: ShiftOrbitSlot์˜ bOrientRotationToMovement ์ „ํ™˜์ด EnemyAttack์˜ ์ง์ ‘ ํšŒ์ „๊ณผ ๊ณ„์† ์ถฉ๋Œ

strafe ์• ๋‹ˆ๋ฉ”์ด์…˜: Direction์ด ํƒ€๊ฒŸ facing์ด ์•„๋‹Œ ์ด๋™ ๋ฐฉํ–ฅ ๊ธฐ์ค€ โ†’ ๊ณต๊ฒฉ ์ค‘ ์ด๋™ ๋ฐฉํ–ฅ๊ณผ ํƒ€๊ฒŸ ๋ฐฉํ–ฅ์ด ๋‹ฌ๋ผ strafe ๋ธ”๋ Œ๋“œ์ŠคํŽ˜์ด์Šค ์ž…๋ ฅ

์•„ํ‚คํ…์ฒ˜ ๋ถ„๋ฆฌ ๋ฐฉํ–ฅ

๋ถ„๋ฆฌ ๋Œ€์ƒ๋ฐฉ๋ฒ•
์—ํ”ฝ ๋ชฌ์Šคํ„ฐ ๊ณตํ†ต ๊ธฐ๋ฐ˜ARetrieveEpicMonsterCharacter : ARetrieveEnemyCharacter ์‹ ๊ทœ ํด๋ž˜์Šค
StateTree ํƒœ์ŠคํฌMonster_Type_Epic ํƒœ๊ทธ๋กœ Epic ํด๋ž˜์Šค ๊ฒ€์ฆ ํ›„ ๋ถ„๊ธฐ
์–ด๋นŒ๋ฆฌํ‹ฐ ์‹œ์Šคํ…œGA_EpicShootProjectiles ๋ณ„๋„ ๊ตฌํ˜„ + enum ๊ธฐ๋ฐ˜ ํŒจํ„ด ๋ถ„๊ธฐ
ํˆฌ์‚ฌ์ฒดAEpicEnemyProjectile ๋ณ„๋„ ๊ตฌํ˜„ (virtual hook ๋ถ„๋ฆฌ)
DataTableMonsterPattern row + SpawnPattern enum + VFX ์„ค์ •์œผ๋กœ ์ƒˆ ํŒจํ„ด ์ถ”๊ฐ€ ๊ฐ€๋Šฅ

์ˆ˜์ •/์ƒ์„ฑ ๋Œ€์ƒ ํŒŒ์ผ

  • Source/Retrieve/Character/RetrieveEpicMonsterCharacter.h/.cpp (์‹ ๊ทœ)
  • Source/Retrieve/Character/RetrieveEnemyCharacter.cpp/.h
  • Source/Retrieve/Enemy/StateTree/StateTreeTask_EnemyAttack.cpp
  • Source/Retrieve/Enemy/StateTree/StateTreeTask_EnemyPatternAttack.cpp
  • Source/Retrieve/Enemy/StateTree/StateTreeTask_ShiftOrbitSlot.cpp
  • Source/Retrieve/Components/Enemy/EnemyCombatComponent.cpp
  • Source/Retrieve/AbilitySystem/Enemy/GAS/GA_ShootProjectiles.cpp
  • Source/Retrieve/AbilitySystem/Enemy/GAS/GA_EpicShootProjectiles.cpp (์‹ ๊ทœ)
  • Source/Retrieve/AbilitySystem/Enemy/EnemyProjectile.cpp
  • Source/Retrieve/AbilitySystem/Enemy/EpicEnemyProjectile.cpp (์‹ ๊ทœ)
  • Source/Retrieve/Data/RetrieveDataTableTypes.h
  • Config/DefaultEngine.ini (CoreRedirects)

8. Dragon Meteor VFX ๊ตฌํ˜„

์‚ฌ์šฉ ๋„๊ตฌ: Monolith MCP + Niagara
๊ตฌ์กฐ: Flight VFX + Impact VFX ๋ถ„๋ฆฌ

๊ตฌํ˜„ ๋‹จ๊ณ„

Phase 1 โ€” NS_DragonMeteor_Flight

  • NS_LavaRocks๋ฅผ duplicate_system์œผ๋กœ ๋ณต์ œ
  • Rock_01~04: Mesh Renderer๋กœ ๋‚™ํ•˜ํ•˜๋Š” ๋ฐ”์œ„ ํ‘œํ˜„
  • Smoke Emitter: NS_Smoke_Black_01 ๊ธฐ๋ฐ˜ ๊ฒ€์€ ๊ถค์  ์—ฐ๊ธฐ
  • ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐ์ •: Lifetime, Spawn Rate, ๋‚™ํ•˜ ๋ฐฉํ–ฅ

Phase 2 โ€” NS_DragonMeteor_Impact

  • Burst ๋ชจ๋“œ Emitter ๊ตฌ์„ฑ
  • M_Burst + M_explosion_subUV ๋จธํ‹ฐ๋ฆฌ์–ผ๋กœ ํญ๋ฐœ ํ‘œํ˜„
  • Loop=Once ์„ค์ •์œผ๋กœ ์ถฉ๊ฒฉ ์ˆœ๊ฐ„๋งŒ ์žฌ์ƒ

์‚ฌ์šฉํ•œ Niagara ์—์…‹

์—์…‹์—ญํ• 
NS_LavaRocks๋ฉ”ํ…Œ์˜ค ๊ธฐ๋ณธ ๊ตฌ์กฐ (Flight ๋ฒ ์ด์Šค)
NS_Smoke_Black_01๋‚™ํ•˜ ๊ถค์  ์—ฐ๊ธฐ
M_Burst์ถฉ๊ฒฉ ํญ๋ฐœ ํšจ๊ณผ
M_explosion_subUVํญ๋ฐœ subUV ์• ๋‹ˆ๋ฉ”์ด์…˜

๊ฒช์€ ๋ฌธ์ œ & ํ•ด๊ฒฐ

๋ฌธ์ œํ•ด๊ฒฐ
add_emitter์— NiagaraSystem ํƒ€์ž… ์ „๋‹ฌNiagaraEmitter ๊ฒฝ๋กœ๋กœ ๋‚ด๋ถ€ emitter ์ง์ ‘ ์ฐธ์กฐ
Smoke Emitter ๊ฒฝ๋กœ ๋ถˆํ™•์‹คNS_Smoke_Black_01.NS_Smoke_Black_01:Smoke_0 ํ˜•ํƒœ๋กœ ์ง€์ •

Monolith ํ˜ธ์ถœ ์ˆœ์„œ

1. niagara_query: list_systems           โ†’ ๊ธฐ์กด ์—์…‹ ํƒ์ƒ‰
2. niagara_query: duplicate_system       โ†’ NS_LavaRocks โ†’ NS_DragonMeteor_Flight
3. niagara_query: add_emitter            โ†’ Smoke emitter ์ถ”๊ฐ€
4. niagara_query: set_module_input_value โ†’ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐ์ •
5. niagara_query: save_system            โ†’ ์ €์žฅ

9. Water Projectile VFX ๊ตฌํ˜„

์ฐธ๊ณ  ๋ฌธ์„œ: C:\Users\lhw45\Downloads\TeamProject\CH5_Project\Docs\VFX_Niagara_Guide.md
๊ตฌ์กฐ: Flight / Impact๋ฅผ ๋ณ„๋„ ์‹œ์Šคํ…œ์œผ๋กœ ๋ถ„๋ฆฌ (Dragon์˜ ๋‹จ์ผ ๋ณตํ•ฉ ๊ตฌ์กฐ์™€ ์ฐจ์ด)

๊ธฐ์กด ์ƒํƒœ

BP_WaterProjectile์˜ FlightVFX/ImpactVFX ํ•„๋“œ๊ฐ€ ๋น„์–ด ์žˆ์—ˆ๊ณ  stub ํŒŒ์ผ์ด ๋‚จ์•„ ์žˆ์—ˆ๋‹ค.

๊ตฌํ˜„ ๋‹จ๊ณ„

STEP 1 โ€” NS_WaterProjectile_Flight

  • NS_Waterfall_Drops_01 (Realistic Starter VFX Pack Vol2) ๋ณต์ œ
  • WaterCore Emitter: Sprite Renderer, ๋ฐ์€ ํŒŒ๋ž€์ƒ‰ ๋ฌผ ์ž…์ž
  • WaterTrail Emitter: Sprite Renderer, ๋ฌผ ํ๋ฆ„ ๋ผ์ธ

STEP 2 โ€” NS_WaterProjectile_Impact

  • NS_Waterfall_Splashes_01 ๋ณต์ œ
  • WaterSplash Emitter: Burst ๋ฐฉ์‚ฌ ํŒจํ„ด (ํŠ€๋Š” ํšจ๊ณผ)
  • WaterRipple Emitter: Burst ๋ฐ”๋‹ฅ ํŒŒ๋™ ํšจ๊ณผ

STEP 3 โ€” BP_WaterProjectile ์—ฐ๊ฒฐ

  • FlightVFX โ†’ NS_WaterProjectile_Flight
  • ImpactVFX โ†’ NS_WaterProjectile_Impact

์‚ฌ์šฉํ•œ ์—์…‹

์—์…‹์—ญํ• 
NS_Waterfall_Drops_01Flight VFX ๋ฒ ์ด์Šค
NS_Waterfall_Splashes_01Impact VFX ๋ฒ ์ด์Šค
M_WaterDrop_Aํ˜„๋Œ€์  ๋ฌผ ๋จธํ‹ฐ๋ฆฌ์–ผ (Vol2 pack)

๊ฒฐ๊ณผ

ํ•ญ๋ชฉ์ƒํƒœ
NS_WaterProjectile_Flight ์ƒ์„ฑโœ…
NS_WaterProjectile_Impact ์ƒ์„ฑโœ…
BP_WaterProjectile FlightVFX ์—ฐ๊ฒฐโœ…
BP_WaterProjectile ImpactVFX ์—ฐ๊ฒฐโœ…
์ปดํŒŒ์ผ ์—๋Ÿฌโœ… 0๊ฐœ
VFX ๊ฐ€์ด๋“œ ๋ฌธ์„œ ์—…๋ฐ์ดํŠธโœ… Dragon + Water ๊ตฌํ˜„ ์ ˆ์ฐจ ์ถ”๊ฐ€

10. ๊ฒ€์ฆ ๊ฒฐ๊ณผ

๋นŒ๋“œ

& 'C:\Program Files\Epic Games\UE_5.7\Engine\Build\BatchFiles\Build.bat' RetrieveEditor Win64 Development -Project='...\Retrieve.uproject' -WaitMutex -NoHotReload

๊ฒฐ๊ณผ: ์„ฑ๊ณต.

์—ํ”ฝ ๋ชฌ์Šคํ„ฐ ์„ค์ • ์ปค๋งจ๋“œ๋ ›

& 'C:\Program Files\Epic Games\UE_5.7\Engine\Binaries\Win64\UnrealEditor-Cmd.exe' '...\Retrieve.uproject' -run=RetrieveConfigureEpicMonsters -unattended -nop4

๊ฒฐ๊ณผ: ์„ฑ๊ณต.

AnimBP Dump

& '...\UnrealEditor-Cmd.exe' '...\Retrieve.uproject' -run=RetrieveConfigureEpicMonsters DumpAnim -unattended -nop4

ํ™•์ธ:

  • ABP_DragonEnemy ParentClass: /Script/Retrieve.RetrieveEnemyAnimInstance
  • AnimGraph: BlendSpacePlayer(BS_DragonChase) โ†’ Slot(DefaultSlot) โ†’ Root โœ…

์ˆ˜์ •/ํ™•์ธํ•œ ์ฃผ์š” ํŒŒ์ผ

ํŒŒ์ผ์ž‘์—…
AbilitySystem/Enemy/EnemyProjectile.cpp์ถฉ๋Œ ์ฒ˜๋ฆฌ ์ˆœ์„œ ์ •๋ฆฌ
AbilitySystem/Enemy/EpicEnemyProjectile.cppํŒจ๋ฆฌ ๋ฐ˜์‚ฌ + ๊ทธ๋กœ๊ธฐ ๋ณด์ •
Components/Enemy/PatternCounterComponent.cpp๊ทธ๋กœ๊ธฐ EventMagnitude ๋ฐ์ดํ„ฐ ์—ฐ๋™
Animation/RetrieveEnemyAnimInstance.cpp/.h์œ„์น˜ ๋ณ€ํ™”๋Ÿ‰ ๊ธฐ๋ฐ˜ Speed ๋ณด๊ฐ•
Character/RetrieveEpicMonsterCharacter.cpp/.hTick ์ด๋™ ๋ณด์ • + fallback ๋ชฝํƒ€์ฃผ
Commandlets/RetrieveConfigureEpicMonstersCommandlet.cppBP CDO ์„ค์ •, AnimBP ๊ตฌ์กฐ
Content/.../BP_Dragon.uassetCDO ์ €์žฅ
Content/.../ABP_DragonEnemy.uassetAnimGraph ๊ตฌ์กฐ
Content/.../BS_DragonChase.uassetBlendSpace

11. ์˜ค๋Š˜ ๋ฐฐ์šด ์ 

ํˆฌ์‚ฌ์ฒด ์ถฉ๋Œ ์ฒ˜๋ฆฌ ์ˆœ์„œ๊ฐ€ ์ „๋ถ€๋‹ค

ํˆฌ์‚ฌ์ฒด์ฒ˜๋Ÿผ ์ถฉ๋Œ ์ˆœ๊ฐ„์— ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์ด ์ด์–ด์ง€๋Š” ์•กํ„ฐ๋Š” ์ฒ˜๋ฆฌ ์ˆœ์„œ๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค. ๋ฐ˜์‚ฌ ํŒ์ •์„ ๋ฐ๋ฏธ์ง€๋ณด๋‹ค ๋จผ์ € ๋‘๊ณ , ๋ฐ˜์‚ฌ๋œ ํˆฌ์‚ฌ์ฒด๋Š” ๋ฒ ์ด์Šค ๋ฐ๋ฏธ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ํƒ€์ง€ ์•Š๋„๋ก ๋ถ„๋ฆฌํ•œ ๊ฒƒ์ด ํ•ต์‹ฌ์ด์—ˆ๋‹ค. HandleReflectedOverlap โ†’ TryReflectOnHit โ†’ ApplyDamage ์ˆœ์„œ๋ฅผ ์ง€ํ‚ค๋ฉด ๊ธฐ๋Šฅ์ด ๋ฌปํžˆ์ง€ ์•Š๋Š”๋‹ค.

๊ณต์ค‘ ๋ณด์Šค์˜ ๊ทธ๋กœ๊ธฐ๋Š” ์œ„์น˜๋ถ€ํ„ฐ ์ •๋ฆฌํ•œ๋‹ค

๊ทธ๋กœ๊ธฐ๋Š” ๋‹จ์ˆœํžˆ ํƒœ๊ทธ๋งŒ ๋ถ™์ด๋ฉด ์•ˆ ๋œ๋‹ค. ์ „ํˆฌ ๋ณด์ƒ ์ƒํƒœ๋กœ ๊ธฐ๋Šฅํ•˜๋ ค๋ฉด ์ ์šฉ ์ „์— SetAerialMode(false), ์ง€๋ฉด ๋ผ์ธํŠธ๋ ˆ์ด์Šค ์Šค๋ƒ…, MOVE_Walking, ์Šฌ๋กฏ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ •์ง€๊ฐ€ ํ•จ๊ป˜ ํ•„์š”ํ•˜๋‹ค.

AI ์ด๋™ ์• ๋‹ˆ๋ฉ”์ด์…˜์€ Velocity ํ•˜๋‚˜๋งŒ ๋ฏฟ์œผ๋ฉด ์œ„ํ—˜ํ•˜๋‹ค

Velocity๊ฐ€ ๋‚ฎ๊ฒŒ ์žกํžˆ๋Š” ํ”„๋ ˆ์ž„์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์–ด์„œ Actor ์œ„์น˜ ๋ณ€ํ™”๋Ÿ‰์„ ํ•จ๊ป˜ ์ƒ˜ํ”Œ๋งํ•ด์•ผ "์‹ค์ œ๋กœ ์›€์ง์ด๋Š”๋ฐ idle"์ธ ์ƒํ™ฉ์„ ์žก์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜๋„ AnimBP ์ „์ด๋‚˜ ์Šฌ๋กฏ ๋ชฝํƒ€์ฃผ๊ฐ€ ์–ฝํžˆ๋ฉด C++ fallback์ด ํ•„์š”ํ•˜๋‹ค.

๊ณตํ†ต ํŒŒ์ผ ์˜ค์—ผ์€ ํšŒ์ „ ์ถฉ๋Œ๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค

ํŠน์ • ๋ชฌ์Šคํ„ฐ ์ „์šฉ ๋กœ์ง์„ ๊ณตํ†ต ํŒŒ์ผ์— ๋„ฃ์œผ๋ฉด ํšŒ์ „ ๋ฐฉ์‹์ด ์ถฉ๋Œํ•˜๊ณ , facing ๊ฒŒ์ดํŠธ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•ด ๊ณต๊ฒฉ ์ž์ฒด๊ฐ€ ๋ฐœ๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. Epic ์ „์šฉ ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  virtual/override๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ •๋‹ต์ด๋‹ค.

ํŒจํ„ด ํŒ๋ณ„์€ ๋ฌธ์ž์—ด ๋น„๊ต๊ฐ€ ์•„๋‹Œ enum/ํƒœ๊ทธ๋กœ

row ์ด๋ฆ„ ๋ฌธ์ž์—ด ๋น„๊ต๋กœ ํŒจํ„ด์„ ๋ถ„๊ธฐํ•˜๋ฉด ๋‚˜์ค‘์— ์ถ”๊ฐ€/๋ฆฌ๋„ค์ž„ํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ์ฝ”๋“œ๋ฅผ ๊ฑด๋“œ๋ ค์•ผ ํ•œ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ enum ๋˜๋Š” GameplayTag๋กœ ํŒ๋ณ„ํ•ด์•ผ DataTable ๋ณ€๊ฒฝ์—๋„ ์ฝ”๋“œ ์ˆ˜์ •์ด ์—†๋‹ค.

Blueprint CDO ์„ค์ •์€ ์ปค๋งจ๋“œ๋ ›์œผ๋กœ ๊ฒ€์ฆํ•œ๋‹ค

AnimBP ๊ทธ๋ž˜ํ”„ ๊ตฌ์กฐ๋‚˜ ํˆฌ์‚ฌ์ฒด BP CDO ๊ฐ’์ฒ˜๋Ÿผ ์—์…‹ ๊ธฐ๋ณธ๊ฐ’์ด ํ•„์š”ํ•œ ์ˆ˜์ •์€ C++๋งŒ ๋ฐ”๊ฟ”์„œ๋Š” ๋๋‚˜์ง€ ์•Š๋Š”๋‹ค. ์ปค๋งจ๋“œ๋ ›์œผ๋กœ CDO๋ฅผ ์ €์žฅํ•˜๊ณ  DumpAnim์œผ๋กœ ์‹ค์ œ ๊ทธ๋ž˜ํ”„ ๊ตฌ์กฐ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒ€์ฆ ๋ฃจํ‹ด์ด ์ค‘์š”ํ•˜๋‹ค.

Niagara VFX ๊ตฌํ˜„ ํŒจํ„ด

  • Monolith ํ˜ธ์ถœ ์ˆœ์„œ: duplicate_system โ†’ add_emitter โ†’ set_module_input_value โ†’ save_system
  • add_emitter์—๋Š” NiagaraSystem์ด ์•„๋‹Œ NiagaraEmitter ๊ฒฝ๋กœ๋ฅผ ๋„˜๊ฒจ์•ผ ํ•œ๋‹ค
  • Emitter ๋‚ด๋ถ€ ๊ฒฝ๋กœ ํ˜•์‹: NS_SystemName.NS_SystemName:EmitterName_0
  • Flight/Impact๋ฅผ ๋ณ„๋„ ์‹œ์Šคํ…œ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด ๊ฐ๊ฐ ๋…๋ฆฝ์ ์œผ๋กœ ์žฌ์ƒ/์ค‘๋‹จ ๊ฐ€๋Šฅํ•ด ๊ด€๋ฆฌ๊ฐ€ ์‰ฝ๋‹ค
profile
๊ฐœ๋ฐœํ•ฉ์‹œ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€