- 개요
전기 광선 스킬은 Sphere Trace를 수행하여 Trace된 적에게 피해를 주는 방식으로 동작한다
이때 추가적으로 인접한 다른 적들에게 전기 광선이 퍼져나가 피해를 주는데,
해당 스킬 어빌리티의 구체적인 동작을 구현하기 전에 전기 광선의 Line Trace와 연쇄 충격 시스템을 구현한다
- C++ 사이드
1) Aura 클래스

프로젝트에서 사용할 새로운 CollisionChannel을 추가한다

새롭게 추가한 채널에 대해서 기본적으로 충돌하는 모든 트레이스와 오브젝트를 Block하도록 설정한다
2) TargetDataUnderMouse 클래스

SendMouseCursorData 함수를 위와 같이 수정한다
마우스 커서에서부터 Trace하여 ECC_Target 채널에 대해 Block하도록 설정된 오브젝트와 충돌하였는지 확인한다
3) AuraAbilitySystemLibrary 클래스


GetClosestTargets 함수를 추가하여 위와 같이 구현한다
해당 함수를 호출하여 인자로 받은 Actors에 대하여 MaxTargets만큼의 인접한 다른 Actor들을 반환한다
로직은 다음과 같다
- Actor와 Actor간의 거리를 매핑한 ActorDistance 지역 구조체 생성
- 매개변수로 받은 Actors를 순회하면서 ActorDistance를 가져와 DistanceActorPairs에 저장
- DistanceActorPairs를 Distance가 작은 순서로 정렬
- 매개변수로 받은 MaxTargets의 수만큼 DistanceActorPairs의 데이터를 OutClosestTargets에 저장
4) AuraBeamSpell 클래스

MaxNumShockTargets 멤버변수를 추가하여 연쇄적으로 전기 광선이 타격할 최대 타겟의 수를 지정한다

두개의 함수를 위와 같이 추가한다
- TraceFirstTarget 함수 : 전기광선이 첫번째로 타격한 타겟을 저장하는 함수
- StoreAdditionalTargets 함수 : 타격한 전기광선이 연쇄적으로 타격할 타겟들을 저장하는 함수

TraceFirstTarget 함수의 로직은 위와 같다
어빌리티의 Owner가 갖고 있는 무기로부터 Sphere Trace를 수행하여
수행한 결과의 ImpactPoint와 Actor를 캐싱한다

StoreAdditionalTargets 함수의 로직은 위와 같다
어빌리티의 Owner로부터 원의 범위를 만들고 해당 원안의 오버랩된 Actor들을
GetClosestTargets 함수에 인자로 넘겨주어 NumAdditionTargets만큼 가장 인접한 Actor들을 저장한다
- 블루프린트 사이드
1) BP_FadeActor 블루프린트

FadeFinished 함수에서 수정하는 CollisionChannel을 새롭게 추가한 채널로 변경한다
2) GC_ShockLoop 블루프린트

OnBecomeRelevant 이벤트를 위와 같이 수정하여 SourceObject가 CombatInterface를 상속받았는지 판단하고
상속받았다면 마우스 커서로 클릭한 Actor가 CombatInterface를 상속받았는지 판단하여 로직을 수행한다
3) GA_Electrocute 블루프린트

전기광선을 소환하는 SpawnElectricBeam 함수의 로직을 위와 같이 구성한다
마우스로 클릭한 위치를 기준으로 TraceFirstTarget 함수를 호출하고
Owner의 무기에 GC Parameter를 생성한다
이후 마우스로 클릭한 대상이 CombatInterface를 상속받았는지 확인한다

상속받았는지 확인하여 상속받았다면 클릭한 대상을 GC의 대상으로 설정하고
아니라면 Owner를 GC의 대상으로 설정한다
이후 Tag를 사용하여 연결된 GC를 발동하고, StoreAdditionalTargets 함수를 호출하여
저장된 인접한 다른 Actor들을 대상으로 AddShockLoopCueToAdditionalTarget 함수를 호출한다

AddShockLoopCueToAdditionalTarget 함수의 로직은 위와 같다
AdditionalTarget을 Tag와 연결된 GC의 대상으로 설정한다

RemoveShockLoopCueFromAdditionalTarget 함수의 로직은 위와 같다
AdditionalTaget에서 Tag와 연결된 GC를 제거한다

PrepareEndAbility 함수의 로직은 위와 같다
어빌리티의 Owner의 CharacterMovementComponent를 설정하여 다시 움직일 수 있도록 설정하고
전기 광선의 첫번째 피격대상이 CombatInterface를 상속받았는지 확인한다

상속받았다면 첫번째 피격대상으로부터 Tag와 연결된 GC를 제거하고
RemoveShockLoopCueFromAdditionalTarget 함수를 호출하여 연쇄 피격된 대상들에게서도 GC를 제거한다
아니라면 어빌리티의Owner로부터 Tag와 연결된 GC를 제거한다
- 최종 실행 결과
'언리얼 엔진 - 게임 프로젝트 > GAS 프레임워크 RPG 프로젝트' 카테고리의 다른 글
| 전기 광선 스킬 - 6) 전기 광선 스킬의 구현 (1) (0) | 2025.11.25 |
|---|---|
| 전기 광선 스킬 - 5) 문제 수정 (0) | 2025.11.25 |
| 전기 광선 스킬 - 3) 전기 광선 스킬 추가 및 FX 효과 구성 + 일부 수정 (0) | 2025.11.22 |
| 전기 광선 스킬 - 2) 광선 계열 스킬 추가 + 그 외의 수정 (0) | 2025.11.21 |
| 전기 광선 스킬 - 1) 화염구 스킬 변경 (0) | 2025.11.20 |