언리얼 엔진 - 게임 프로젝트/GAS 프레임워크 RPG 프로젝트

전기 광선 스킬 - 4) 전기 광선의 연쇄 충격 시스템 구현

monstro 2025. 11. 23. 17:21
728x90
반응형

- 개요

전기 광선 스킬은 Sphere Trace를 수행하여 Trace된 적에게 피해를 주는 방식으로 동작한다

이때 추가적으로 인접한 다른 적들에게 전기 광선이 퍼져나가 피해를 주는데,

해당 스킬 어빌리티의 구체적인 동작을 구현하기 전에 전기 광선의 Line Trace연쇄 충격 시스템을 구현한다

 

- C++ 사이드

1) Aura 클래스

 

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

 

DefaultEngine.ini 수정

 

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

 

2) TargetDataUnderMouse 클래스

 

SendMouseCursorData 함수를 위와 같이 수정한다

마우스 커서에서부터 Trace하여 ECC_Target 채널에 대해 Block하도록 설정된 오브젝트와 충돌하였는지 확인한다

 

3) AuraAbilitySystemLibrary 클래스

 

 

GetClosestTargets 함수를 추가하여 위와 같이 구현한다

해당 함수를 호출하여 인자로 받은 Actors에 대하여 MaxTargets만큼의 인접한 다른 Actor들을 반환한다

로직은 다음과 같다

  • ActorActor간의 거리를 매핑한 ActorDistance 지역 구조체 생성
  • 매개변수로 받은 Actors를 순회하면서 ActorDistance를 가져와 DistanceActorPairs에 저장
  • DistanceActorPairsDistance가 작은 순서로 정렬
  • 매개변수로 받은 MaxTargets의 수만큼 DistanceActorPairs의 데이터OutClosestTargets에 저장

 

4) AuraBeamSpell 클래스

 

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

 

 

두개의 함수를 위와 같이 추가한다

  • TraceFirstTarget 함수 : 전기광선이 첫번째로 타격한 타겟을 저장하는 함수
  • StoreAdditionalTargets 함수 : 타격한 전기광선이 연쇄적으로 타격할 타겟들을 저장하는 함수

 

 

TraceFirstTarget 함수의 로직은 위와 같다

어빌리티의 Owner가 갖고 있는 무기로부터 Sphere Trace를 수행하여

수행한 결과의 ImpactPointActor를 캐싱한다

 

 

StoreAdditionalTargets 함수의 로직은 위와 같다

어빌리티의 Owner로부터 원의 범위를 만들고 해당 원안의 오버랩된 Actor들 

GetClosestTargets 함수에 인자로 넘겨주어 NumAdditionTargets만큼 가장 인접한 Actor들을 저장한다

 

- 블루프린트 사이드

1) BP_FadeActor 블루프린트

FadeFinished 함수 수정

 

FadeFinished 함수에서 수정하는 CollisionChannel을 새롭게 추가한 채널로 변경한다

 

2) GC_ShockLoop 블루프린트

OnBecomeRelevant 이벤트 수정

 

OnBecomeRelevant 이벤트를 위와 같이 수정하여 SourceObject가 CombatInterface를 상속받았는지 판단하고

상속받았다면 마우스 커서로 클릭한 ActorCombatInterface를 상속받았는지 판단하여 로직을 수행한다

 

3) GA_Electrocute 블루프린트

SpawnElectricBeam 함수 (1)

 

전기광선을 소환하는 SpawnElectricBeam 함수의 로직을 위와 같이 구성한다

마우스로 클릭한 위치를 기준으로 TraceFirstTarget 함수를 호출하고

Owner의 무기GC Parameter를 생성한다

이후 마우스로 클릭한 대상이 CombatInterface를 상속받았는지 확인한다

 

SpawnElectricBeam 함수 (2)

 

상속받았는지 확인하여 상속받았다면 클릭한 대상GC의 대상으로 설정하고

아니라면 OwnerGC의 대상으로 설정한다

이후 Tag를 사용하여 연결된 GC를 발동하고, StoreAdditionalTargets 함수를 호출하여

저장된 인접한 다른 Actor들을 대상으로 AddShockLoopCueToAdditionalTarget 함수를 호출한다

 

 

AddShockLoopCueToAdditionalTarget 함수의 로직은 위와 같다

AdditionalTargetTag연결된 GC의 대상으로 설정한다

 

 

RemoveShockLoopCueFromAdditionalTarget 함수의 로직은 위와 같다

AdditionalTaget에서 Tag 연결된 GC를 제거한다

 

PrepareEndAbility 함수 (1)

 

PrepareEndAbility 함수의 로직은 위와 같다

어빌리티의 OwnerCharacterMovementComponent를 설정하여 다시 움직일 수 있도록 설정하고

전기 광선의 첫번째 피격대상CombatInterface를 상속받았는지 확인한다

 

PrepareEndAbility 함수 (2)

 

상속받았다첫번째 피격대상으로부터 Tag와 연결된 GC를 제거하고

RemoveShockLoopCueFromAdditionalTarget 함수를 호출하여 연쇄 피격된 대상들에게서도 GC를 제거한다

아니라면 어빌리티의Owner로부터 Tag와 연결된 GC를 제거한다

 

- 최종 실행 결과

 

728x90
반응형