🎮 BP_BaseProjectile

1️⃣ 내부 구조

  • Sphere과 ProjectileMovement가 있다.
  • Sphere 내부에 Mesh, 나이아가라 이펙트 시스템이 있다.

2️⃣ Event Graph

📌 Consturct

  • 데이터 테이블에서 Row name과 일치하는 것을 찾아 Projectile Config에 저장

  • Projectile component로 Active하고, Velocity(Vector) 저장

📌 DT_Projectile

Damage 부분이 projectile Config로 저장

📌 On Component Hit

  • 두개의 콜리전 컴포넌트가 충돌했을 때 실행되는 이벤트
    • 두 콜리전이 충돌 가능하게 설정되어 있어야 함
  • 다른 Actor가 유효한지 체크한 뒤, Hit bool = True 로 set

✅ Send Damage Function

👉 전반부

  • Input Parameter

    • Actor = OtherActor
    • HitResult = Hit(Hit Struct)
  • Actor와, Actor의 Combat State Component 유효성 체크

  • Weapon Component를 들고와서 유효성 체크

  • 이후 Get Weapon Owner로 무기 소유자를 가져옴

👉 후반부

  • 무기 소유자와 맞춘 대상이 같지 않은지 체크

  • 다른 대상이면 이후 True 로직 실행

  • 무기 소유자의 CombatComponent를 통해 Can Hit Shooting로직 실행 (Hit 가능한지 체크(무적, 동맹 상태)

  • 최종적으로 Damage Received 실행

    • Target = Actor = OtherActor(데미지 받는 actor)의 Combat State Manager Component
    • Damage = Projectile Object의 Damage Struct
    • Damager = projectile Object 소유자 -> Weapon -> Weapon 소유자 -> Damager
    • Reaction = Hit Result Struct

👉 최종적으로 맞으면 실행되는 로직 (Hit 대상자의 Combat State Manager에서 실행)

  • Set Health, 움직임 멈춤, 몽타주 재생 정지, 오브젝트 떨어트림, 콤보 캔슬, 데스 판정 등등

✅ Attach to Hit Actor

  • Input Parameter
    • Target - self BP_BaseProjectile
    • Hit Comp - Other Actor의 Collision Comp
    • Hit - HitResult

  • OtherActor의 Collision Component 유효성 체크
  • OtherActor의 Collision Component에 Projectile Attach
  • Projectile Movement 활용해서 속도 = 0, DeActive, Collision = No Collision 으로 처리

👉 Arrow라서 Attach to Hit Actor를 붙여 둔 것 같음. 마법이라면 해당 로직앞에 Branch 로직이나 Select로직 놔둬야 할듯

✅ Set Lifespan / Hit wall Notify

  • 60초 동안 살아있고 이후 소멸하도록 해둠
  • Wall 인지 판별한 후 벽이면 거기에 맞는 VFX 생성하도록 로직 설계되어있음.


🎮 BPC_ProjectileSpawner

1️⃣ Event Graph

📌 InitProjectileComponent

  • Combat State Manager에서 Call 하는 이벤트이다.
  • ProjectileSpawner는 BP_WeaponBase_Ranged 에서 가지고 있음.
    • GetComponentOwner = BP_WeaponBase_Ranged 이다.
  • 서버인지 확인한 후 무기 이름을 가지고와서 DT에 해당 무기의 정보를 가지고 옴.
    • Ranged Shooting Config
    • Projectile의 Index (예-어떤 종류의 화살을 들고 올것인지) 를 가지고 와서 MaxAmmo와 Capacity를 설정

📌 I Shoot

✅ 호출 흐름

  • BP_Character 의 Input -> I Attack 호출
  • BPC_CombatStateManager -> Event I Attack 실행 -> Ranged Weapon인지 확인한 후 -> Shoot Ranged Weapon 호출
    • Event Shoot Ranged Weapon 실행(Combat State Manager)
    • Ranged Weapon Shoot 호출 -> BP_WeaponBase_Ranged의 RangedWeapon_Shoot 실행 -> I Shoot 호출
  • 👉 Character --> CombatStateManager --> Weapon_Ranged --> ProjectileSpawner 과정을 거쳐서 I Shoot 실행됨.

다시 돌아와서 I Shoot 로직을 살펴보면 다음과 같다.

✅ 로직

  • Input Parameter는 DT_Combo에서 관리하는 Row name과 같다.
  • Shooting 중이거나, Cooldown중이 아니면 True
  • Ammo가 남아 있으면 True 없으면 Call On Out Of Ammo 실행
  • Current Projectile Index (화살 종류 고름)
    -현재 로직은 0번째 인덱스를 그냥 고름 (아마 화살 종류 하나밖에 없어서 그런듯)
    -여러개 만들면 콤보에 따른 Projectile Index를 정하는 DT을 만들어서 할당 가능할 듯
  • Weapon Consturction에서 Weapon Config를 가져오고 Projectile Index에 맞는 Shooting Config를 가져옴
  • Shooting, InCooldown True로 설정하고 Rotate to Shoot 실행
  • Rotate to Shoot --> Aim 방향으로 캐릭터 회전하고 Combo 이름에 따라 Shot Event 실행
profile
Unreal 1기

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN