언리얼엔진/언리얼 C++

GameplayAbilitySystem - Ability

season97 2024. 10. 31. 13:01

 개인적인 공부를 위해 포스팅 하는 글입니다.


▶ 일반 공격을 Ability 시스템을 이용해 만들어보자

ㆍ 늘 하던 구조인 GameplayAbility를 상속받은 클래스를 만들어서 총괄처럼 관리 + 파생클래스인 Attack 생성

ㆍ 타고 들어가서 부모클래스를 보면 언리얼에서 뭐가 중요한지 주석도 쳐놨고 기능도 적어뒀다. 

ㆍ 그리고 당연하게도 정의할만한 가상함수들도 꽤 있겠다.

- CanActivateAbility: 사용할수있는지 (스킬은 배워야 하는거니)
- ActivateAbility: 사용중
- EndAbility: 

함수 이름과 기능이 좀 직관적이다. 필요한걸 딱 가져와서 사용할 준비를 한 모습

 

# 기능을 눈으로 보기 편하게 상속받은BP를 하나 파보자.

ㆍ 태그로 관리한다는 것을 볼 수 있고, 쿨다운, 코스트 등등 다양한 옵션도 정의할 수 있는거도 확인할 수 있다.

ㆍ Replication... 네트워크와 관련된 부분도 보인다.

ㆍ 노드 이벤트로는 Activate랑 End가 보인다.


 

# 캐릭터가 스킬을 사용할거니 실질적으로 캐릭터에 올려줘야 할 것 같다.

 

character 클래스에 코드 추가

ㆍ 함수는 스킬을 배우는 단계라고 생각하면된다. 해당 기능을 활성화 해야 CanActivate가 되겠다.

ㆍ 아래 변수는 스킬에 대한 정보를 들고있는 변수

ㆍ 지금은 그냥 시작하자마자 활성화 되게 해줄 준비를 했다.

 

#AddCharacterAbilities 함수... 캐릭터의 스킬을 활성화 해주는 함수겠다..

ㆍ 근데 스킬? 이라는건 누가 들고있어야 할까?

ㆍ 구조상 AbilitySystemComponent라는 클래스가 이 어빌리티 시스템의 매니저 역할로 사용하고 있다.

ㆍ 여기에 캐릭터의 스킬을 활성화 해주는 부분을 추가해 줘야 구조가 깔끔할것이다.

 

#AbilitySystemComponent 클래스 

ㆍ  매개변수로는 어빌리티 시스템의 상속을 받은 서브클래스만 순회를 돌기 위해 저렇게 받아주자.

- 스킬의 종류는 여러개겠지? UGameplayAbility로 정의 여러개 다다다닥 해놨겠지?
- 그거 순회 하나씩 돌게~

무엇을 반환하는지 보고 캐싱변수를 정해준것

ㆍ 결국 이 핸들... 뭐 이런 코드들로 인해 처음에 만든 Attack의 가상함수 부분으로 들어오게 되는 구조인 것 

ㆍ 순회를 돌고 막... 저런걸 하는게 결국 구조상으론 이부분과 연결이 되는것일거다.

 


#Player에 Startup Ability를 정의 해 두었으니 Abilites를 바인드 해주자

ㆍ 지금은 쫌 하드코딩이긴 한데 일단 이렇게 하자. 그럼 Attack을 배운 상태가 된다.

 

원래 내 프로젝트에서 플레이어의 컨트롤에 관한 부분은 PlayerController에서 해주고 있었고, 공격 부분 또한 그부분에 있었다. 그 부분을 좀 수정해주자.

ㆍ 컨트롤러 부분에 이 부분을 추가해 줄 것 이다. ActivateAbility함수... 현재는 Player에 없으니 만들어줬다. 

그 전에 데이터를 Tag로 관리해 주고 있으니 추가해 줬다.

ㆍ PlayerController니까 Player로 타고 들어왔고, Player은 Character의 상속을 받고 있는데 캐릭터 클래스에선 AbilitySystemComponent를 이용해 스킬 시스템에 대한 매니저 역할을 해주고있는 클래스를 has-a상태로 들고있다. 

따라서 그 매니저를 타고 들어가서 관리해주는게 맞을것이므로 한번 더 타고 들어간다.

ㆍ AbilitySystemComponent에 대한 부분은 이전 포스팅에 자세히 다루고 있으니 Pass

ㆍ 위에서부터 쭉 아래로 내려오는 과정에 의한 일령의 과정으로, 지금 Attack의 

ㆍ 이 부분과 연결이되니. 여기서 Attack몽타주를 재생시켜 주자

ㆍ 몽타주는 생성자에서 연결해 줘도 되지만 그냥BP에서 연결해주자

 

GA_Attack BP

 

 

※ 이런과정으로 GameplayAbilitySystem을 이용한 컴포넌트 초기 세팅

- Attribute(스탯) Effect(효과,상호작용), Ablity(실제 스킬)

- Tag를 이용한 관리까지 

ㆍ 구조를 잘 생각하며 실제 상황에 맞게 잘 사용하면 될것이다.

ㆍ 문따는거, 점프하는거도 다 스킬이 될 수 있다. 설계를 어떻게 하느냐에 따라 다른거

ㆍ 또한 아이템 장착하면 무기의 공격이 바뀌고.. 이런거도 다 GameplayAbilitySystem을 이용해 설계할 수 있을 것 같다. 

-> 이걸 좀 잘 활용하는게 최신 트랜드일듯?