- 개요
특정한 태그와 연결된 입력이 발생하면 자동으로 길을 찾는 시스템을 구현한다
길찾기는 다음과 같은 입력이 발생하면 동작한다
- 어느 한 지점을 선택하고 왼쪽 마우스를 클릭하고 뗀 경우 : 해당 지점으로 자동 이동
- 왼쪽 마우스를 누르고 있는 상태로 드래그하는 경우 : 커서를 따라 자동 이동

언리얼 엔진에서 길찾기와 관련한 여러 기능을 제공하는 NavigationSystem 모듈을 프로젝트에 추가한다
1) AuraGameplayAbility 클래스

GameplayAbility 클래스에 GameplayTag 멤버변수를 추가한다
추가한 StartupInputTag는 GA를 부여받은 대상이 설정한 값과 동일한 값을 가진 Tag와 연결된 키를 입력하면
특정한 이벤트를 발생시키는 용도로 사용한다
2) AuraAbilitySystemComponent 클래스

특정한 Tag와 연결된 키를 입력할 때, 입력하는 방식에 따라 다른 로직을 수행하는 함수들을 추가한다
각각 다음과 같다
- AbilityInputTagPressed : 특정한 Tag와 연결된 키를 누르는 순간에 호출
- AbilityInputTagHeld : 특정한 Tag와 연결된 키를 누르고 있는 경우에 호출
- AbilityInputTagReleased : 특정한 Tag와 연결된 키를 떼는 순간에 호출

AddCharacterAbilities 함수에 위와 같은 로직을 추가한다
ASC에 어빌리티를 부여할 때, 어빌리티에 설정된 StartupInputTag를 GASpec에 추가한다
이후 GiveAbility 함수를 호출하여 설정된 GASpec을 ASC에 부여한다

AbilityInputTagPressed 함수의 로직은 위와 같다
ScopedAbilityListLock 인스턴스를 생성하여 ASC에 의해 조정되는 어빌리티에 대한 동시접근을 차단한다
이후 GetActivatableAbilities 함수를 호출하여 현재 발동중인 어빌리티들을 순회한다
- 순회중인 어빌리티의 GASpec에서 인자로 받은 GameplayTag가 존재하는지 확인한다
- 존재한다면, 해당 GA와 연결된 입력이 들어오면 AbilitySpecInputPressed 함수를 호출하여 GA를 처리
- 이후 GASpec이 활성화되면, InvokeReplicatedEvent 함수를 호출하여 클라->서버로 이벤트를 처리

AbilityInputTagHeld 함수의 로직은 위와 같다
마찬가지로, ScopedAbilityListLock 인스턴스를 생성하여 어빌리티에 대한 동시접근을 차단한다
이후 현재 발동중인 어빌리티들을 순회한다
- 순회중인 어빌리티의 GASpec에서 인자로 받은 GameplayTag가 존재하는지 확인한다
- 존재한다면, 해당 GA와 연결된 입력이 들어오면 AbilitySpecInputPressed 함수를 호출하여 GA를 처리
- 이후 GASpec이 활성화되지 않았다면, TryActivateAbility 함수를 호출하여 GA를 발동한다

AbilityInputTagReleased 함수의 로직은 위와 같다
동일하게, ScopedAbilityListLock 인스턴스를 생성하여 어빌리티에 대한 동시접근을 차단한다
이후 현재 발동중인 어빌리티들을 순회한다
- 순회중인 어빌리티의 GASpec이 인자로 받은 Tag를 갖고 있는지 + GASpec이 활성화되어 있는지 확인한다
- 확인이 되었다면, 해당 GA와 연결된 입력을 떼면 AbilitySpecInputReleased 함수를 호출하여 GA를 처리
- InvokeReplicatedEvent 함수를 호출하여 클라->서버로 이벤트를 처리
3) AuraPlayerController 클래스

우선, PlayerController에서도 ASC에 접근하기 위한 멤버 변수와 함수를 추가하였다

또한 자동 길찾기와 관련한 변수들과 함수를 추가하였다
이중에서 SplineComponent는 곡선을 그리기 위한 컴포넌트로서 자동완성된 경로를 생성하는데 사용한다

생성자에서 추가한 SplineComponent를 SubObject로 생성하도록 로직을 추가한다

GetASC 함수의 로직은 위와 같다
GetAbilitySystemComponent 함수를 호출하여 Pawn의 ASC를 가져온다
가져온 결과값을 AuraASC로 캐스팅하고 추가한 멤버변수에 저장한다

AbilityInputTagPressed 함수의 로직은 위와 같다
왼쪽 마우스 클릭이 입력되면 마우스 커서가 가리키고 있는 대상이 존재하는지에 따라 bTargeting을 설정하고
bAutoRunning의 값을 false로 설정하여 자동으로 이동하지 않도록 설정한다

AbilityInputTagReleased 함수의 로직은 위와 같다
- 왼쪽 마우스를 클릭했다가 뗐다면, ASC의 AbilityInputTagReleased 함수를 호출하고 리턴한다
- 만약, 마우스 커서가 가리키고 있는 대상이 있다면, ASC의 AbilityInputTagReleased 함수를 호출한다
- 마우스 커서가 가리키고 있는 대상이 없다면, 다음의 로직을 진행한다
- Pawn의 위치 ~ CachedDestination의 위치로 구성된 NavigationPath를 생성
- 생성한 NavigationPath의 위치로 구성된 곡선을 생성
- CachedDestination의 값을 초기화하고, bAutoRunning의 값을 true로 설정하여 자동 길찾기 수행
- 이후, FollowTime과 bTargeting을 초기화

AbilityInputTagHeld 함수의 로직은 위와 같다
- 왼쪽 마우스를 클릭하고 있는 상태라면, ASC의 AbilityInputTagHeld 함수를 호출하고 리턴한다
- 만약, 마우스 커서가 가리키고 있는 대상이 있다면, ASC의 AbilityInputTagHeld 함수를 호출한다
- 마우스 커서가 가리키고 있는 대상이 없다면, 다음의 로직을 진행한다
- FollowTime을 서서히 증가시킨다
- 커서가 Collision과 충돌한다면, CachedDestination을 충돌한 위치로 설정한다
- 이후 CachedDestination부터 Pawn까지의 위치벡터에서 방향을 가져온다
- 가져온 방향 벡터를 AddMovemetnInput 함수에 넘겨주어 Pawn을 해당 방향의 좌표로 이동시킨다

AutoRun 함수의 로직은 위와 같다
Spline 컴포넌트를 통해 그려진 곡선을 Pawn이 따라가도록 로직을 구성하였다

PlayerTick 함수에 AutoRun 함수를 호출하는 로직을 추가한다
4) 언리얼 에디터

이전에 만든 테스트용 GA 블루 프린트의 Startup Input Tag를 설정하였다
- 최종 실행 결과
'언리얼 엔진 - 게임 프로젝트 > GAS 프레임워크 RPG 프로젝트' 카테고리의 다른 글
| AbilityTasks - 1) GAS 프레임워크에서의 Prediction (0) | 2025.08.15 |
|---|---|
| GameplayAbility - 최종) 어빌리티를 통한 투사체 생성 (0) | 2025.08.11 |
| GameplayAbility - 3) Lyra의 입력 시스템 도입 (0) | 2025.08.09 |
| GameplayAbility - 2) Gameplay Ability 적용 (0) | 2025.08.08 |
| GameplayAbility - 1) Gameplay Ability에 대하여 (0) | 2025.08.08 |