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

GameplayAbility - 4) 길찾기 시스템 구현

monstro 2025. 8. 11. 01:39
728x90
반응형

- 개요

특정한 태그연결된 입력이 발생하면 자동으로 길을 찾는 시스템을 구현한다

길찾기는 다음과 같은 입력이 발생하면 동작한다

  • 어느 한 지점을 선택하고 왼쪽 마우스클릭하고 뗀 경우 : 해당 지점으로 자동 이동
  • 왼쪽 마우스누르고 있는 상태로 드래그하는 경우 : 커서를 따라 자동 이동

 

 

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

 

1) AuraGameplayAbility 클래스

 

GameplayAbility 클래스에 GameplayTag 멤버변수를 추가한다

추가한 StartupInputTag는 GA를 부여받은 대상이 설정한 값과 동일한 값을 가진 Tag와 연결된 키를 입력하면

특정한 이벤트를 발생시키는 용도로 사용한다

 

2) AuraAbilitySystemComponent 클래스

 

특정한 Tag연결된 키를 입력할 때, 입력하는 방식에 따라 다른 로직을 수행하는 함수들을 추가한다

각각 다음과 같다

  • AbilityInputTagPressed : 특정한 Tag와 연결된 키를 누르는 순간에 호출
  • AbilityInputTagHeld : 특정한 Tag와 연결된 키를 누르고 있는 경우에 호출
  • AbilityInputTagReleased : 특정한 Tag와 연결된 키를 떼는 순간에 호출

 

 

AddCharacterAbilities 함수에 위와 같은 로직을 추가한다

ASC에 어빌리티를 부여할 때, 어빌리티에 설정된 StartupInputTagGASpec에 추가한다

이후 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로 설정하여 자동 길찾기 수행
    • 이후, FollowTimebTargeting을 초기화

 

 

AbilityInputTagHeld 함수의 로직은 위와 같다

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

 

 

AutoRun 함수의 로직은 위와 같다

Spline 컴포넌트를 통해 그려진 곡선Pawn이 따라가도록 로직을 구성하였다

 

 

PlayerTick 함수에 AutoRun 함수를 호출하는 로직을 추가한다

 

4) 언리얼 에디터

 

이전에 만든 테스트용 GA 블루 프린트의 Startup Input Tag를 설정하였다

 

- 최종 실행 결과

 

728x90
반응형