🎮 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 로직 실행

👉 최종적으로 맞으면 실행되는 로직 (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 실행