SlideShare a Scribd company logo
1 of 39
DevRookie
Gameplay
Ability
System
2023.02.04
By TonyChoiMS
Remind
GameplayTags
GameplayTag Container
GameplayTag Manager
GameplayTag Delegate
GameplayAbility
Index
01
02
03
04
05
06
- GameplayAbilityComponent 초기 세팅 방법
- Gamplay Ability란 무엇인가?
- Gamplay Effect란 무엇인가?
- AttributeSet이란 무엇인가?
이전 시간에 진행한 내용
01
4
GameplayTags
Hierarchical name
- /Engine/Source/Runtime/GameplayTags/Classes/GameplayTagContainer.h
- GameplayTagManager에 등록되어 있는 계층 구조를 갖는 이름
- 오브젝트의 상태를 분류하고, 설명하는 데 유용하게 사용되는 구조체
- 오브젝트가 어떤 태그를 들고 있는지, 없는지에 따라 현재 상태를 나
타낼 수 있음. (ex. Stun)
Gameplay Tags
01
4
- 새 게임플레이 태그 추가하면 계층 구조로 생성됨.
- 태그를 비교 또는 확인 하는 함수에서 유용하게 사용
- 기존 bool이나 enum으로 상태를 정의하던 것을 GameplayTags로 대
체
- 태그는 AbilitySystemComponent에 부여하는 것이 일반적
- IGameplayTagAssetInterface 구현을 통해 엑세스
Gameplay Tags
01
4
- DefaultGameplayTags.ini에 정의
- Project Setting -> Project -> GameplayTags
- Create
- Rename
- Search for Reference
- Delete
Gameplay Tags
01
4
Gameplay Tags
01
4
Gameplay Tags
01
4
- C++ 클래스에서 사용하는 GameplayTag는 코드에서 찾아야함.
- FGameplayTag::RequestGameplayTag(FName);
- GameplayTag 이름을 바꾸면 리디렉션이 생성됨
- 리디렉션을 정리하거나, 생성되지 않도록 하는 습관 필요
Gameplay Tags
01
4
- GameplayTag 리디렉션 생성하지 않는 방법
1. 새로운 GameplayTag 생성
2. Search For Reference로 기존 GameplayTag 검색
3. 직접 새로 만든 GameplayTag로 변경
4. 이전 GameplayTag 제거
Gameplay Tags
01
4
- LooseGameplayTag 존재
- Replicate 되지 않는 GameplayTag
- 직접 관리 필요
- TagMapCount도 직접 관리 필요
- UAbilitySystemComponent::AddLooseGameplayTag()
- UAbilitySystemComponent::RemoveLooseGameplayTag()
Gameplay Tags
01
4
Gameplay Tags
01
4
ExactMatch >>
Character.Action == Character.Action.Attack ? FALSE
Character.Action.Attach == Character.Action.Attack ? TRUE
Not ExactMatch >>
Character.Action == Character.Action.Attack ? TRUE
Character.Action.Attach == Character.Action.Attack ? TRUE
Gameplay Tags
01
4
GameplayTag Container
Hierarchical name
- 다수의 GameplayTag는 FGameplayTagContainer에 저장
- TArray<FGameplayTag>를 통해 저장할 수도 있으나, Container 사용
권장
- Tag는 FName을 사용
- Iteration을 위해 TArray<FGameplayTag>를 리턴하는 함수 존재
FGameplayTagContainer
01
4
- 저장된 GameplayTag의 인스턴스 수를 저장하는 TagMap 존재
- Container 내부에 GameplayTag가 존재할 수 있지만, TagMapCount
가 0일 수 있음.
- HasTag(), HasMatchingTag() 등 유사한 함수들은 TagMapCount도
같이 확인
FGameplayTagCountContainer
01
4
GamePlayTagManager
Hierarchical name
- 현재 GameplayTag의 parent 또는 child를 가져올 수 있음
- #include “GameplayTagManager.h”
- UGameplayTagManager::Get().FunctionName()
- Manager를 통해 비교 시, 상수 문자열 조작 및 비교보다 빠르게 처리
GameplayTagManager
01
4
- 클래스 멤버를 노출 할 때 특정 태그만 보이도록 설정
- UPROPERTY(Meta = (Categories =“GameplayCue”))
- 함수 파라미터에 특정 태그만 보이도록 설정
- UFUNCTION(Meta=(GameplayTagFilter=“GameplayCue”))
- GameplayTagContainer 파라미터는 필터링 불가능.
GameplayTagManager
01
4
GamePlayTag Delegate
Hierarchical name
- UAbilitySystemComponent는 GameplayTag가 추가/삭제 될 때마다
Delegate를 통해 사용자에게 알림
- 문법은 코드 참조
- EGameplayTagEventType에 따라 이벤트 시점 정함
- NewOrRemoved : 새롭게 추가/완전히 제거 된 경우
- AnyCountChange : TagMapCount 변경 마다
GameplayTag Delegate
01
4
GameplayTag Delegate
01
4
- Callback 함수 등록 (Register)
- virtual void FunctionName(const FGameplayTag, int32);
- tag : 콜백을 호출한 Tag
- int32 : 새롭게 갱신 된 TagCount
- Delegate는 꼭 등록 후, 해제 필요 (Unregister)
GameplayTag Delegate
01
4
GameplayTag Delegate
01
4
GamePlayAbility
GameplayAbilitySystem
- GameplayAbility (a.k.a GA)
- GA는 게임 플레이 안에서 Actor의 어떤 스킬이나 액션을 할 수 있게
합니다.
- 하나 이상의 GA가 한번에 활성화가 된다면,
1. 뛰면서 (sprint)
2. 스킬(Skill)을 쓸 수 있습니다.
GameplayAbility
01
4
- 이것들을 모두 BP와 C++로 만들 수 있습니다.
- GameplayAbility 예
1. 점프 / 달리기
2. 스킬 시전
3. 일정 시간 동안 X번의 공격을 방어할 수 있는 패시브형 Block
4. 포션 사용, 문열기, 재료 수집
GameplayAbility
01
4
- GameplayAbility로 구현되지 않아도 되는 예시
1. 기본적인 행동에 대한 인풋(Movement Input)
2. UI와의 상호 작용 기능.
- 상점에서 사고 파는 행위
GameplayAbility
01
4
- 이것은 절대적인 룰은 아니고, 단지 추천 내용이며, 게임의 디자인에
따라 달라질 수 있습니다.
- 기본적인 기능과 함께 Level에 따라 Attribute 또는 GameplayAbility
기능 변경 가능
- 기본적인 행동에 Cost와 CoolDown을 GameplayEffect에 포함
GameplayAbility
01
4
- AbilityTask를 통해 일정 시간 기다릴 수 있음.
- 이벤트 대기
- Attribute 변경 대기
- 플레이어가 타겟을 지정할 때 까지 대기
- 특정 애니메이션이 출력될 때까지 대기
GameplayAbility
01
4
- 모든 GameplayAbility는 ActivateAbility() Override
- EndAbility 존재
- GameplayAbility가 완료되거나 취소 될 때 호출
GameplayAbility
01
4
GameplayAbility
01
4
GameplayAbility
01
4
GameplayAbility
01
4
GameplayAbility
01
4
- GameplayAbility BP 내부에서 각종 태그 설정 가능
GameplayAbility
01
4
참고 자료
05
27
- 언리얼 공식 문서
- Tranek Github (비공식이지만, 꽤 방대한 분량 및 Contributors 보유)
- GameplayAbilitySystem 튜토리얼 영상
감사합니다

More Related Content

What's hot

김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
devCAT Studio, NEXON
 
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
henjeon
 
NDC2012_마비노기 영웅전 카이 포스트모템_시선을 사로잡는 캐릭터 카이 그 시도와 성공의 구현 일지
NDC2012_마비노기 영웅전 카이 포스트모템_시선을 사로잡는 캐릭터 카이 그 시도와 성공의 구현 일지NDC2012_마비노기 영웅전 카이 포스트모템_시선을 사로잡는 캐릭터 카이 그 시도와 성공의 구현 일지
NDC2012_마비노기 영웅전 카이 포스트모템_시선을 사로잡는 캐릭터 카이 그 시도와 성공의 구현 일지
영준 박
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
QooJuice
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
devCAT Studio, NEXON
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
devCAT Studio, NEXON
 
정종필 팀장이됐어요(더저용량)
정종필 팀장이됐어요(더저용량)정종필 팀장이됐어요(더저용량)
정종필 팀장이됐어요(더저용량)
JP Jung
 
UE4 Garbage Collection
UE4 Garbage CollectionUE4 Garbage Collection
UE4 Garbage Collection
QooJuice
 

What's hot (20)

NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
 
GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
 
191221 unreal engine 4 editor 확장하기
191221 unreal engine 4 editor 확장하기191221 unreal engine 4 editor 확장하기
191221 unreal engine 4 editor 확장하기
 
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
 
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
 
행동 트리
행동 트리행동 트리
행동 트리
 
[IGC2018] 청강대 이득우 - 언리얼에디터확장을위해알아야할것들
[IGC2018] 청강대 이득우 - 언리얼에디터확장을위해알아야할것들[IGC2018] 청강대 이득우 - 언리얼에디터확장을위해알아야할것들
[IGC2018] 청강대 이득우 - 언리얼에디터확장을위해알아야할것들
 
NDC2012_마비노기 영웅전 카이 포스트모템_시선을 사로잡는 캐릭터 카이 그 시도와 성공의 구현 일지
NDC2012_마비노기 영웅전 카이 포스트모템_시선을 사로잡는 캐릭터 카이 그 시도와 성공의 구현 일지NDC2012_마비노기 영웅전 카이 포스트모템_시선을 사로잡는 캐릭터 카이 그 시도와 성공의 구현 일지
NDC2012_마비노기 영웅전 카이 포스트모템_시선을 사로잡는 캐릭터 카이 그 시도와 성공의 구현 일지
 
C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현
 
[IGC 2017] 블루홀 최준혁 - '플레이어언노운스 배틀그라운드' DEV 스토리
[IGC 2017] 블루홀 최준혁 - '플레이어언노운스 배틀그라운드' DEV 스토리[IGC 2017] 블루홀 최준혁 - '플레이어언노운스 배틀그라운드' DEV 스토리
[IGC 2017] 블루홀 최준혁 - '플레이어언노운스 배틀그라운드' DEV 스토리
 
NDC 2015 이광영 [야생의 땅: 듀랑고] 전투 시스템 개발 일지
NDC 2015 이광영 [야생의 땅: 듀랑고] 전투 시스템 개발 일지NDC 2015 이광영 [야생의 땅: 듀랑고] 전투 시스템 개발 일지
NDC 2015 이광영 [야생의 땅: 듀랑고] 전투 시스템 개발 일지
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
 
빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술
 
게임 인공지능 설계
게임 인공지능 설계게임 인공지능 설계
게임 인공지능 설계
 
정종필 팀장이됐어요(더저용량)
정종필 팀장이됐어요(더저용량)정종필 팀장이됐어요(더저용량)
정종필 팀장이됐어요(더저용량)
 
UE4 Garbage Collection
UE4 Garbage CollectionUE4 Garbage Collection
UE4 Garbage Collection
 
190119 unreal engine c++ 입문 및 팁
190119 unreal engine c++ 입문 및 팁190119 unreal engine c++ 입문 및 팁
190119 unreal engine c++ 입문 및 팁
 

More from TonyCms (8)

Unreal_SubSystem.pptx
Unreal_SubSystem.pptxUnreal_SubSystem.pptx
Unreal_SubSystem.pptx
 
Unreal python
Unreal pythonUnreal python
Unreal python
 
Effective cpp
Effective cppEffective cpp
Effective cpp
 
언리얼을 활용한 오브젝트 풀링
언리얼을 활용한 오브젝트 풀링언리얼을 활용한 오브젝트 풀링
언리얼을 활용한 오브젝트 풀링
 
Unreal perception
Unreal perceptionUnreal perception
Unreal perception
 
About matinee
About matineeAbout matinee
About matinee
 
읽기 좋은 코드가 좋은 코드다.
읽기 좋은 코드가 좋은 코드다.읽기 좋은 코드가 좋은 코드다.
읽기 좋은 코드가 좋은 코드다.
 
Cascade Shadow Map
Cascade Shadow MapCascade Shadow Map
Cascade Shadow Map
 

Unreal_GameAbilitySystem.pptx

  • 2. Remind GameplayTags GameplayTag Container GameplayTag Manager GameplayTag Delegate GameplayAbility Index 01 02 03 04 05 06
  • 3. - GameplayAbilityComponent 초기 세팅 방법 - Gamplay Ability란 무엇인가? - Gamplay Effect란 무엇인가? - AttributeSet이란 무엇인가? 이전 시간에 진행한 내용 01 4
  • 5. - /Engine/Source/Runtime/GameplayTags/Classes/GameplayTagContainer.h - GameplayTagManager에 등록되어 있는 계층 구조를 갖는 이름 - 오브젝트의 상태를 분류하고, 설명하는 데 유용하게 사용되는 구조체 - 오브젝트가 어떤 태그를 들고 있는지, 없는지에 따라 현재 상태를 나 타낼 수 있음. (ex. Stun) Gameplay Tags 01 4
  • 6. - 새 게임플레이 태그 추가하면 계층 구조로 생성됨. - 태그를 비교 또는 확인 하는 함수에서 유용하게 사용 - 기존 bool이나 enum으로 상태를 정의하던 것을 GameplayTags로 대 체 - 태그는 AbilitySystemComponent에 부여하는 것이 일반적 - IGameplayTagAssetInterface 구현을 통해 엑세스 Gameplay Tags 01 4
  • 7. - DefaultGameplayTags.ini에 정의 - Project Setting -> Project -> GameplayTags - Create - Rename - Search for Reference - Delete Gameplay Tags 01 4
  • 10. - C++ 클래스에서 사용하는 GameplayTag는 코드에서 찾아야함. - FGameplayTag::RequestGameplayTag(FName); - GameplayTag 이름을 바꾸면 리디렉션이 생성됨 - 리디렉션을 정리하거나, 생성되지 않도록 하는 습관 필요 Gameplay Tags 01 4
  • 11. - GameplayTag 리디렉션 생성하지 않는 방법 1. 새로운 GameplayTag 생성 2. Search For Reference로 기존 GameplayTag 검색 3. 직접 새로 만든 GameplayTag로 변경 4. 이전 GameplayTag 제거 Gameplay Tags 01 4
  • 12. - LooseGameplayTag 존재 - Replicate 되지 않는 GameplayTag - 직접 관리 필요 - TagMapCount도 직접 관리 필요 - UAbilitySystemComponent::AddLooseGameplayTag() - UAbilitySystemComponent::RemoveLooseGameplayTag() Gameplay Tags 01 4
  • 14. ExactMatch >> Character.Action == Character.Action.Attack ? FALSE Character.Action.Attach == Character.Action.Attack ? TRUE Not ExactMatch >> Character.Action == Character.Action.Attack ? TRUE Character.Action.Attach == Character.Action.Attack ? TRUE Gameplay Tags 01 4
  • 16. - 다수의 GameplayTag는 FGameplayTagContainer에 저장 - TArray<FGameplayTag>를 통해 저장할 수도 있으나, Container 사용 권장 - Tag는 FName을 사용 - Iteration을 위해 TArray<FGameplayTag>를 리턴하는 함수 존재 FGameplayTagContainer 01 4
  • 17. - 저장된 GameplayTag의 인스턴스 수를 저장하는 TagMap 존재 - Container 내부에 GameplayTag가 존재할 수 있지만, TagMapCount 가 0일 수 있음. - HasTag(), HasMatchingTag() 등 유사한 함수들은 TagMapCount도 같이 확인 FGameplayTagCountContainer 01 4
  • 19. - 현재 GameplayTag의 parent 또는 child를 가져올 수 있음 - #include “GameplayTagManager.h” - UGameplayTagManager::Get().FunctionName() - Manager를 통해 비교 시, 상수 문자열 조작 및 비교보다 빠르게 처리 GameplayTagManager 01 4
  • 20. - 클래스 멤버를 노출 할 때 특정 태그만 보이도록 설정 - UPROPERTY(Meta = (Categories =“GameplayCue”)) - 함수 파라미터에 특정 태그만 보이도록 설정 - UFUNCTION(Meta=(GameplayTagFilter=“GameplayCue”)) - GameplayTagContainer 파라미터는 필터링 불가능. GameplayTagManager 01 4
  • 22. - UAbilitySystemComponent는 GameplayTag가 추가/삭제 될 때마다 Delegate를 통해 사용자에게 알림 - 문법은 코드 참조 - EGameplayTagEventType에 따라 이벤트 시점 정함 - NewOrRemoved : 새롭게 추가/완전히 제거 된 경우 - AnyCountChange : TagMapCount 변경 마다 GameplayTag Delegate 01 4
  • 24. - Callback 함수 등록 (Register) - virtual void FunctionName(const FGameplayTag, int32); - tag : 콜백을 호출한 Tag - int32 : 새롭게 갱신 된 TagCount - Delegate는 꼭 등록 후, 해제 필요 (Unregister) GameplayTag Delegate 01 4
  • 27. - GameplayAbility (a.k.a GA) - GA는 게임 플레이 안에서 Actor의 어떤 스킬이나 액션을 할 수 있게 합니다. - 하나 이상의 GA가 한번에 활성화가 된다면, 1. 뛰면서 (sprint) 2. 스킬(Skill)을 쓸 수 있습니다. GameplayAbility 01 4
  • 28. - 이것들을 모두 BP와 C++로 만들 수 있습니다. - GameplayAbility 예 1. 점프 / 달리기 2. 스킬 시전 3. 일정 시간 동안 X번의 공격을 방어할 수 있는 패시브형 Block 4. 포션 사용, 문열기, 재료 수집 GameplayAbility 01 4
  • 29. - GameplayAbility로 구현되지 않아도 되는 예시 1. 기본적인 행동에 대한 인풋(Movement Input) 2. UI와의 상호 작용 기능. - 상점에서 사고 파는 행위 GameplayAbility 01 4
  • 30. - 이것은 절대적인 룰은 아니고, 단지 추천 내용이며, 게임의 디자인에 따라 달라질 수 있습니다. - 기본적인 기능과 함께 Level에 따라 Attribute 또는 GameplayAbility 기능 변경 가능 - 기본적인 행동에 Cost와 CoolDown을 GameplayEffect에 포함 GameplayAbility 01 4
  • 31. - AbilityTask를 통해 일정 시간 기다릴 수 있음. - 이벤트 대기 - Attribute 변경 대기 - 플레이어가 타겟을 지정할 때 까지 대기 - 특정 애니메이션이 출력될 때까지 대기 GameplayAbility 01 4
  • 32. - 모든 GameplayAbility는 ActivateAbility() Override - EndAbility 존재 - GameplayAbility가 완료되거나 취소 될 때 호출 GameplayAbility 01 4
  • 37. - GameplayAbility BP 내부에서 각종 태그 설정 가능 GameplayAbility 01 4
  • 38. 참고 자료 05 27 - 언리얼 공식 문서 - Tranek Github (비공식이지만, 꽤 방대한 분량 및 Contributors 보유) - GameplayAbilitySystem 튜토리얼 영상