티스토리 뷰

Activating Abilities

입력 액션에 콜백 함수를 바인딩했지만, 입력을 누르면 어떤 어빌리티를 실행해야 하는지 알아야 한다.

우리는 이를 입력 태그를 통해 식별하도록할 것이다.

따라서 AuraGameplayAbility에 게임 시작시 시작 어빌리티가 어떤 입력과 연결되는 지를 나타낼 태그 변수를 선언해주자.

 

GameplayAbility 내부 변수는 런타임 중 자유롭게 변경하기에 적합하지 않다.

예를 들어 처음에는 좌클릭으로 특정 기술을 사용하도록 설정했지만, 이후 우클릭으로 변경하고 싶을 수도 있다.

이처럼 입력 매핑이 런타임에 바뀔 가능성이 있다면, 입력 태그를 GameplayAbility 자체에 계속 저장해두는 방식은 적절하지 않다.

 

이때 사용하는 것이 GameplayAbilitySpec의 DynamicAbilityTags이다.

이는 GameplayAbilitySpec에 존재하는 GameplayTagContainer이며, 런타임 중 태그를 추가, 삭제, 변경할 수 있다.

따라서 입력 태그는 Ability 자체가 아니라, 해당 Ability를 캐릭터에게 부여할 때 생성되는 AbilitySpec에 저장하는 것이 적절하다.

 

이를 위해 기존 AddCharacterAbilities 함수에서 생성한 AbilitySpec이 참조하는 Ability를 AuraGameplayAbility로 캐스팅한다.

이후 AuraGameplayAbility에 설정된 StartupInputTag를 가져와 AbilitySpec.DynamicAbilityTags에 추가한다.

즉, StartupInputTag는 초기 설정값 역할을 하고, 실제 런타임 입력 연결 정보는 AbilitySpec의 DynamicAbilityTags가 담당하게 된다.

 

지금은 입력을 누르면 디버그 메시지만 출력하는데, 이 대신 AbilitySystemComponent에 입력 태그를 전달하도록 할 것이다.

Input.LMB
↓
ASC에게 전달
↓
Input.LMB를 가진 Ability 활성화

 

이를 위해 우선 입력 태그를 전달받을 함수를 AbilitySystemComponent에서 추가해줄 것이다.

이때 Held와 Released에 대해서만 만들어 줄 것인데, Pressed 시점에는 Held 호출만으로 충분하기 때문이다.

왜냐하면 Ability 내부에서 입력이 계속 눌리고 있는지 아닌지를 직접 확인할 수 있기 때문이다.

 

Held 입력의 경우 누르고 있기에 거의 매 프레임이 호출된다.

다만, 매 프레임 AbilitySystemComponent를 Cast하면 비용이 발생한다.

따라서 PlayerController에서 멤버 변수를 만들고, GetASC() 함수를 따로 작성해줄 것이다.

 

PlayerController에서 접근하는 것이기 때문에, AuraAbilitySystemComponent로 캐스팅하는 과정이 필요하다.

또한 UAbilitySystemBlueprintLibrary에서 GetAbilitySystemComponent 함수를 호출하자.

필요한 매개 변수는 AActor*로 여기서는 APawn을 넘긴다.

 

이제 기존 디버그 메시지를 지우고, 각각에 맞는 함수를 호출하도록 바꿔준다.

이때 주의할 점은 게임 초반에 ASC가 아직 생성되지 않았을 수있기에, 체크 해주는 과정을 포함시켜주었다.

 

함수 내용도 구현해주자.

먼저 활성화 가능한 Ability 목록을 불러오고, 이에 대한 모든 AbilitySpec을 순회하며 입력 태그와 비교한다.

태그가 일치하면 현재 입력과 연결된 Ability이므로 활성화 여부를 확인하고, 이에 맞게 활성화를 진행한다.

 

Released의 경우 활성화 부분은 구현할 필요가 없다.

단순히 Ability에게 입력이 해제되었다라고 알려주기만 하면 된다.

 

이제 컴파일하고 Startup Input Tag를 할당해주자.

 

이제 좌클릭을 눌러보면 Ability가 활성화되었다는 메시지를 볼 수 있다.

추가적으로 Ability가 활성화되어 있는 동안에는 다시 활성화되지 않기에, 좌클릭을 반복해서 눌러도 메시지는 갱신되지 않는다.

 

마찬가지로 Ability 효과 시간 이후에 종료 문구가 출력되는 것을 볼 수 있다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/07   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함